首页 > 编程知识 正文

常用的数字滤波算法有哪些(低通滤波原理)

时间:2023-05-05 08:11:36 阅读:75265 作者:2118

滑动过滤算法:优点:缺点代码:中值过滤算法:优点:缺点:代码:算术平均值过滤算法:优点:缺点:代码:滑动算术平均值过滤算法:优点:

剪辑法算法:

确定两次采样允许的最大偏差值(假设为a )。

每次检测到新的采样值时判断:

如果本次值与上次的值之差=A,则本次的采样值有效

如果本次值与上次值之差为a,则本次采样值无效。

如果这次的采样值无效,则可以对这次的采样进行不同的处理。

例如:

废弃本次采样值,将上次的采样值作为本次的采样值使用,本次的采样值=上次的采样值切片a废弃本次的采样值,重新采样的优点:能够消除偶然的波动引起的误差缺点,及

代码:/* variation_Range值为*/# define variation _ range 10 char bounds _ filter (charnew _ value,char old _ filter ),具体情况取决于实际情况}或:

/* 10是限值,是否可以根据情况调整*/new _ value=ABS (new _ value-old _ value ) 10? old_value:new_value; 点击//1行代码即可

中值滤波法算法:连续采样奇数个数据,然后对数据从小到大排序,取中间的值做为本次采样值

优点:中值滤波方法可实现滤除偶然因素引起的脉冲干扰,去除数据毛刺,使采样数据更加平滑。

适用于温度等被测参数等变化较慢的比较线性的采样系统

缺点:不使用采样值快速变化的系统

代码: samples_Num次采样,按气泡排序,最后中值#define samples_Num 5 //采样次数int Median_Filter () unsignedintvalue for (计数=0; count samples_Num; count({value[count]=read_ADC ); (for ) j=0; j samples_Num - 1; j ) for(I=0; i samples_Num - j - 1; I () if ) value[I]value[I1] ) { temp=value[i]; value[i]=value[i 1]; value[i 1]=temp; } }返回值[ (m-1 )/2; }算术平均值过滤算法:在某时刻对信号进行连续多次采样,对采样值进行算术平均(平均值),作为该时刻的信号采样值

就是取平均值。 连续采样的次数因情况而异

好处:对抑制周期性干扰和随机干扰有良好效果

缺点:采样比较耗时,并且平均值可能受到某个数据干扰而产生较大浮动。

代码: #define N 10int value=0; int Arithmetic_Filter () for ) intI=0; i N; I ) { value=value Read_Adc (; }返回(值/n ); )滑动平均值滤波算法)滑动平均值滤波是指,首先在RAM中形成数据缓冲器,依次存储n个样本数据,每当取得新数据时,舍弃最初取得的数据,而舍弃包含新数据的n个数据的算术平均值或加权平均由此,每次进行采样时计算出新平均值,数据处理被高速化.

优点:对周期性干扰有良好的抑制作用,平滑度高

缺点:灵敏度低

干扰抑制作用低

#define size 6000//数组大小#define N 12//使用滑动平均过滤器计算平均值时取得的点数/*上的两个语句在使用以下函数时添加到程序开头的*/void smooth (fload smoth ) jsize; Jj

+) { if(j<N/2) { for(int k=0;k<N;k++) { Sum1+=data[j+k]; } data[j]=Sum1/N; } else if(j<size -N/2) { for(int k=0;k<N/2;k++) { Sum1+=(data[j+k]+data[j-k]); } data[j]=Sum1/N; } else { for(int k=0;k<size-j;k++) { Sum1+=data[j+k]; } for(int k=0;k<(N-size+j);k++) { Sum1+=data[j-k]; } data[j]=Sum1/N; } Sum1=0; }} 中位值平均滤波法 算法:

连续采样 N 个数据,去掉最大值和最小值 ,然后计算 N‐2 个数据的平均值,作为采样值

优点:

对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差

缺点:

用时比较久

代码 #define N 12 unsigned int Med_Avg_Filter(){ unsigned int count, i, j, temp; unsigned int value_buf[N]; int ad_sum= 0; //采样N次 for( count = 0; count < N; count++ ) { value_buf[count] = Read_ADC(); }/*=========================冒泡排序升序==========================*///舍弃最大值和最小值 for( j = 0; j < N - 1; j++ ) { for( i = 0; i < N - j - 1; i++ ) { if( value_buf[i] > value_buf[i + 1] ) { temp = value_buf[i]; value_buf[i] = value_buf[i + 1]; value_buf[i + 1] = temp; } } } //求中间项的和 for( count = 1; count < N - 1; count++ ) { ad_sum+= value_buf[count]; } return (ad_sum/( N -2 ));}} 一阶低通滤波 方法:

滤波结果=a*本次采样值+(1-a)*上次滤波结果

a取值为0~1之间

就是将新的采样值与上次的滤波结果计算一个加权平均值。

a的取值决定了算法的灵敏度,a越大,新采集的值占的权重越大,算法越灵敏,但平顺性差;相反,a越小,新采集的值占的权重越小,灵敏度差,但平顺性好

优点:

对周期性干扰具有良好的抑制作用
适用于波动频率较高的场合

缺点:

相位滞后,灵敏度低

代码: float final=0;float a=0.25; float first_Order_Filter(float data){final = a*data + (1-a)*final;return(final);}


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