宁波外贸网站开发,wordpress变身插件,深圳设计招聘,做网站怎么加视频信号采集是非常常见的需求#xff0c;我们也总是希望采集到的数据是纯净而真实的#xff0c;但这只是我们的希望。环境中存在太多的干扰信号#xff0c;为了让我们得到的数据尽可能地接近实际值#xff0c;我们需要降低这些干扰信号的影响#xff0c;于是就有了滤波器的用…信号采集是非常常见的需求我们也总是希望采集到的数据是纯净而真实的但这只是我们的希望。环境中存在太多的干扰信号为了让我们得到的数据尽可能地接近实际值我们需要降低这些干扰信号的影响于是就有了滤波器的用武之地。这里我们讨论的主要是软件实现的数字滤波器这一篇我们就来讨论基于递推算术平均算法的平滑滤波器。
1、问题的提出
在我们通过AD采集获取数据时不可避免会受到干扰信号的影响而且很多时候我们希望尽可能的将这种影响减到最小。为实现这一目的人们想了很多办法有硬件方面的也有软件方面的。在硬件难以改变或者软件能够达到相应效果时我们一般采用软件方法来实现通常称之为数字滤波。
实现数字滤波的算法有很多种根据不同的应用需求我们可以选择不同滤波算法来实现。对于一般的AD采集最常见的是周期性干扰和随机性噪声对于此类干扰一般采用算术平均的方法就能得到比较理想的效果。其计算公式如下 使用简单的算术平均值算法虽然能够实现滤波但在一些情况下有一个问题可能会有影响那就是当做算术平均的数量比较大时会出现曲线并不是十分平滑的情况。这很容易理解因为一次采集n个数做算术平均得到一个结果当n越大则间隔的时间就越长。为了解决这一问题我们并不是甲酸完后就将n个数同时丢弃而是将最早的数丢弃并采用最新采集的数代替这就是所谓的递推算术平均算法。但其计算公式并没有发生变化。
2、算法设计
我们如何实现这种递推方式的平滑滤波器呢首先我们来看一看一般的算术平均算法是如何实现的。算术平均算法就是采集N个数然后对这N个数取平均值作为最终的结果。我们将这些数的序列记录如下 这N个数计算完毕后就会丢弃然后再采集N个数。很显然如果N值较大采集所耗费的时间跨度就会比较长数据看起来可能就并不那么平滑而且数据的输出速率会慢很多也不能展示数据的变化过程。而递推平均算法则不存在这些问题。同样是一个长度为N的数据队列但没采样一次数据我们就用最新的数据替换掉最久的数据并输出算术平均值。我们将这些数的序列记录如下 这样每采样一个数据我们都会输出一个滤波后的数据而不是等待采集N个数据后才会输出这样既可保证数据的连续性也可达到平滑滤波的效果。
3、代码实现
我们分析了平滑滤波器的实现算法接下来我们来讨论如何实现这一滤波器。首先我们将滤波器作为一个对象我们实现的滤波器操作也将面向这一对象来实现。那么我们实现对滤波器对象的操作需要确定该对象的那些属性呢
作为滤波器肯定需要获取当前采集到的数据值同时我们为了实现对N个数据的递推平均就需要有一个存储这N个数的队列我们需要记录最新的数据硬件存储到哪个位置就需要一个位置指针同时我们也需要知道N的大小所以我们将它们都定义滤波器对象的属性。平滑滤波的过程必须要计算算术平均值而递推算术平均则是在每次采集一个数据之时都计算平均值可是如果N值较大时就会存在大量的重复计算。我们考虑到上一次采样的平均值已经得到我们将其记录下来的话就可以用最新采集的数据替换掉最老的数据从而得到新的平均值所以我们将上一时间的输出值记录下来作为对象的一个属性。根据以上分析我们可定义滤波器对象类型为
/*定义平滑滤波对象类型*/
typedef struct FilterObject{float newValue; //最新测量值float lastValue; //上一个输出值float *buffer; //数据缓存区int16_t position; //写操作位置指针uint16_t bufCount; //滤波的数量
}FilterObjectType;
我们获得了滤波器对象接下来我们基于该对象实现平滑滤波器。对于平滑滤波自然是要采取计算平均值的过程。但我们使用了循环队列的操作方式所以判断新数据指针当前所处的位置。具体实现如下
/*平滑滤波处理函数返回滤波后的值 */
float SmoothingFilter(FilterObjectType *filter)
{float result0.0;if(filter-position0){for(int i0;ifilter-bufCount;i){filter-buffer[i]filter-newValue;}filter-position0;filter-lastValuefilter-newValue;}if(filter-positionfilter-bufCount){filter-position0;}resultfilter-lastValue-filter-buffer[filter-position]/filter-bufCount;resultresultfilter-newValue/filter-bufCount;filter-buffer[filter-position]filter-newValue;filter-lastValueresult;filter-newValue0.0;return result;
}
4、应用总结
我们实现了基于算术平均的平滑滤波器对于消除周期性干扰有良好的抑制作用对于一般具有随机干扰的信号也能进行滤波。对于数据平滑度较高有不错的效果。
但是这种滤波方式有几点是需要注意的。第一它的灵敏度低。这很好理解因为我们总是对N个数采取平均值算法所以新数据对平均值的影响有限数据变化不明显响应较慢而且N越大越明显。第二对偶然出现的脉冲性干扰的抑制作用较差。第三不易消除由于脉冲干扰所引起的采样值偏差。所以这种滤波器并不适用于脉冲干扰比较严重的场合。
欢迎关注