嵌入式演算法3 滑動平均濾波法

2021-10-25 03:01:55 字數 1656 閱讀 8526

算數平均濾波需要多次取樣後才能得出乙個有效值,如果被檢測量變化較快,多次取樣後才輸出一次有效值,表現就是系統反應遲鈍。將當前取樣值與之前連續的歷史取樣值進行平均,這樣每次取樣結束即可得出有效值。因為參與計算的歷史值個數固定且內容不斷前移覆蓋更新,類似滑動的資料塊視窗,因此成為滑動平均濾波演算法。

vn-5

vn-4

vn-3

vn-2

vn-1

vnvn-4

vn-3

vn-2

vn-1

vnvn+1

假如視窗為6,即每次使用最近5個歷史值與當前最新值求算數平均值,輸出乙個有效值;下個週期再覆蓋最早時間的點做同樣操作。類似環形陣列,求最近6個值的平均值。

#define sum_win_size  6

int history[sum_win_size]

;//歷史值,其中history[sum_win_size-1]為最近的記錄

int buff_init=0;

//前sum_win_size-1次填充後才能開始輸出

int index=0;

//環形陣列可放資料的位置

intfilter

(int current)

return

0xffff

;//當前無法輸出,做個特殊標記區分

}else

for(i=

0;i)return sum/sum_win_size;

}}

滑動平均濾波,輸出的結果與先前歷史記錄有關,假如故意突然改變物理量,需要幾個取樣週期,輸出結果才逐漸接近真實值,實際一般情況下,越新的資料權重越大,歷史記錄權重應該減少,對滑動視窗中的資料分配不同的加權係數,進行加權平均值。

1/k*vn-5

2/k*vn-4

3/k*vn-3

4/k*vn-2

5/k*vn-1

6/k*vn

每個資料分配不同的加權係數,1/k+2/k +3/k +4/k +5/k +6/k =1。則k=1+2+3+4+5+6

可以簡化所有資料整體乘以k,減少浮點運算。

1*vn-5

2*vn-4

3*vn-3

4*vn-2

5*vn-1

6*vn

最終的加權和再除以k即可。

#define sum_win_size  6

int history[sum_win_size]

;//歷史值,其中history[sum_win_size-1]為最近的記錄

int buff_init=0;

//前sum_win_size-1次填充後才能開始輸出

int index=0;

//環形陣列可放資料的位置

int factor[sum_win_size]=;

//加權係數

int k=21;

//1+2+3+4+5+6

intfilter

(int current)

return

0xffff

;//當前無法輸出,做個特殊標記區分

}else

j=index;

for(i=

0;ireturn sum/k;

}}

嵌入式常用之滑動平均數

算數平均數在n取較大的值時具有實時性不好的特點,針對這一特點採用滑動平均數。滑動平均每一次有新的資料到來時,就會計算一次平均。大概流程就是新的資料到來時,講新資料存入陣列,同時將最舊的那個資料去掉。用pc模擬如下 include include include define n 10 陣列中資料個數...

濾波演算法 遞推平均濾波法

基本方法 採用佇列作為測量資料儲存器,設佇列的長度為n 每進行一次測量,把測量結果放於隊尾,而扔掉原來隊首的乙個資料,這樣在佇列中始終就有n個 最新 的資料。當計算平均值時,只要把佇列中的n個資料進行算數平均,就可得到新的算數平均值。這樣每進行一次測量,就可得到乙個新的算術平均值。其程式如下所示 i...

滑動平均濾波c語言 基本C語言濾波演算法

11種軟體濾波方法的示例程式 假定從8位ad中讀取資料 如果是更高位的ad可定義資料型別為int 子程式為get ad 1 限副濾波 a值可根據實際情況調整 value為有效值,new value為當前取樣值 濾波程式返回有效的實際值 define a 10 char value char filt...