滤波算法1 .滑动滤波算法限制数据变化的最大值
/*能有效支持偶然波动,不能抑制周期性干扰。 */#定义更改_ max 0.5 int ADC _ data,new_data; int过滤器(void ) if ) (new_data-ADC_data )=chang_max ) adc_data=new_data; 返回ADC _ data; } 2.中值滤波器连续采样n次,n为奇数,从小到大排序,取中间值
/*偶然波动噪声(温度、液位) ()/) )流量、速度等剧烈变化的参数不合适(*/#define N 5 int data[N]; int过滤器(void ) { int i,j; int result_data; for(I=0; iN; I ) data[i]=get_data (; for(j=0; jN-1; j ) for(I=0; iN-j; I () if )数据[ I ]数据[ i1 ] ) { result_data=data[i]; data[i]=data[i 1]; 数据[ I1=result _ data; }}3.在通过算术平均滤波器连续n个采样值进行算术平均运算的n值较大的情况下,信号的平滑度高,灵敏度低
/*适用于对一般具有随机噪声的信号进行滤波,信号在某个数值范围附近上下变动的*/#define N 12 char filter (() { int sum=0; for(intcount=0; 计数; count () { sum =get_ad ); }返回(char ) ) sum/N ); (4)渐进平均滤波器(也称为滑动平均滤波法)将n个连续的采样值视为一个队列,每次有新的数据(先进先出原则)时,舍弃最后的数据,对队列中的n个数据进行算术平均运算
/*对周期性干扰有良好的抑制作用,对平滑度高(()/)偶然性干扰少,脉冲干扰严重时不适用) ram(/#definen5intfilter ) { int adc_data[N] int sum; adc_data[N]=get_adc (; for(intI=0; iN; I ) { adc_data[i]=adc_data[i 1]; sum =adc_data[i]; }返回和/n; )5)中值滤波法“中值滤波(加法)算术平均滤波”,去除最小和最大值,计算N-2个数据的算术平均值。
/*融合两种算法的优点,偶然出现的干扰偏差*//*测量速度慢,RAM*/#define N 12 char filter () { char count,I,j; char value_buf[N]; int sum=0; for (计数=0; 计数; count(value_buf[count]=get_ADC ); for(j=0; jN-1; j ) for(I=0; 合1; I () if ) value_buf[I]value_buf[I1] ) { temp=value_buf[i]; value_buf[i]=value_buf[i 1]; value_buf[i 1]=temp; }}for(count=1; 计数- 1; 计数(sum=value _ buf [ count ]; 返回(char ) ) sum/(n-2 ); )6)对限幅平均滤波器“限幅”进行“递归滤波”,限幅后将相应数据传递到队列。
/*融合两个滤波法的优点是,对于偶然出现的脉冲噪声,将脉冲噪声引起的采样值的偏差*/7阶延迟滤波器设为b=0~1
本次滤波结果=(1-a )本次采样的值a *上次采样的值
/*对周期性干扰的良好抑制作用适用于波动频率高的情况*/
/*相位滞后程度取决于a的值大小 不能消除滤波频率高于采样频率的1/2的干扰信号*/ /*为加快程序处理速度假定基数为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.加权递推平均滤波是对递推平均滤波法的改进,即不同时刻的数据加以不同的权通常是,越接近现时刻的数据,权取得越大。给予新采样值的权系书越大,则灵敏度越高,但信号平滑度低。
/*优点:适用于有较大纯滞后时间常数的对象和采样周期较短的系统缺点:对于纯滞后时间常数较小,采样周期较长,变化缓慢的信号不能迅速反应系统当前所受干扰的严重程度,滤波效果差*/#define N 12char codecoe[N]={1,2,3,4,5,6,7,8,9,10,11,12};har codesum_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<N;count++) sum = value_buf[count];return(char)(sum/sum_coe);} 9.消抖滤波设置一个滤波计数器
将每次采样值与当前有效值比较:
如果采样值=当前有效值,则计数器清零
如果采样值<>当前有效值,则计数器+1,并判断计数器是否>=上限N(溢出)
如果计数器溢出,则将本次值替换当前有效值,并清计数器
A、方法:
相当于“限幅滤波法”+“消抖滤波法”
先限幅,后消抖
B、优点:
继承了“限幅”和“消抖”的优点
改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统
A. 方法:
确定信号带宽, 滤之。
Y(n)=a1Y(n-1)+ a2Y(n-2)+ …+akY(n-k)+b0X(n)+ b1X(n-1)+ b2X(n-2)+ …+
bk*X(n-k)
B. 优点:高通,低通,带通,带阻任意。设计简单(用matlab)
C. 缺点:运算量大