#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 為...