首页 > 编程知识 正文

滤波算法有哪些(51单片机 逻辑算法)

时间:2023-05-05 01:41:24 阅读:75270 作者:2116

滤波算法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(溢出)
如果计数器溢出,则将本次值替换当前有效值,并清计数器

/*优点:对于变化缓慢的被测参数有较好的滤波效果,可避免在临界值附近控制器的反复开/关跳动或显示器上数值抖动缺点:对于快速变化的参数不宜如果在计数器溢出的那一次采样到的值恰好是干扰值,则会将干扰值当作有效值导入系统。*/#define N 12char filter(){char count=0;char new_value;new_value= get_ad();while (value!=new_value);{count++;if (count>=N) returnnew_value;delay();new_value= get_ad();}returnvalue;} 10.限幅消抖滤波

A、方法:
相当于“限幅滤波法”+“消抖滤波法”
先限幅,后消抖
B、优点:
继承了“限幅”和“消抖”的优点
改进了“消抖滤波法”中的某些缺陷,避免将干扰值导入系统

C、缺点:对于快速变化的参数不宜 11.IIR数字滤波器

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. 缺点:运算量大

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;// }returnReturnValue;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。