信號采集是非常常見的需求,我們也總是希望采集到的數(shù)據(jù)是純凈而真實的,但這只是我們的希望。環(huán)境中存在太多的干擾信號,為了讓我們得到的數(shù)據(jù)盡可能地接近實際值,我們需要降低這些干擾信號的影響,于是就有了濾波器的用武之地。這里我們討論的主要是軟件實現(xiàn)的數(shù)字濾波器,這一篇我們就來討論基于遞推算術(shù)平均算法的帶阻平滑濾波器。
1 、問題的提出
我們已經(jīng)實現(xiàn)了基于算術(shù)平均的遞推算術(shù)平均濾波器。雖然它對周期性干擾和高頻的干擾都有一定的效果,但是對于這種濾波器其靈敏度和濾波效果很難同時達到較好的效果。一般來說,當N值較小時,靈敏度會增高但濾波效果則不太理想;當N值較大時,濾波效果會比較好,但靈敏度會受到影響。所以我們希望能找到一種方法,讓靈敏度和濾波效果都能有較好的表現(xiàn)。
關于這個問題,我們先來分析一下。一般來說,不管是周期性干擾還是噪聲干擾都是在一定的范圍內(nèi)對數(shù)據(jù)造成影響。不會出現(xiàn)很大幅度的數(shù)據(jù)差異?;谶@一點我們可以考慮對比本次采集與上次輸出之間的偏差值,如果偏差值大于一定的限值則我們認為是數(shù)據(jù)發(fā)生了較大變化,遠大于干擾造成的影響,干擾可以忽略,所以我們直接對數(shù)據(jù)進行更新。當數(shù)據(jù)偏差處于一定的變化范圍之內(nèi)時,我們認為是處于穩(wěn)定的范圍內(nèi),這時干擾造成的影響于數(shù)據(jù)的變化不能忽略,我們需要采用濾波。具體如圖所示:

其中HL和LL就是我們之間的范圍就是可能干擾不能忽略的范圍;而大于HL的部分我們認為采集數(shù)據(jù)變化遠超干擾的影響,忽略干擾提高靈敏度;而小于LL的部分說明干擾造成的影響很小,在允許的誤差范圍之內(nèi)或者說在數(shù)據(jù)的正常波動范圍之內(nèi),我們也不需要濾波。
我們在數(shù)據(jù)的變化大于干擾所能引起的數(shù)據(jù)差異時,選擇不濾波而是快速更新數(shù)據(jù)以提高靈敏度??墒侨绻幸粋€偶然的脈沖干擾出現(xiàn)時,這種操作方式則會導致系統(tǒng)失效,所以我們必須引入消抖操作。當連續(xù)出現(xiàn)多個值都是大范圍變化時,我們認為是數(shù)據(jù)的正常變化,否則我們認為是偶然的脈沖干擾造成的。
2 、算法設計
我們已經(jīng)描述了在不同的偏差區(qū)間對采集數(shù)據(jù)采取不同處理方式的辦法。具體怎么設計這一濾波算法呢?首先我們需要根據(jù)經(jīng)驗或者基于對被控對象的判斷來確定HL和LL的范圍,這樣在不同范圍內(nèi)采取不同的處理方式的做法才能達到良好的效果。
我們先來看偏差處于HL和LL之間時該怎么處理。同樣需要定義一個長度為N的數(shù)據(jù)隊列。和前一篇中所說的一樣,當采集到一個新的數(shù)據(jù)時,用這個新的數(shù)據(jù)替換掉最老的數(shù)據(jù)。并且將數(shù)據(jù)指針指向下一次需要替換掉的最老數(shù)據(jù)。然后使用隊列中的數(shù)據(jù)去算術(shù)平均值而得到最新的輸出數(shù)據(jù),具體隊列如下:

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

但是偏差落在大于HL和小于LL的范圍內(nèi)并不能直接更新數(shù)據(jù)隊列的全部數(shù)據(jù),因為可能是偶然性的脈沖干擾,我們需要作消抖處理。我們判斷如果連續(xù)多少個的采集數(shù)據(jù)均落在相應的區(qū)間,我們就認為不是偶然的脈沖干擾。這是我們就更新隊列的全部數(shù)據(jù)。
3 、代碼實現(xiàn)
我們已經(jīng)設計了帶阻區(qū)間濾波的相關算法,接下來我們來考慮如何實現(xiàn)這一濾波器。同樣的,我們需要定義一個濾波器對象然后基于這一對象實現(xiàn)相應的濾波器操作。
我們先來分析一下,首先濾波器對象需要獲取當前采集到的數(shù)據(jù)值;同時我們?yōu)榱藢崿F(xiàn)對N個數(shù)據(jù)的遞推平均就需要有一個存儲這N個數(shù)的隊列;我們需要記錄最新的數(shù)據(jù)硬件存儲到哪個位置就需要一個位置指針;同時我們也需要知道N的大小,所以我們將它們都定義濾波器對象的屬性。平滑濾波的過程必須要計算算術(shù)平均值,而遞推算術(shù)平均則是在每次采集一個數(shù)據(jù)之時都計算平均值,可是如果N值較大時,就會存在大量的重復計算。我們考慮到上一次采樣的平均值已經(jīng)得到,我們將其記錄下來的話就可以用最新采集的數(shù)據(jù)替換掉最老的數(shù)據(jù),從而得到新的平均值,所以我們將上一時間的輸出值記錄下來作為對象的一個屬性。除此之外,我們還需要知道濾波器的限制區(qū)間,即HL和LL,所以我們將采集數(shù)據(jù)所對應的量程范圍、上限(HL)、下限(LL)比例均作為對象的屬性。同時為了實現(xiàn)消抖,我們需要記錄數(shù)據(jù)大幅變化的持續(xù)數(shù)及確認消抖的最大數(shù)值,這兩個也作為對象的屬性。根據(jù)以上分析我們可定義濾波器對象類型為:
1 /*定義平滑濾波對象類型*/
2 typedef struct FilterObject{
3 float newValue; //最新測量值
4 float lastValue; //上一個輸出值
5 float *buffer; //數(shù)據(jù)緩存區(qū)
6 int16_t position; //寫操作位置指針
7 uint16_t bufCount; //濾波的數(shù)量
8 uint16_t delayCount; //延遲計數(shù)
9 uint16_t delayLimit; //延遲限值
10 float rangeLimit; //量程范圍
11 float upperRario; //比例下限
12 float lowerRatio; //比例下限
13 }FilterObjectType;
我們已經(jīng)獲得了濾波器對象,接下來將基于這一對象實現(xiàn)相應的濾波器功能。我們要對比當前的采集值與上一個輸出值的比較,根據(jù)它們的偏差絕對值來決定采取怎樣的處理方式。處理流程如下:

我們通過判斷新值與前一個值的偏差來決定所要進行的操作,當偏差處于HL和LL之間時做濾波處理,否則不做濾波處理。根據(jù)以上的分析及流程圖我們可以設計帶阻平滑濾波器的代碼為:
1 /* 帶阻平滑濾波器,對指定區(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 、應用總結(jié)
我們實現(xiàn)了基于算術(shù)平均的帶阻平滑濾波器。該濾波器對周期性干擾和小幅的噪聲干擾均有較好的效果。而且通過區(qū)間濾波,在數(shù)據(jù)快速變化時也提高了系統(tǒng)的靈敏度。對于干擾對數(shù)據(jù)的影響處于一定范圍內(nèi)的系統(tǒng)有很好的效果。
這一濾波器有效的前提是基于干擾的幅度并不是很大的前提而實現(xiàn)的。如果系統(tǒng)存在較大幅度的脈沖干擾,在這種脈沖干擾的出現(xiàn)頻率較低時,消抖操作能夠很好的去除這種偶然性干擾。但如果出現(xiàn)持續(xù)性的高頻大幅脈沖干擾,這一濾波器將變得無能為力。
對于限值區(qū)間HL和LL的取值一般只能根據(jù)采集系統(tǒng)的特點或者工程師的經(jīng)驗來判斷,這個取值決定了濾波器的濾波效果。
-
濾波器
+關注
關注
162文章
8477瀏覽量
186364 -
數(shù)字濾波器
+關注
關注
4文章
300瀏覽量
48412 -
算法設計
+關注
關注
0文章
24瀏覽量
9389
發(fā)布評論請先 登錄
基于算術(shù)平均算法的中值數(shù)字濾波器設計
基于算術(shù)平均算法的限幅濾波器設計
十一種通用濾波算法(一)
AD采集濾波算法
加權(quán)遞推平均濾波法是什么
十一個經(jīng)典的濾波算法的介紹和示例程序詳細資料免費下載
濾波算法有哪些十大濾波算法的資料介紹
單片機有哪些常用濾波算法詳細資料說明
基于遞推算術(shù)平均算法的帶阻平滑濾波器設計
評論