c 演算法學習之常見的6種濾波演算法

2021-08-20 21:35:13 字數 3709 閱讀 7599

#include

#include

using namespace std;

/*********1***********/

const int n_limit = 2;

int value_lim = 50;

/*********2**********/

const int n_mid = 11;

/*********3**********/

const int n_mean = 12;

/*********4**********/

const int n_dtm = 4;

int i_dtm = 0;

int value_buf[n_dtm + 1] = ;

/*********5**********/

const int n_mm = 4;

/*********6**********/

const int n_ldtm = 4;//先限幅濾波幅度在+-4

int value_ldtm = 50;

const int n_lddtm = 5;//再進行遞推濾波

int i_lddtm = 0;

int value_ldtm_buf[n_lddtm + 1] = ;

const int size = 20;

void delay_ms(int intms);//延時函式

int get_data();//模擬取樣資料的函式rand()獲取的隨機數

/********濾波函式*********/

int filter_limit();//限幅濾波器

int filter_mid();//中位值濾波法

int filter_mean();//算術平均濾波法

int filter_dtmean();//遞推平均濾波法

int filter_midmean();//中位值平均濾波法

int filter_limdtm();//限幅平均濾波法

void main()

system("pause");

}/*1.限幅濾波法函式體*/

/*1、限幅濾波法(又稱程式判斷濾波法)

a、方法:

根據經驗判斷,確定兩次取樣允許的最大偏差值(設為a)

每次檢測到新值時判斷:

如果本次值與上次值之差<=a,則本次值有效

如果本次值與上次值之差》a,則本次值無效,放棄本次值,用上次值代替本次值

b、優點:

能有效克服因偶然因素引起的脈衝干擾

c、缺點

無法抑制那種週期性的干擾

平滑度差

*/int filter_limit()

/*2.中位值濾波法函式體*/

/*2、中位值濾波法

a、方法:

連續取樣n次(n取奇數)

把n次取樣值按大小排列

取中間值為本次有效值

b、優點:

能有效克服因偶然因素引起的波動干擾

對溫度、液位的變化緩慢的被測引數有良好的濾波效果

c、缺點:

對流量、速度等快速變化的引數不宜

*/int filter_mid()

cout << endl;

for ( j = 0; j < n_mid -1; j++)}}

cout << "排序後的n_mid次取樣資料是:" << endl;

for (int i = 0; i < n_mid; i++)

return value_buf[(n_mid - 1) / 2];

}/*3.均值濾波法函式體*/

/*3、算術平均濾波法

a、方法:

連續取n個取樣值進行算術平均運算

n值較大時:訊號平滑度較高,但靈敏度較低

n值較小時:訊號平滑度較低,但靈敏度較高

n值的選取:一般流量,n=12;壓力:n=4

b、優點:

適用於對一般具有隨機干擾的訊號進行濾波

這樣訊號的特點是有乙個平均值,訊號在某一數值範圍附近上下波動

c、缺點:

對於測量速度較慢或要求資料計算速度較快的實時控制不適用

比較浪費ram

*/int filter_mean()

cout << "均值為:" << (int)(sum / n_mean) << endl;

return (int)(sum / n_mean);

}/*4.遞推均值濾波法(滑動均值濾波法)函式體*/

/*4、遞推平均濾波法(又稱滑動平均濾波法)

a、方法:

把連續取n個取樣值看成乙個佇列

佇列的長度固定為n

每次取樣到乙個新資料放入隊尾,並扔掉原來隊首的一次資料.(先進先出原則)

把佇列中的n個資料進行算術平均運算,就可獲得新的濾波結果

n值的選取:流量,n=12;壓力:n=4;液面,n=4~12;溫度,n=1~4

b、優點:

對週期性干擾有良好的抑制作用,平滑度高

適用於高頻振盪的系統

c、缺點:

靈敏度低

對偶然出現的脈衝性干擾的抑制作用較差

不易消除由於脈衝干擾所引起的取樣值偏差

不適用於脈衝干擾比較嚴重的場合

比較浪費ram

*/int filter_dtmean()

cout << "均值為:" << (int)(sum / n_dtm) << endl;

return (int)(sum / n_dtm);

}/*5.中位值均值濾波法函式體*/

/*5、中位值平均濾波法(又稱防脈衝干擾平均濾波法)

a、方法:

相當於「中位值濾波法」+「算術平均濾波法」

連續取樣n個資料,去掉乙個最大值和乙個最小值

然後計算n-2個資料的算術平均值

n值的選取:3~14

b、優點:

融合了兩種濾波法的優點

對於偶然出現的脈衝性干擾,可消除由於脈衝干擾所引起的取樣值偏差

c、缺點:

測量速度較慢,和算術平均濾波法一樣

比較浪費ram

*/int filter_midmean()

cout << endl;

for (j = 0; j < n_mm - 1; j++)}}

cout << "去掉最大值和最小值之後的由小到大排序為:" << endl;

for (count = 1; count < n_mm - 1; count++)

cout << endl;

return (int)(sum / (n_mm - 2));

}/*6.限幅平均濾波法函式體*/

/*6、限幅平均濾波法

a、方法:

相當於「限幅濾波法」+「遞推平均濾波法」

每次取樣到的新資料先進行限幅處理,

再送入    佇列進行遞推平均濾波處理

b、優點:

融合了兩種濾波法的優點

對於偶然出現的脈衝性干擾,可消除由於脈衝干擾所引起的取樣值偏差

c、缺點:

比較浪費ram

*/int filter_limdtm()

else

for ( i = 0; i < n_lddtm; i++)

return (int)(sum / n_lddtm);

}int get_data()

void delay_ms(int ms)

}

演算法學習筆記之滑動平均濾波演算法

滑動平均濾波演算法只取樣一次,將一次取樣值和過去的若干次取樣值一起求平均,得到的有效取樣值即可投入使用。如果取n個取樣值求平均,儲存區中必須開闢n個資料的暫存區。每新採集乙個資料便存入暫存區中,同時去掉乙個最老資料,儲存這n個資料始終是最新更新的資料。採用 環型佇列結構 可以方便地實現這種資料存放方...

演算法學習 6

計數排序是假設陣列a中的元素都是在0到k區間內的整數。構建乙個陣列c 0,k 初始化為 1,如果陣列a中的元素互異的話,那麼把a的元素拷貝到c中 c a i a i 然後遍歷c,把非 1的元素依次拷貝到陣列a中即可完成排序。但陣列有元素相等要怎麼處理了。元素互異的做法,還可以是c 0,k 初始化為0...

11種常見的AD濾波演算法

根據經驗判斷,確定兩次取樣允許的最大偏差值 設為 a 每次檢測到新值時判斷 如果本次值與上次值 之差 a,則本次值有效如果本次值與上次值之差 a,則本次值無效,放棄本次值,用上次值代替本次值 能有效克服因偶然因素引起的脈衝干擾 無法抑制那種週期性的干擾平滑度差 a 值可根據實際情況調整value 為...