常用种软件滤波精编版
汇编语言数字滤波程序

汇编语言数字滤波程序10种软件滤波方法及比较推荐1、限幅滤波法(又称程序判断滤波法)A、方法:根据经验判断,确定两次采样允许的最大偏差值(设为A)每次检测到新值时判断:如果本次值与上次值之差<=A,则本次值有效如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值B、优点:能有效克服因偶然因素引起的脉冲干扰C、缺点无法抑制那种周期性的干扰平滑度差2、中位值滤波法A、方法:连续采样N次(N取奇数)把N次采样值按大小排列取中间值为本次有效值B、优点:能有效克服因偶然因素引起的波动干扰对温度、液位的变化缓慢的被测参数有良好的滤波效果C、缺点:对流量、速度等快速变化的参数不宜3、算术平均滤波法A、方法:连续取N个采样值进行算术平均运算N值较大时:信号平滑度较高,但灵敏度较低N值较小时:信号平滑度较低,但灵敏度较高N值的选取:一般流量,N=12;压力:N=4B、优点:适用于对一般具有随机干扰的信号进行滤波这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动C、缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用比较浪费RAM4、递推平均滤波法(又称滑动平均滤波法)A、方法:把连续取N个采样值看成一个队列队列的长度固定为N,每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)把队列中的N个数据进行算术平均运算,就可获得新的滤波结果N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4B、优点:对周期性干扰有良好的抑制作用,平滑度高适用于高频振荡的系统C、缺点:灵敏度低对偶然出现的脉冲性干扰的抑制作用较差不易消除由于脉冲干扰所引起的采样值偏差不适用于脉冲干扰比较严重的场合比较浪费RAM5、中位值平均滤波法(又称防脉冲干扰平均滤波法)A、方法:相当于“中位值滤波法”+“算术平均滤波法”连续采样N个数据,去掉一个最大值和一个最小值,然后计算N-2个数据的算术平均值N值的选取:3~14B、优点:融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差C、缺点:测量速度较慢,和算术平均滤波法一样比较浪费RAM6、限幅平均滤波法A、方法:相当于“限幅滤波法”+“递推平均滤波法”每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波处理B、优点:融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差C、缺点:比较浪费RAM7、一阶滞后滤波法A、方法:取a=0~1本次滤波结果=(1-a)*本次采样值+a*上次滤波结果B、优点:对周期性干扰具有良好的抑制作用适用于波动频率较高的场合C、缺点:相位滞后,灵敏度低滞后程度取决于a值大小不能消除滤波频率高于采样频率的1/2的干扰信号8、加权递推平均滤波法A、方法:是对递推平均滤波法的改进,即不同时刻的数据加以不同的权通常是,越接近现时刻的数据,权取得越大。
常用7种软件滤波

随机误差是有随机干搅引起的,其特点是在相同条件下测量同一个量时,其大小和符号做无规则变化而无法预测,但多次测量结果符合统计规律。
为克服随机干搅引入的误差,硬件上可采用滤波技术,软件上可以采用软件算法实现数字滤波,其算法往往是系统测控算法的一个重要组成部分,实时性很强,采用汇编语言来编写。
采用数字滤波算法克服随机干搅引入的误差具有以下几个优点:(1)数字滤波无须硬件,只用一个计算过程,可靠性高,不存在阻抗匹配问题,尤其是数字滤波可以对频率很高或很低的信号进行滤波,这是模拟滤波器做不到的。
(2)数字滤波是用软件算法实现的,多输入通道可用一个软件“滤波器”从而降低系统开支。
(3)只要适当改变软件滤波器的滤波程序或运行参数,就能方便地改变其滤波特性,这个对于低频、脉冲干搅、随机噪声等特别有效。
常用的数字滤波器算法有程序判断法、中值判断法、算术平均值法、加权滤波法、滑动滤波法、低通滤波法和复合滤波法。
1.程序判断法:程序判断法又称限副滤波法,其方法是把两次相邻的采样值相减,求出其增量(以绝对值表示)。
然后与两次采样允许的最大差值△Y进行比较,△Y的大小由被测对象的具体情况而定,若小于或等于△Y,则取本次采样的值;若大于△Y,则取上次采样值作为本次采样值,即yn - yn-1|≤△Y,则yn有效,yn -yn-1|>△Y,则yn-1有效。
式中yn ——第n次采样的值;Yn-1——第(n-1)次采样的值;△Y——相邻两次采样值允许的最大偏差。
设R1和R2为内部RAM单元,分别存放yn-1和yn,滤波值也存放在R2单元,采用MCS-51单片机指令编写的程序判断法子程序如下:付表2.中值滤波法即对某一参数连续采样N次(一般N为奇数),然后把N次采样值按从小到大排队,再取中间值作为本次采样值。
设DATA为存放采样值的内存单元首地址,SAMP为存放滤波值的内存单元地址,N为采样值个数,用MCS-51指令编写的中值滤波子程序如下:副表3.算术平均值滤波算法算术平均滤波法就是连续取N次采样值进行算术平均,其数学表达式是:Y=∑yi~y=1/N ∑ yii=1……N式中~y——N个采样值的算术平均值;Yi ——第i个采样值;设8次采样值依次存放在地址DATA开始的连续单元中,滤波结果保留在累加器A中,程序如下:副表4.加权平均滤波法算术平均滤波法存在前面所说的平滑和灵敏度之间的矛盾。
10种经典的软件滤波办法

10种经典的软件滤波办法1、限幅滤波法(又称程序差异滤波法)A、办法:依据履历差异,断定两次采样容许的最大过失值(设为A)每次查看到新值时差异:假定本次值与前次值之差lt;=A,则本次值有用假定本次值与前次值之差A,则本次值无效,丢掉本次值,用前次值替代本次值B、长处:能有用打败因偶尔要素致使的脉冲搅扰C、缺陷无法按捺那种周期性的搅扰滑润度差2、中位值滤波法A、办法:接连采样N次(N取奇数)把N次采样值按巨细摆放取基地值为本次有用值B、长处:能有用打败因偶尔要素致使的不坚决搅扰对温度、液位的改动缓慢的被测参数有杰出的滤波作用C、缺陷:对流量、速度等活络改动的参数不宜3、算术均匀滤波法A、办法:接连取N个采样值进行算术均匀运算N值较大时:信号滑润度较高,但活络度较低N值较小时:信号滑润度较低,但活络度较高N值的挑选:通常流量,N=12;压力:N=4B、长处:适用于对通常具有随机搅扰的信号进行滤波这么信号的特征是有一个均匀值,信号在某一数值方案邻近上下不坚决C、缺陷:关于丈量速度较慢或央求数据核算速度较快的实时操控不适用比照糟蹋RAM4、递推均匀滤波法(又称滑动均匀滤波法)A、办法:把接连取N个采样值当作一个行列行列的长度固定为N每次采样到一个新数据放入队尾,并丢掉正本队首的一次数据.(抢先先出准则)把行列中的N个数据进行算术均匀运算,就可取得新的滤波作用N值的挑选:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4B、长处:对周期性搅扰有杰出的按捺作用,滑润度高适用于高频振动的体系C、缺陷:活络度低对偶尔呈现的脉冲性搅扰的按捺作用较差不易消除由于脉冲搅扰所构成的使的采样值过失不适用于脉冲搅扰比照严峻的场合比照糟蹋RAM5、中位值均匀滤波法(又称防脉冲搅扰均匀滤波法)A、办法:恰当于中位值滤波法+算术均匀滤波法接连采样N个数据,去掉一个最大值和一个最小值然后核算N-2个数据的算术均匀值N值的挑选:3~14B、长处:交融了两种滤波法的长处关于偶尔呈现的脉冲性搅扰,可消除由于脉冲搅扰所构成的使的采样值过失C、缺陷:丈量速度较慢,和算术均匀滤波法相同比照糟蹋RAM6、限幅均匀滤波法A、办法:恰当于限幅滤波法+递推均匀滤波法每次采样到的新数据抢先行限幅处理,再送入行列进行递推均匀滤波处理B、长处:交融了两种滤波法的长处关于偶尔呈现的脉冲性搅扰,可消除由于脉冲搅扰所构成的使的采样值过失C、缺陷:比照糟蹋RAM7、一阶滞后滤波法A、办法:取a=0~1本次滤波作用=(1-a)*本次采样值+a*前次滤波作用B、长处:对周期性搅扰具有杰出的按捺作用适用于不坚决频率较高的场合C、缺陷:相位滞后,活络度低滞后程度取决于a值巨细。
2019年11种滤波方法+范例代码.doc

软件滤波算法(转载)这几天做一个流量检测的东西,其中用到了对数据的处理部分,试了很多种方法,从网上找到这些个滤波算法,贴出来记下需要注意的是如果用到求平均值的话,注意总和变量是否有溢出,程序没必要照搬,主要学习这些方法,相信做东西的时候都能用得上1、限幅滤波法(又称程序判断滤波法)A、方法:根据经验判断,确定两次采样允许的最大偏差值(设为A)每次检测到新值时判断:如果本次值与上次值之差<=A,则本次值有效如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值B、优点:能有效克服因偶然因素引起的脉冲干扰C、缺点无法抑制那种周期性的干扰平滑度差2、中位值滤波法A、方法:连续采样N次(N取奇数)把N次采样值按大小排列取中间值为本次有效值B、优点:能有效克服因偶然因素引起的波动干扰对温度、液位的变化缓慢的被测参数有良好的滤波效果C、缺点:对流量、速度等快速变化的参数不宜3、算术平均滤波法A、方法:连续取N个采样值进行算术平均运算N值较大时:信号平滑度较高,但灵敏度较低N值较小时:信号平滑度较低,但灵敏度较高N值的选取:一般流量,N=12;压力:N=4B、优点:适用于对一般具有随机干扰的信号进行滤波这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动C、缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用比较浪费RAM4、递推平均滤波法(又称滑动平均滤波法)A、方法:把连续取N个采样值看成一个队列队列的长度固定为N每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)把队列中的N个数据进行算术平均运算,就可获得新的滤波结果N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4B、优点:对周期性干扰有良好的抑制作用,平滑度高适用于高频振荡的系统C、缺点:灵敏度低对偶然出现的脉冲性干扰的抑制作用较差不易消除由于脉冲干扰所引起的采样值偏差不适用于脉冲干扰比较严重的场合比较浪费RAM5、中位值平均滤波法(又称防脉冲干扰平均滤波法)A、方法:相当于“中位值滤波法”+“算术平均滤波法”连续采样N个数据,去掉一个最大值和一个最小值然后计算N-2个数据的算术平均值N值的选取:3~14B、优点:融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差C、缺点:测量速度较慢,和算术平均滤波法一样比较浪费RAM6、限幅平均滤波法A、方法:相当于“限幅滤波法”+“递推平均滤波法”每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波处理B、优点:融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差C、缺点:比较浪费RAM7、一阶滞后滤波法A、方法:取a=0~1本次滤波结果=(1-a)*本次采样值+a*上次滤波结果B、优点:对周期性干扰具有良好的抑制作用适用于波动频率较高的场合C、缺点:相位滞后,灵敏度低滞后程度取决于a值大小不能消除滤波频率高于采样频率的1/2的干扰信号8、加权递推平均滤波法A、方法:是对递推平均滤波法的改进,即不同时刻的数据加以不同的权通常是,越接近现时刻的数据,权取得越大。
10种软件滤波方法及示例程序

10种软件滤波方法及示例程序滤波是数字信号处理中常用的一种方法,用于去除信号中的噪声或者改变信号的频率响应。
软件滤波是指使用计算机软件来实现滤波功能。
本文将介绍10种常用的软件滤波方法,并附上相应的示例程序。
1.均值滤波:将信号中的每个样本点都替换为其邻近样本点的平均值。
这种方法适用于去除高频噪声,但会导致信号的模糊化。
示例程序:```pythonimport numpy as npdef mean_filter(signal, window_size):filtered_signal = []for i in range(len(signal)):start = max(0, i - window_size//2)end = min(len(signal), i + window_size//2)filtered_signal.append(np.mean(signal[start:end]))return filtered_signal#使用示例signal = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]window_size = 3filtered_signal = mean_filter(signal, window_size)print(filtered_signal)```2.中值滤波:将信号中每个样本点都替换为邻近样本点的中值。
这种方法适用于去除椒盐噪声等随机噪声,但不适用于平滑信号。
示例程序:```pythonimport numpy as npdef median_filter(signal, window_size):filtered_signal = []for i in range(len(signal)):start = max(0, i - window_size//2)end = min(len(signal), i + window_size//2)filtered_signal.append(np.median(signal[start:end]))return filtered_signal#使用示例signal = [1, 3, 5, 7, 9, 8, 6, 4, 2]window_size = 3filtered_signal = median_filter(signal, window_size)print(filtered_signal)```3.高斯滤波:使用一维/二维高斯函数作为滤波器,加权平均信号的邻近样本点。
11种经典软件滤波的原理和实现58239

11种经典软件滤波的原理和实现1、限幅滤波法(又称程序判断滤波法)A、方法:根据经验判断,确定两次采样允许的最大偏差值(设为A)每次检测到新值时判断:如果本次值与上次值之差<=A,则本次值有效如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值B、优点:能有效克服因偶然因素引起的脉冲干扰C、缺点无法抑制那种周期性的干扰平滑度差2、中位值滤波法A、方法:连续采样N次(N取奇数)把N次采样值按大小排列取中间值为本次有效值B、优点:能有效克服因偶然因素引起的波动干扰对温度、液位的变化缓慢的被测参数有良好的滤波效果C、缺点:对流量、速度等快速变化的参数不宜3、算术平均滤波法A、方法:连续取N个采样值进行算术平均运算N值较大时:信号平滑度较高,但灵敏度较低N值较小时:信号平滑度较低,但灵敏度较高N值的选取:一般流量,N=12;压力:N=4B、优点:适用于对一般具有随机干扰的信号进行滤波这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动C、缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用比较浪费RAM4、递推平均滤波法(又称滑动平均滤波法)A、方法:把连续取N个采样值看成一个队列队列的长度固定为N每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)把队列中的N个数据进行算术平均运算,就可获得新的滤波结果N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4B、优点:对周期性干扰有良好的抑制作用,平滑度高适用于高频振荡的系统C、缺点:灵敏度低对偶然出现的脉冲性干扰的抑制作用较差不易消除因为脉冲干扰所引起的采样值偏差不适用于脉冲干扰比较严重的场合比较浪费RAM5、中位值平均滤波法(又称防脉冲干扰平均滤波法)A、方法:相当于“中位值滤波法”+“算术平均滤波法”连续采样N个数据,去掉一个最大值和一个最小值然后计算N-2个数据的算术平均值N值的选取:3~14B、优点:融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除因为脉冲干扰所引起的采样值偏差C、缺点:测量速度较慢,和算术平均滤波法一样比较浪费RAM6、限幅平均滤波法A、方法:相当于“限幅滤波法”+“递推平均滤波法”每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波处理B、优点:融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除因为脉冲干扰所引起的采样值偏差C、缺点:比较浪费RAM7、一阶滞后滤波法A、方法:取a=0~1本次滤波结果=(1-a)*本次采样值+a*上次滤波结果B、优点:对周期性干扰具有良好的抑制作用适用于波动频率较高的场合C、缺点:相位滞后,灵敏度低滞后程度取决于a值大小不能消除滤波频率高于采样频率的1/2的干扰信号8、加权递推平均滤波法A、方法:是对递推平均滤波法的改进,即不同时刻的数据加以不同的权通常是,越接近现时刻的数据,权取得越大。
十种经典的软件滤波方法+程序

十种经典的软件滤波方法+程序十种经典的软件滤波方法+程序1、限幅滤波法(又称程序判断滤波法)A、方法:根据经验判断,确定两次采样允许的最大偏差值(设为A)每次检测到新值时判断:如果本次值与上次值之差<=A,则本次值有效如果本次值与上次值之差>A,则本次值无效,放弃本次值,用上次值代替本次值B、优点:能有效克服因偶然因素引起的脉冲干扰C、缺点无法抑制周期性的干扰平滑度差/* A值可根据实际情况调整, value为有效值,new_value为当前采样值,滤波程序返回有效的实际值*/#define A 10char 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、中位值滤波法A、方法:连续采样N次(N取奇数)把N次采样值按大小排列取中间值为本次有效值B、优点:能有效克服因偶然因素引起的波动干扰对温度、液位的变化缓慢的被测参数有良好的滤波效果C、缺点:对流量、速度等快速变化的参数不宜#define N 11 //N值可根据实际情况调整char filter(){char value_buf[N];char count,i,j,temp;for (count=0;count<N;count++){value_buf[count]=get_ad(); //获取采样值delay();}for (j=0;j<N-1;j++) //采样值由小到大排列,排序采用冒泡法{for (i=0;i<N-j;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;}}}return value_buf[(N-1)/2]; //取中间值}3、算术平均滤波法A、方法:连续取N个采样值进行算术平均运算N值较大时:信号平滑度较高,但灵敏度较低N值较小时:信号平滑度较低,但灵敏度较高N值的选取:一般流量,N=12;压力:N=4B、优点:适用于对一般具有随机干扰的信号进行滤波这样信号的特点是有一个平均值,信号在某一数值范围附近上下波动C、缺点:对于测量速度较慢或要求数据计算速度较快的实时控制不适用比较浪费RAM#define N 12char filter(){int sum = 0;for ( count=0;count<N;count++){sum + = get_ad();delay();}return (char)(sum/N);}4、递推平均滤波法(又称滑动平均滤波法)A、方法:把连续取N个采样值看成一个队列队列的长度固定为N每次采样到一个新数据放入队尾,并扔掉原来队首的一次数据.(先进先出原则)把队列中的N个数据进行算术平均运算,就可获得新的滤波结果N值的选取:流量,N=12;压力:N=4;液面,N=4~12;温度,N=1~4B、优点:对周期性干扰有良好的抑制作用,平滑度高适用于高频振荡的系统C、缺点:灵敏度低对偶然出现的脉冲性干扰的抑制作用较差不易消除由于脉冲干扰所引起的采样值偏差不适用于脉冲干扰比较严重的场合比较浪费RAM#define N 12char 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<N,count++)sum += value_buf[count];return (char)(sum/N);}5、中位值平均滤波法(又称防脉冲干扰平均滤波法)A、方法:相当于“中位值滤波法”+“算术平均滤波法”连续采样N个数据,去掉一个最大值和一个最小值然后计算N-2个数据的算术平均值N值的选取:3~14B、优点:融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差C、缺点:测量速度较慢,和算术平均滤波法一样比较浪费RAM#define N 12char filter(){char count,i,j;char value_buf[N];int sum=0;for (count=0;count<N;count++){value_buf[count] = get_ad();delay();}for (j=0;j<N-1;j++){for (i=0;i<N-j;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++)sum += value[count];return (char)(sum/(N-2));}6、限幅平均滤波法A、方法:相当于“限幅滤波法”+“递推平均滤波法”每次采样到的新数据先进行限幅处理,再送入队列进行递推平均滤波处理B、优点:融合了两种滤波法的优点对于偶然出现的脉冲性干扰,可消除由于脉冲干扰所引起的采样值偏差C、缺点:比较浪费RAM参考子程序1、37、一阶滞后滤波法A、方法:取a=0~1本次滤波结果=(1-a)*本次采样值+a*上次滤波结果B、优点:对周期性干扰具有良好的抑制作用适用于波动频率较高的场合C、缺点:相位滞后,灵敏度低滞后程度取决于a值大小不能消除滤波频率高于采样频率的1/2的干扰信号/* 为加快程序处理速度假定基数为100,a=0~100 */#define a 50char value;char filter(){char new_value;new_value = get_ad();return (100-a)*value + a*new_value;}8、加权递推平均滤波法A、方法:是对递推平均滤波法的改进,即不同时刻的数据加以不同的权通常是,越接近现时刻的数据,权取得越大。
(整理)10种软件滤波方法的示例程序.

10种软件滤波方法的示例程序程序匠人发表于2005-9-3 9:18:00 阅读全文(3321) | 回复(0) | 引用通告(16) | 编辑匠人注:<10种软件滤波方法>一文由匠人原创,并曾经发表在21ICBSS的[侃单片机]栏目,后被多方转载,但大多数没有注明原作者,郁闷啊~~~~~~~~,以下这程序是他人根据匠人文中汇总的方法用C语言实现的程序范例:10种软件滤波方法的示例程序OurWay 发表于2005-9-2 22:24:0010种软件滤波方法的示例程序(JKRL)假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad();1、限副滤波/* A值可根据实际情况调整value为有效值,new_value为当前采样值滤波程序返回有效的实际值*/#define A 10char 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 11char filter(){char value_buf[N];char count,i,j,temp;for ( count=0;count<N;count++){value_buf[count] = get_ad();delay();}for (j=0;j<N-1;j++){for (i=0;i<N-j;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;}}}return value_buf[(N-1)/2];}3、算术平均滤波法#define N 12char filter(){int sum = 0;for ( count=0;count<N;count++){sum + = get_ad();delay();}return (char)(sum/N);}4、递推平均滤波法(又称滑动平均滤波法)#define N 12char 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<N,count++)sum = value_buf[count];return (char)(sum/N);}5、中位值平均滤波法(又称防脉冲干扰平均滤波法)#define N 12char filter(){char count,i,j;char value_buf[N];int sum=0;for (count=0;count<N;count++){value_buf[count] = get_ad();delay();}for (j=0;j<N-1;j++){for (i=0;i<N-j;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++)sum += value[count];return (char)(sum/(N-2));}6、限幅平均滤波法/**/略参考子程序1、37、一阶滞后滤波法/* 为加快程序处理速度假定基数为100,a=0~100 */#define a 50char value;char filter(){char new_value;new_value = get_ad();return (100-a)*value + a*new_value;}8、加权递推平均滤波法/* coe数组为加权系数表,存在程序存储区。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
常用种软件滤波集团企业公司编码:(LL3698-KKI1269-TM2483-LUI12689-ITT289-随机误差是有随机干搅引起的,其特点是在相同条件下测量同一个量时,其大小和符号做无规则变化而无法预测,但多次测量结果符合统计规律。
为克服随机干搅引入的误差,硬件上可采用滤波技术,软件上可以采用软件算法实现数字滤波,其算法往往是系统测控算法的一个重要组成部分,实时性很强,采用汇编语言来编写。
采用数字滤波算法克服随机干搅引入的误差具有以下几个优点:(1)数字滤波无须硬件,只用一个计算过程,可靠性高,不存在阻抗匹配问题,尤其是数字滤波可以对频率很高或很低的信号进行滤波,这是模拟滤波器做不到的。
(2)数字滤波是用软件算法实现的,多输入通道可用一个软件“滤波器”从而降低系统开支。
(3)只要适当改变软件滤波器的滤波程序或运行参数,就能方便地改变其滤波特性,这个对于低频、脉冲干搅、随机噪声等特别有效。
常用的数字滤波器算法有程序判断法、中值判断法、算术平均值法、加权滤波法、滑动滤波法、低通滤波法和复合滤波法。
1.程序判断法:程序判断法又称限副滤波法,其方法是把两次相邻的采样值相减,求出其增量(以绝对值表示)。
然后与两次采样允许的最大差值△Y进行比较,△Y的大小由被测对象的具体情况而定,若小于或等于△Y,则取本次采样的值;若大于△Y,则取上次采样值作为本次采样值,即yn- yn-1|≤△Y,则yn有效,yn-yn-1|>△Y,则yn-1有效。
式中yn——第n次采样的值;Yn-1——第(n-1)次采样的值;△Y——相邻两次采样值允许的最大偏差。
设R1和R2为内部RAM单元,分别存放yn-1和yn,滤波值也存放在R2单元,采用MCS-51单片机指令编写的程序判断法子程序如下:付表2.中值滤波法即对某一参数连续采样N次(一般N为奇数),然后把N次采样值按从小到大排队,再取中间值作为本次采样值。
设DATA为存放采样值的内存单元首地址,SAMP为存放滤波值的内存单元地址,N为采样值个数,用MCS-51指令编写的中值滤波子程序如下:副表3.算术平均值滤波算法算术平均滤波法就是连续取N次采样值进行算术平均,其数学表达式是:Y=∑yi~y=1/N ∑ yii=1……N式中?~y——N个采样值的算术平均值;Yi ——第i个采样值;设8次采样值依次存放在地址DATA开始的连续单元中,滤波结果保留在累加器A中,程序如下:副表4.加权平均滤波法算术平均滤波法存在前面所说的平滑和灵敏度之间的矛盾。
采样次数太少,平滑效果差,次数太多,灵敏度下降,对参数的变化趋势不敏感。
协调两者关系,可采用加权平均滤波,对连续N次采样值,分别乘上不同的加权系数之后再求累加和,加权系数一般先小后大,以突出后面若干采样的效果,加强系统对参数的变化趋势的辩识,各个加权系数均为小于1的小数,且满足总和等于1的约束条件,这样,加权运算之后的累加和即为有效采样值。
为方便计算,可取各个加权系数均为整数,且总和为256,加权运算后的累加和除以256(即舍去低字节)后便是有效采样值。
设每批采样8个数据,依次存放在地址DATA开始的单元中,各加权系数是用一个表格存放在ROM中,MCS-51指令编写的算术平均滤波程序如下:副表5.滑动平均滤波法:以上介绍的各种平均滤波算法有一个共同点,即每取得一个有效采样值必须连续进行若干次采样,当采样速度较慢(如双积分型A/D转换)或目标参数变化较快时,系统的实时性不能保证,滑动平均滤波算法只采样一次,将这一次采样值和过去的若干次采样值一起求平均,得到的有效采样值即可投入使用,如果取N个采样值求平均,RAM中必须开辟N 个数据的暂存区。
每新采样一个数据便存入暂存区,同时去掉一个最老的数据,保持这N个数据始终是最近的数据,这种数据存放方式可以用环行队列结构方便的实现。
设环行队列为40H-4FH连续16个单元,RO作为队尾指针,滤波程序如下:副表6.低通滤波法:将普通硬件RC低通滤波器的微分方程用差分方程来表求,变可以采用软件算法来模拟硬件滤波的功能,经推导,低通滤波算法如下:Yn=a* Xn+ (1-a) *Yn-1式中?Xn——本次采样值Yn-1——上次的滤波输出值;a——滤波系数,其值通常远小于1;Yn——本次滤波的输出值。
由上式可以看出,本次滤波的输出值主要取决于上次滤波的输出值(注意不是上次的采样值,这和加权平均滤波是有本质区别的),本次采样值对滤波输出的贡献是比较小的,但多少有些修正作用,这种算法便模拟了具体有教大惯性的低通滤波器功能。
滤波算法的截止频率可用以下式计算:fL= a/2Pit?pi为圆周率 3.14…式中?a——滤波系数;t——采样间隔时间;例如:当t=0.5s(即每秒2次),a=1/32时;fL=(1/32)/(2*3.14*0.5)=0.01Hz当目标参数为变化很慢的物理量时,这是很有效的。
另外一方面,它不能滤除高于1/2采样频率的干搅信号,本例中采样频率为2Hz,故对1Hz以上的干搅信号应采用其他方式滤除,低通滤波算法程序于加权平均滤波相似,但加权系数只有两个:a和1-a。
为计算方便,a取一整数,1-a用256-a,来代替,计算结果舍去最低字节即可,因为只有两项,a和1-a,均以立即数的形式编入程序中,不另外设表格。
虽然采样值为单元字节(8位A/D)。
为保证运算精度,滤波输出值用双字节表示,其中一个字节整数,一字节小数,否则有可能因为每次舍去尾数而使输出不会变化。
设Yn-1存放在30H(整数)和31H(小数)两单元中,Yn存放在32H (整数)和33H(小数)中。
滤波程序如下:副表结束语:微型计算机在仪器仪表系统中的成功应用,使传统的电子仪器以及复杂的跟踪测量装置发生了许多革命性变化。
其中一个突出表现就是一个系统中包含了智能性运作。
微机具有很强的分析和运算能力,智能系统可完成复杂的数据处理,智能系统采用软件硬件想结合的方法进行随机误差的数字滤波和系统误差的修正,可以实现实时修正,较准测量数据,这些都是传统仪器难以比拟的。
#include <stdio.h>#include <absacc.h>#include <intrins.h>#include <./Atmel/at89x52.h>#include "source.h"main(){filter_1();filter_2();filter_3();filter_4();filter_5();filter_6();filter_7();filter_8();filter_9();filter_10();}unsigned char get_ad(void){ static unsigned char i; return i++;}void delay(void){unsigned char i=0;while(1){i++;if(i>20) return;}}#define A 10 //设置两次采样允许的最大偏差值char value; //上次采用后的有效值变量char filter_1(void){char new_value; //本次采样值变量new_value=get_ad(); //读入本次采样值if((new_value-value>A)||(value-new_value>A)) //比较是否超出最大偏差值return value; //如果超出,返回上次的有效值作为本次的有效值return new_value;// 如果没有超出,返回本次的采样值作为本次的有效值}#define N 11 //设置连续采样的次数char filter_2(void){char value_buf[N]; //缓存N次采样值的存储变量char count,i,j,temp; //i,j是冒泡排序的下标变量,count是采样数据读入的下标变量//temp是临时变量for(count=0;count<N;count++) //连续读入N个采样值{value_buf[count]=get_ad();delay();}for(j=0;j<N;j++) //气泡排序,由小到大{for(i=0;i<N-j;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;}}}return value_buf[(N-1)/2]; //将排序后N个采样值的中间值作为最后结果返回}#undef N#define N 12 //设置每组参与平均运算的采样值个数char filter_3(){int sum=0; //求和变量,用于存储采样值的累加值char count;//采样数据读入的下标变量for(count=0;count<N;count++) //连续读入N个采样值,并累加{sum+=get_ad();delay();}return (char)(sum/N); //讲累加值进行平均计算作为返回值}#undef N#define N 12 //设置FIFO队列的长度char value_buf[N];//FIFO队列变量char i=0; //队列的下标变量char filter_4(){char count;int sum=0;value_buf[i++]=get_ad();if(i==N) i=0;for(count=0;count<N;count++)sum+=value_buf[count];return(char)(sum/N);}#undef N#define N 12 //设置每组采样值的数量char filter_5(){char count,i,j,temp; //i,j是冒泡排序的下标变量,count是采样数据读入的下标变量char value_buf[N]; // 缓冲N个采样值的存储变量int sum=0; //求和变量,用于存储采样值的累加值for (count=0;count<N;count++) //连续读入N个采样值{value_buf[count] = get_ad();delay();}for (j=0;j<N-1;j++) //气泡排序,由小到大{for (i=0;i<N-j;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++)sum += value_buf[count]; //去掉两端的最小和最大采样值,对中间的N-2个采样值求和return (char)(sum/(N-2));// 返回中间N-2个采样值的平均值}#undef A#undef N#define A 10 //设置两次采样允许的最大偏差值#define N 12 //设置每组参与平均运算的采样值个数char value; //上次采用后的有效值变量char filter_6(){char new_value; //本次采样值变量int sum=0; //求和变量,用于存储采样值的累加值char count;//采样数据读入的下标变量for(count=0;count<N;count++){new_value=get_ad(); //读入本次采样值if((new_value-value>A)||(value-new_value>A)) //比较是否超出最大偏差值new_value=value; //如果超出,返回上次的有效值作为本次的有效值sum+=new_value; //累加采样的有效值value=new_value;delay();}return (char)(sum/N); //将累加值进行平均计算作为返回值}#define COE 50 //定义加权系数char value; //上一个采样值变量char filter_7(){char new_value; //本次采样值变量new_value = get_ad();return (100-COE)*value + COE*new_value; //返回的本次滤波结果}#undef N#define N 12 //设置FIFO队列的长度char code coe[N] = {1,2,3,4,5,6,7,8,9,10,11,12}; //加权系数char code sum_coe = 1+2+3+4+5+6+7+8+9+10+11+12;char filter_8(){char count; //采样数据读入的下标变量char value_buf[N]; //缓存N个采样值的存储变量int sum=0; //求和变量,用于存储采样值的累加值for (count=0;count<N;count++){value_buf[count] = get_ad(); //读入采样值delay();}for (count=0;count<N;count++)sum += value_buf[count]*coe[count]; //累加采样值和系数的乘积return (char)(sum/sum_coe); //累加值与系数和相除作为返回结果}#undef N#define N 12 //设置计数器溢出值char filter_9(){char count=0; //计数变量char new_value; //本次采样值变量new_value = get_ad(); //读入本次采样值while (value !=new_value);{count++; //计数器加1if (count>=N) return new_value; //如果本次采样值与当前有效值不相等,//且计数器溢出,返回本次采样值delay();new_value = get_ad();}return value; //如果本次采样值与当前有效值相等,则返回当前有效值}#undef A#undef N#define A 10 //设置两次采样允许的最大偏差值#define N 12 //设置计数器溢出值char value; //有效值变量char filter_10(){char count=0; //计数变量char new_value; //本次采样值变量new_value = get_ad(); //读入本次采样值if((new_value-value>A)||(value-new_value>A)) //比较是否超出最大偏差值new_value=value; //如果超出,返回有效值作为本次的采样有效值while (value !=new_value);{count++; //计数器加1if (count>=N) return new_value; //如果本次采样值与当前有效值不相等,//且计数器溢出,返回本次采样值delay();new_value = get_ad();}return value; //如果本次采样值与当前有效值相等,则返回当前有效值}。