滑动过滤算法:优点:缺点代码:中值过滤算法:优点:缺点:代码:算术平均值过滤算法:优点:缺点:代码:滑动算术平均值过滤算法:优点:
剪辑法算法:
确定两次采样允许的最大偏差值假设为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 ) forI=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
+) { ifj<N/2) { forint k=0;k<N;k++) { Sum1+=data[j+k]; } data[j]=Sum1/N; } else ifj<size -N/2) { forint k=0;k<N/2;k++) { Sum1+=data[j+k]+data[j-k]); } data[j]=Sum1/N; } else { forint k=0;k<size-j;k++) { Sum1+=data[j+k]; } forint 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_Filterfloat data){final = a*data + 1-a)*final;returnfinal);}