0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于遞推算術(shù)平均算法的帶阻平滑濾波器設(shè)計(jì)

CHANBAEK ? 來(lái)源:木南創(chuàng)智 ? 作者:尹家軍 ? 2022-12-13 17:35 ? 次閱讀

信號(hào)采集是非常常見(jiàn)的需求,我們也總是希望采集到的數(shù)據(jù)是純凈而真實(shí)的,但這只是我們的希望。環(huán)境中存在太多的干擾信號(hào),為了讓我們得到的數(shù)據(jù)盡可能地接近實(shí)際值,我們需要降低這些干擾信號(hào)的影響,于是就有了濾波器的用武之地。這里我們討論的主要是軟件實(shí)現(xiàn)的數(shù)字濾波器,這一篇我們就來(lái)討論基于遞推算術(shù)平均算法的帶阻平滑濾波器。

1 、問(wèn)題的提出

我們已經(jīng)實(shí)現(xiàn)了基于算術(shù)平均的遞推算術(shù)平均濾波器。雖然它對(duì)周期性干擾和高頻的干擾都有一定的效果,但是對(duì)于這種濾波器其靈敏度和濾波效果很難同時(shí)達(dá)到較好的效果。一般來(lái)說(shuō),當(dāng)N值較小時(shí),靈敏度會(huì)增高但濾波效果則不太理想;當(dāng)N值較大時(shí),濾波效果會(huì)比較好,但靈敏度會(huì)受到影響。所以我們希望能找到一種方法,讓靈敏度和濾波效果都能有較好的表現(xiàn)。

關(guān)于這個(gè)問(wèn)題,我們先來(lái)分析一下。一般來(lái)說(shuō),不管是周期性干擾還是噪聲干擾都是在一定的范圍內(nèi)對(duì)數(shù)據(jù)造成影響。不會(huì)出現(xiàn)很大幅度的數(shù)據(jù)差異?;谶@一點(diǎn)我們可以考慮對(duì)比本次采集與上次輸出之間的偏差值,如果偏差值大于一定的限值則我們認(rèn)為是數(shù)據(jù)發(fā)生了較大變化,遠(yuǎn)大于干擾造成的影響,干擾可以忽略,所以我們直接對(duì)數(shù)據(jù)進(jìn)行更新。當(dāng)數(shù)據(jù)偏差處于一定的變化范圍之內(nèi)時(shí),我們認(rèn)為是處于穩(wěn)定的范圍內(nèi),這時(shí)干擾造成的影響于數(shù)據(jù)的變化不能忽略,我們需要采用濾波。具體如圖所示:

其中HL和LL就是我們之間的范圍就是可能干擾不能忽略的范圍;而大于HL的部分我們認(rèn)為采集數(shù)據(jù)變化遠(yuǎn)超干擾的影響,忽略干擾提高靈敏度;而小于LL的部分說(shuō)明干擾造成的影響很小,在允許的誤差范圍之內(nèi)或者說(shuō)在數(shù)據(jù)的正常波動(dòng)范圍之內(nèi),我們也不需要濾波。

我們?cè)跀?shù)據(jù)的變化大于干擾所能引起的數(shù)據(jù)差異時(shí),選擇不濾波而是快速更新數(shù)據(jù)以提高靈敏度??墒侨绻幸粋€(gè)偶然的脈沖干擾出現(xiàn)時(shí),這種操作方式則會(huì)導(dǎo)致系統(tǒng)失效,所以我們必須引入消抖操作。當(dāng)連續(xù)出現(xiàn)多個(gè)值都是大范圍變化時(shí),我們認(rèn)為是數(shù)據(jù)的正常變化,否則我們認(rèn)為是偶然的脈沖干擾造成的。

2 、算法設(shè)計(jì)

我們已經(jīng)描述了在不同的偏差區(qū)間對(duì)采集數(shù)據(jù)采取不同處理方式的辦法。具體怎么設(shè)計(jì)這一濾波算法呢?首先我們需要根據(jù)經(jīng)驗(yàn)或者基于對(duì)被控對(duì)象的判斷來(lái)確定HL和LL的范圍,這樣在不同范圍內(nèi)采取不同的處理方式的做法才能達(dá)到良好的效果。

我們先來(lái)看偏差處于HL和LL之間時(shí)該怎么處理。同樣需要定義一個(gè)長(zhǎng)度為N的數(shù)據(jù)隊(duì)列。和前一篇中所說(shuō)的一樣,當(dāng)采集到一個(gè)新的數(shù)據(jù)時(shí),用這個(gè)新的數(shù)據(jù)替換掉最老的數(shù)據(jù)。并且將數(shù)據(jù)指針指向下一次需要替換掉的最老數(shù)據(jù)。然后使用隊(duì)列中的數(shù)據(jù)去算術(shù)平均值而得到最新的輸出數(shù)據(jù),具體隊(duì)列如下:

若是偏差落在大于HL和小于LL的范圍內(nèi),則不需要濾波,該如何處理呢?我們一樣需要數(shù)據(jù)隊(duì)列,因?yàn)閿?shù)據(jù)隨時(shí)有可能回歸到需要濾波的范圍,我們必須每次的更新數(shù)據(jù)隊(duì)列即使沒(méi)有濾波需求。這時(shí)的更新數(shù)據(jù)方式不同,我們將整個(gè)隊(duì)列的數(shù)據(jù)都替換為新數(shù)據(jù),但我們不更新數(shù)據(jù)指針。輸出數(shù)據(jù)就是本次采集的數(shù)據(jù),具體的數(shù)據(jù)隊(duì)列如下:

但是偏差落在大于HL和小于LL的范圍內(nèi)并不能直接更新數(shù)據(jù)隊(duì)列的全部數(shù)據(jù),因?yàn)榭赡苁桥既恍缘拿}沖干擾,我們需要作消抖處理。我們判斷如果連續(xù)多少個(gè)的采集數(shù)據(jù)均落在相應(yīng)的區(qū)間,我們就認(rèn)為不是偶然的脈沖干擾。這是我們就更新隊(duì)列的全部數(shù)據(jù)。

3 、代碼實(shí)現(xiàn)

我們已經(jīng)設(shè)計(jì)了帶阻區(qū)間濾波的相關(guān)算法,接下來(lái)我們來(lái)考慮如何實(shí)現(xiàn)這一濾波器。同樣的,我們需要定義一個(gè)濾波器對(duì)象然后基于這一對(duì)象實(shí)現(xiàn)相應(yīng)的濾波器操作。

我們先來(lái)分析一下,首先濾波器對(duì)象需要獲取當(dāng)前采集到的數(shù)據(jù)值;同時(shí)我們?yōu)榱藢?shí)現(xiàn)對(duì)N個(gè)數(shù)據(jù)的遞推平均就需要有一個(gè)存儲(chǔ)這N個(gè)數(shù)的隊(duì)列;我們需要記錄最新的數(shù)據(jù)硬件存儲(chǔ)到哪個(gè)位置就需要一個(gè)位置指針;同時(shí)我們也需要知道N的大小,所以我們將它們都定義濾波器對(duì)象的屬性。平滑濾波的過(guò)程必須要計(jì)算算術(shù)平均值,而遞推算術(shù)平均則是在每次采集一個(gè)數(shù)據(jù)之時(shí)都計(jì)算平均值,可是如果N值較大時(shí),就會(huì)存在大量的重復(fù)計(jì)算。我們考慮到上一次采樣的平均值已經(jīng)得到,我們將其記錄下來(lái)的話就可以用最新采集的數(shù)據(jù)替換掉最老的數(shù)據(jù),從而得到新的平均值,所以我們將上一時(shí)間的輸出值記錄下來(lái)作為對(duì)象的一個(gè)屬性。除此之外,我們還需要知道濾波器的限制區(qū)間,即HL和LL,所以我們將采集數(shù)據(jù)所對(duì)應(yīng)的量程范圍、上限(HL)、下限(LL)比例均作為對(duì)象的屬性。同時(shí)為了實(shí)現(xiàn)消抖,我們需要記錄數(shù)據(jù)大幅變化的持續(xù)數(shù)及確認(rèn)消抖的最大數(shù)值,這兩個(gè)也作為對(duì)象的屬性。根據(jù)以上分析我們可定義濾波器對(duì)象類型為:

1 /*定義平滑濾波對(duì)象類型*/
 2 typedef struct FilterObject{
 3   float newValue;       //最新測(cè)量值
 4   float lastValue;      //上一個(gè)輸出值
 5   float *buffer;        //數(shù)據(jù)緩存區(qū)
 6   int16_t position;    //寫操作位置指針
 7   uint16_t bufCount;    //濾波的數(shù)量
 8   uint16_t delayCount;  //延遲計(jì)數(shù)
 9   uint16_t delayLimit;  //延遲限值
10   float rangeLimit;     //量程范圍
11   float upperRario;     //比例下限
12   float lowerRatio;     //比例下限
13 }FilterObjectType;

我們已經(jīng)獲得了濾波器對(duì)象,接下來(lái)將基于這一對(duì)象實(shí)現(xiàn)相應(yīng)的濾波器功能。我們要對(duì)比當(dāng)前的采集值與上一個(gè)輸出值的比較,根據(jù)它們的偏差絕對(duì)值來(lái)決定采取怎樣的處理方式。處理流程如下:

我們通過(guò)判斷新值與前一個(gè)值的偏差來(lái)決定所要進(jìn)行的操作,當(dāng)偏差處于HL和LL之間時(shí)做濾波處理,否則不做濾波處理。根據(jù)以上的分析及流程圖我們可以設(shè)計(jì)帶阻平滑濾波器的代碼為:

1 /* 帶阻平滑濾波器,對(duì)指定區(qū)間濾波,返回濾波后的值*/
 2 float BandSmoothingFilter(FilterObjectType *filter)
 3 {
 4   float result=filter->lastValue;
 5  
 6   if(filter->position<0)
 7   {
 8     for(int i=0;i<filter->bufCount;i++)
 9     {
10       filter->buffer[i]=filter->newValue;
11     }
12     filter->position=0;
13     filter->lastValue=filter->newValue;
14   }
15   
16   if(filter->position>=filter->bufCount)
17   {
18     filter->position=0;
19   }
20  
21   if(fabs(filter->newValue-filter->lastValue)>(filter->rangeLimit*filter->upperRario/100))
22   {
23     filter->delayCount+=1;
24     if(filter->delayCount>=filter->delayLimit)
25     {
26       for(int i=0;i<filter->bufCount;i++)
27       {
28         filter->buffer[i]=filter->newValue;
29       }
30       filter->position++;
31       result=filter->newValue;
32       filter->delayCount=0;
33     }
34   }
35   else if(fabs(filter->newValue-filter->lastValue)>=(filter->rangeLimit*filter->lowerRatio/100))
36   {
37     result=filter->lastValue-filter->buffer[filter->position]/filter->bufCount;
38    
39     result=result+filter->newValue/filter->bufCount;
40    
41     filter->buffer[filter->position++]=filter->newValue;
42    
43     filter->delayCount=0;
44   }
45   else
46   {
47     filter->delayCount+=1;
48     if(filter->delayCount>=filter->delayLimit)
49     {
50       for(int i=0;i<filter->bufCount;i++)
51       {
52         filter->buffer[i]=filter->newValue;
53       }
54       filter->position++;
55       result=filter->newValue;
56       filter->delayCount=0;
57     }
58   }
59   filter->lastValue=result;
60   filter->newValue=0.0;
61   return result;
62 }

4 、應(yīng)用總結(jié)

我們實(shí)現(xiàn)了基于算術(shù)平均的帶阻平滑濾波器。該濾波器對(duì)周期性干擾和小幅的噪聲干擾均有較好的效果。而且通過(guò)區(qū)間濾波,在數(shù)據(jù)快速變化時(shí)也提高了系統(tǒng)的靈敏度。對(duì)于干擾對(duì)數(shù)據(jù)的影響處于一定范圍內(nèi)的系統(tǒng)有很好的效果。

這一濾波器有效的前提是基于干擾的幅度并不是很大的前提而實(shí)現(xiàn)的。如果系統(tǒng)存在較大幅度的脈沖干擾,在這種脈沖干擾的出現(xiàn)頻率較低時(shí),消抖操作能夠很好的去除這種偶然性干擾。但如果出現(xiàn)持續(xù)性的高頻大幅脈沖干擾,這一濾波器將變得無(wú)能為力。

對(duì)于限值區(qū)間HL和LL的取值一般只能根據(jù)采集系統(tǒng)的特點(diǎn)或者工程師的經(jīng)驗(yàn)來(lái)判斷,這個(gè)取值決定了濾波器的濾波效果。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 濾波器
    +關(guān)注

    關(guān)注

    160

    文章

    7705

    瀏覽量

    177489
  • 數(shù)字濾波器
    +關(guān)注

    關(guān)注

    4

    文章

    267

    瀏覽量

    46968
  • 算法設(shè)計(jì)
    +關(guān)注

    關(guān)注

    0

    文章

    24

    瀏覽量

    8130
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于遞推算術(shù)平均算法平滑濾波器設(shè)計(jì)

    濾波器的用武之地。這里我們討論的主要是軟件實(shí)現(xiàn)的數(shù)字濾波器,這一篇我們就來(lái)討論基于遞推算術(shù)平均算法平滑
    的頭像 發(fā)表于 12-13 17:33 ?1568次閱讀
    基于<b class='flag-5'>遞推算術(shù)平均</b><b class='flag-5'>算法</b>的<b class='flag-5'>平滑</b><b class='flag-5'>濾波器</b>設(shè)計(jì)

    基于遞推算術(shù)平均算法的階進(jìn)平滑濾波器設(shè)計(jì)

    濾波器的用武之地。這里我們討論的主要是軟件實(shí)現(xiàn)的數(shù)字濾波器,這一篇我們就來(lái)討論基于遞推算術(shù)平均算法的階進(jìn)平滑
    的頭像 發(fā)表于 12-13 17:37 ?1088次閱讀
    基于<b class='flag-5'>遞推算術(shù)平均</b><b class='flag-5'>算法</b>的階進(jìn)<b class='flag-5'>平滑</b><b class='flag-5'>濾波器</b>設(shè)計(jì)

    基于算術(shù)平均算法的中值數(shù)字濾波器設(shè)計(jì)

    在信號(hào)采集系統(tǒng)中,除了我們感興趣的數(shù)據(jù)外,難免會(huì)有一些來(lái)自于環(huán)境的干擾信號(hào)。但我們總希望我們得到的數(shù)據(jù)是純凈而真實(shí)的,為了達(dá)到這個(gè)目標(biāo),我們不得不想辦法去除這些干擾信號(hào),于是濾波器就成為我們必不可少的幫手。這一篇我們就來(lái)討論如何通過(guò)軟件實(shí)現(xiàn)基于中值平均
    的頭像 發(fā)表于 12-13 17:41 ?1181次閱讀
    基于<b class='flag-5'>算術(shù)平均</b><b class='flag-5'>算法</b>的中值數(shù)字<b class='flag-5'>濾波器</b>設(shè)計(jì)

    基于算術(shù)平均算法的限幅濾波器設(shè)計(jì)

    通過(guò)AD采集數(shù)據(jù)時(shí),我們總是希望采集到的數(shù)據(jù)是純凈而真實(shí)的,而實(shí)際上環(huán)境中存在太多的干擾信號(hào),為了讓我們得到的數(shù)據(jù)盡可能地接近實(shí)際值,我們需要降低這些干擾信號(hào)的影響。所以軟件實(shí)現(xiàn)的數(shù)字濾波器應(yīng)運(yùn)而生,這一篇我們就來(lái)討論基于中值算術(shù)平均
    的頭像 發(fā)表于 12-13 17:47 ?1215次閱讀
    基于<b class='flag-5'>算術(shù)平均</b><b class='flag-5'>算法</b>的限幅<b class='flag-5'>濾波器</b>設(shè)計(jì)

    十大濾波算法程序大全

    1、限幅濾波法2、中位值濾波法3、算術(shù)平均濾波法4、遞推平均
    發(fā)表于 07-29 16:17

    史上最全濾波算法(Arduino編程)

    、算術(shù)平均濾波法4、遞推平均濾波法(又稱滑動(dòng)平均濾波
    發(fā)表于 06-16 10:51

    轉(zhuǎn):史上最全濾波算法(Arduino編程)

    、算術(shù)平均濾波法4、遞推平均濾波法(又稱滑動(dòng)平均濾波
    發(fā)表于 07-28 11:08

    十一種通用濾波算法(一)

    引起的波動(dòng)干擾對(duì)溫度、液位的變化緩慢的被測(cè)參數(shù)有良好的濾波效果C、缺點(diǎn):對(duì)流量、速度等快速變化的參數(shù)不宜3、算術(shù)平均濾波法A、方法:連續(xù)取N個(gè)采樣值進(jìn)行算術(shù)平均運(yùn)算N值較大時(shí):信號(hào)
    發(fā)表于 09-12 23:10

    AD采集濾波算法

    的被測(cè)參數(shù)有良好的濾波效果 C、缺點(diǎn):對(duì)流量、速度等快速變化的參數(shù)不宜3、算術(shù)平均濾波法 A、方法:連續(xù)取N個(gè)采樣值進(jìn)行算術(shù)平均運(yùn)算N值較大時(shí):信號(hào)
    發(fā)表于 04-30 03:43

    算術(shù)平均濾波法的優(yōu)缺點(diǎn)

    算術(shù)平均數(shù)能較好的過(guò)濾隨機(jī)干擾(使正負(fù)干擾的期望相互抵消)
    發(fā)表于 07-18 06:33

    分享幾種較簡(jiǎn)單而常用的濾波算法

    法)**二、中位值濾波法****三、算術(shù)平均濾波法****四、遞推平均濾波法****五、中位值
    發(fā)表于 12-21 06:10

    加權(quán)遞推平均濾波法是什么

    加權(quán)遞推平均濾波法是對(duì)遞推平均濾波法的改進(jìn),即不同時(shí)刻的數(shù)據(jù)加以不同的權(quán)。通常是,越接近現(xiàn)時(shí)刻的
    發(fā)表于 01-11 07:01

    十一個(gè)經(jīng)典的濾波算法的介紹和示例程序詳細(xì)資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是十一個(gè)經(jīng)典的濾波算法的詳細(xì)資料免費(fèi)下載主要內(nèi)容包括了:1、限幅濾波法(又稱程序判斷濾波法)2、中位值濾波法3、
    發(fā)表于 11-06 19:35 ?20次下載
    十一個(gè)經(jīng)典的<b class='flag-5'>濾波</b><b class='flag-5'>算法</b>的介紹和示例程序詳細(xì)資料免費(fèi)下載

    濾波算法有哪些十大濾波算法的資料介紹

    本文檔的主要內(nèi)容詳細(xì)介紹的是十大濾波算法的資料介紹包括了:限幅濾波法(程序判斷濾波法),中位值濾波法,
    發(fā)表于 01-04 08:00 ?28次下載
    <b class='flag-5'>濾波</b><b class='flag-5'>算法</b>有哪些十大<b class='flag-5'>濾波</b><b class='flag-5'>算法</b>的資料介紹

    單片機(jī)有哪些常用濾波算法詳細(xì)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)有哪些常用濾波算法詳細(xì)資料說(shuō)明包括了:1、限幅濾波法,2、中位值濾波法,3、算術(shù)平均
    發(fā)表于 07-29 17:36 ?4次下載
    單片機(jī)有哪些常用<b class='flag-5'>濾波</b><b class='flag-5'>算法</b>詳細(xì)資料說(shuō)明