?? ecuadfilter.text
字號:
用C語言實現數字濾波
2008年11月26日 星期三 15:56
在工業過程控制系統中,由于被控對象的環境比較惡劣,干擾源比較多,儀器、儀表采集的信息常會受到干擾,所以在模擬系統中,為了消除干擾,常采用RC濾波電路,而在由工業控制計算機組成的自動檢測系統中,為了提高采樣的可靠性,減少虛假信息的影響,常常采用數字濾波的方法。
數字濾波的方法有很多種,可以根據不同的測量參數進行選擇。下面給出幾種常用的數字濾波方法的C語言函數,這些函數有一定的通用性,用Turbo C 2.0編制而成,在研華IPC-610/386機上均編譯通過,適用于PC機及其兼容機。
1. 程序判數濾波 采樣的信號,如因常受到隨機干擾傳感器不穩定而引起嚴重失真時,可以采用此方法。方法是:根據生產經驗確定兩交采樣允許的最大偏差△×,若先后兩次采樣的信號相減數值大于△×,表明輸入的是干擾信號,應該去掉;用上次采樣值作為本次采樣值,若小于、等于△×表明沒有受到干擾,本次采樣值效。該方法適用于慢變化的物理參數的采樣,如溫度、物理位置等測量系統。
程序判斷濾波的C程序函數如下:
float program_detect_filter(float old_new_value[], float X)
{
float sample_value;
if (fabs(old_new_value[1]_old_new_value[0])>X)
sample_value=old_new_value[0];
else
sample_value=old_new_value[1];
retrun(sample_value);
}
函數調用需一個一維的兩個元素的數組(old_new_value[2],用于存放上次采樣值(old_new_value[0],)和本次采樣值(old_new_value[1],),函數中sample_value表示有效采樣值,X表示根據根據經驗確定的兩次采樣允許的最大偏差△×。
2、中值濾波
中值濾波是對某一參數連續輸入N次(一般N取奇數),從中選擇一個中間值作為本次采樣值,若變量變化比較緩慢,采用此方法效果比較好,但對快速變化過程的參數,如流量、自然伽瑪等,則不宜采用。
中值濾波的C程序函數如下:
float middle_filter(float middle_value [] , intcount)
{
float sample_value, data;
int i, j;
for (i=1; i for(j=count-1; j>=i,--j){
if(middle_value[j-1]=middle_value[j]{
data=middle_value[j-1];
middle_value[j-1]=middle_value[j]
middle_value[j]=data;
}
}
sample_value=middle_value(count-1)/2];
return(sample_value);
}
函數假設對某一參數連續采樣3次,若多次采樣,可 對該函數稍作修改即可。3次采樣值存儲在數組middle_value[3],其中Sample-value表示有效采樣值,count表示連續采樣次數。
3、滑動算術平均值濾波
滑動算術平均值濾波是設一循環隊列,依順序存放N次采樣數據,每次數據采集時,先將放在隊列中第一個最早采集的數據丟掉,再把新數據放入隊尾,然后求包括新數據在內的N個數據的算術平均值,便得到該次采樣的有效數據。該方法主要用于對壓力、流量等周期脈動的采樣值進行平滑加工處理。
滑動算術平均值濾波C程序函數如下:
float move_average_filtaer(float data_buf[], int count)
{
float sample_vaue,data=0;
int i;
for (i=0;i data+=data_buf[i];
sample_value="/blog/data/count;
return(sample_value;
}
函數假設順序存放5次采樣數據的數據緩沖區data_buf[5],對于多于5次的滑動算術平均濾波,只需對該函數稍作修改即可,其中sample_value表示本次采樣的有效數據,count表示數據有樣次數。
4.滑動加權平均值濾波滑動加權平均濾波是設一個數據緩沖區依順序存放N次采樣數據,每采進一個新數據,就將最先采集的數據丟掉,而后求包括新數據在內的N個數據的加權平均值,便得到該次采樣的有效數據。該方法對脈沖性干擾的平滑作用尚不理想,不適用于脈沖性干擾比較嚴重的場合。
滑動加權平均值濾波的C程序函數如下:
floa" move_times_filter(float data _buf [])
{
float sample_value;
float filter_k[3]={0.3,0.2,0.15》;
sample_value=filter_k[0]*data_buf[2]+filter_k[1]*(data_buf[1]
+data_buf[3])+filter_k[2]*(data_buf[0]+data_buf[4;
return(sample_value);
}
函數假設依次存放5次采樣數據的數據緩沖區data_buf[5],對于多于5次的滑動加權平均濾波,只需對該函數稍作修改即可,其中數據組filter_k[3]表示加權系數,這三個系數的關系為filter_k[0]+2*filter_k[1]+2*filter_k[2]=1,本次采樣的有效數據用sample_value表示。
5、防脈沖干擾平均值濾波
防脈沖干擾平均值濾波是連續進行N次采樣,去掉其中最大值和最小值,然后求剩下的N-2個數據的平均值,作為本次采樣的有效值。該方法適用于變量跳變比較嚴重的場合。這種濾波也應用邊采樣邊計算的方法。
float max_min_chioce(float x_buffer[],int number
{
int max_value, min_value;
float sample_value=0;
int i;
max_value=x_buffer[0];
min_value=x_buffer[0];
for(i=1;i<6,i++){
if(x_buffer[i]>max_value)max_value=x_buffer[i];
if(x_buffer[i]< min_value) min_value=x_buffer[i];
for(i=1;i<6,i++)
sample_value=(sample_value-max_value-min_value)/(number-2);
return(sample_value);
}
函數假設存放連續進行5次采樣的數據緩沖區data_buf[5],對于多于5次的防脈沖干擾平均值濾波,只需對該函數稍作修改即可,其中Sample_value表示本次采樣的有效數據,number表示連續進行的采樣次數。
6、低通數字濾波
低通濾波也稱一階滯后濾波,方法是第N次采樣后濾波結果輸出值是(1-a)乘第N次采樣值加a乘上次濾波結果輸出值。可見a<<1。該方法適用于變化過程比較慢的參數的濾波的C程序函數如下:
float low_filter(float low_buf[])
{
float sample_value;
float X=0.01;
sample_value=(1_X)*low_buf[1]+X*low buf[0];
retrun(sample_value);
}
函數假設求第2次采樣后濾波結果輸出值sampe_valeu,數組low_buf[2]表示存放上次濾波結果輸出值*low_buf[0])和本次采樣值(low_buf[1]),X表示a。
為方便以上幾種濾波函數的理解,下面給出調用以上函數的程序例。
#i nclude
#i nclude
#i nclude
main()
{
folat old_new_buf[2]={1.2,2.6};
float middle_value[3]={20,12,18};
float data_average_buf[5]={10,20,20,10,10};
float data_times_buf[5]={1.4,1.5,1.3,1.2,1.0};
float data_max_min_buf[5]={1.2,80,1.4,0.2,1.3};
foat low_buf[2]={1.2,2.0};
float xx;
xx=program_detect_filter(old_new_buf,1.0};
printf("The program detect filter value is:%f\n",xx);
xx=middle_filter (middle_value, 3);
printf("The middle filter value is:%f\n:,xx);
xx=move_avergae_filter(data_avergae_buf,5);
printf("the mover average filter value is:%f\n",xx);
xx=move_times_filter(data_time_fud);
printf("The move times filter value is:%f\n",xx);
xx=max_min_choice(data_max_min_buf,5);
printf("The max-min filter value is:%f\n",xx);
xx=low_filter(low_buf);
printf("The low filter value is:%f\n",xx);
}
運行執行程序,屏幕顯示:
The program detect filter value is: 1.200000
The middle filter value is:18.000000
The move average filter value is:14.000000
The move times filter value is:1.310000
The max_min filter value is:1.366666
The low filter value is:1.992000
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -