11種軟體濾波方法的示例程式
假定從8位ad中讀取資料(如果是更高位的ad可定義資料型別為int),子程式為get_ad();
1、限副濾波
/* a值可根據實際情況調整
value為有效值,new_value為當前取樣值
濾波程式返回有效的實際值 */
#define a 10
char value;
char filter()
char new_value;
new_value = get_ad();
if ( ( new_value - value > a ) || ( value - new_value > a )
return value;
return new_value;
2、中位值濾波法
/* n值可根據實際情況調整
排序採用冒泡法*/
#define n 11
char filter()
char value_buf[n];
char count,i,j,temp;
for ( count=0;count
value_buf[count] = get_ad();
delay();
for (j=0;j
for (i=0;i
if ( value_buf>value_buf[i+1] )
temp = value_buf;
value_buf = value_buf[i+1];
value_buf[i+1] = temp;
return value_buf[(n-1)/2];
3、算術平均濾波法
#define n 12
char filter()
int sum = 0;
for ( count=0;count
sum + = get_ad();
delay();
return (char)(sum/n);
4、遞推平均濾波法(又稱滑動平均濾波法)
#define n 12
char value_buf[n];
char i=0;
char filter()
char count;
int sum=0;
value_buf[i++] = get_ad();
if ( i == n ) i = 0;
for ( count=0;count
sum = value_buf[count];
return (char)(sum/n);
5、中位值平均濾波法(又稱防脈衝干擾平均濾波法)
#define n 12
char filter()
char count,i,j;
char value_buf[n];
int sum=0;
for (count=0;count
value_buf[count] = get_ad();
delay();
for (j=0;j
for (i=0;i
if ( value_buf>value_buf[i+1] )
temp = value_buf;
value_buf = value_buf[i+1];
value_buf[i+1] = temp;
for(count=1;count
sum += value[count];
return (char)(sum/(n-2));
6、限幅平均濾波法
略 參考子程式1、3
7、一階滯後濾波法
/* 為加快程式處理速度假定基數為100,a=0~100 */
#define a 50
char value;
char filter()
char new_value;
new_value = get_ad();
return (100-a)*value + a*new_value;
8、加權遞推平均濾波法
/* coe陣列為加權係數表,存在程式儲存區。*/
#define n 12
char code coe[n] = ;
char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;
char filter()
char count;
char value_buf[n];
int sum=0;
for (count=0,count
value_buf[count] = get_ad();
delay();
for (count=0,count
sum += value_buf[count]*coe[count];
return (char)(sum/sum_coe);
9、消抖濾波法
#define n 12
char filter()
char count=0;
char new_value;
new_value = get_ad();
while (value !=new_value);
count++;
if (count>=n) return new_value;
delay();
new_value = get_ad();
return value;
10、限幅消抖濾波法
略 參考子程式1、9
11、iir濾波例子
int bandpassfilter4(int inputad4)
int returnvalue;
int ii;
reslo=0;
reshi=0;
macs=*pdelin;
op2=1068; //filtercoeff4[4];
macs=*(pdelin+1);
op2=8; //filtercoeff4[3];
macs=*(pdelin+2);
op2=-2001;//filtercoeff4[2];
macs=*(pdelin+3);
op2=8; //filtercoeff4[1];
macs=inputad4;
op2=1068; //filtercoeff4[0];
macs=*pdelou;
op2=-7190;//filtercoeff4[8];
macs=*(pdelou+1);
op2=-1973; //filtercoeff4[7];
macs=*(pdelou+2);
op2=-19578;//filtercoeff4[6];
macs=*(pdelou+3);
op2=-3047; //filtercoeff4[5];
*p=reslo;
*(p+1)=reshi;
mytestmul<<=2;
returnvalue=*(p+1);
for (ii=0;ii<3;ii++)
delayinput[ii]=delayinput[ii+1];
delayoutput[ii]=delayoutput[ii+1];
delayinput[3]=inputad4;
delayoutput[3]=returnvalue;
// if (returnvalue<0)
// returnvalue=-returnvalue;
return returnvalue;
c語言 算術平均濾波法 算術平均濾波C程式
檔名 arithmeticfilter.c 功能描述 算術平均濾波,乙個週期內取樣 n次資料,取n 次取樣值的算術平均值做為這個週期的取樣值 include define uchar unsigned char define uint unsigned int 取樣次數 define n 4 次取樣...
c語言 算術平均濾波法 常見的濾波演算法 C語言
說明 假設從8位ad中讀取資料 若是更高位的ad,可將資料型別定義為int 子程式為get ad 一 限幅濾波法 優點 能有效克服因偶然因素引起的脈衝干擾。缺點 無法抑制那種週期性的干擾,且平滑度差。1 限幅濾波 a值可根據實際情況調整 value為有效值,new value為當前取樣值 濾波程式返...
c語言 算術平均濾波法 C語言十大濾波演算法
限幅濾波法 函式名稱 amplitudelimiterfilter 限幅濾波法 優點 能有效克服因偶然因素引起的脈衝干擾 缺點 無法抑制那種週期性的干擾,且平滑度差 說明 1 呼叫函式 getad 該函式用來取得當前值 2 變數說明 value 最近一次有效取樣的值,該變數為全域性變數 newval...