历史上的今天
返回首页

历史上的今天

今天是:2024年10月07日(星期一)

正在发生

2018年10月07日 | 单片机简单数字滤波算法

2018-10-07 来源:eefocus

1)限幅滤波算法

该运算的过程中将两次相邻的采样相减,求出其增量,然后将增量的绝对值,与两次采样允许的最大差值A进行比较。A的大小由被测对象的具体情况而定,如果小于或等于允许的最大差值,则本次采样有效;否则取上次采样值作为本次数据的样本。


算法的程序代码如下:

#defineA //允许的最大差值

chardata; //上一次的数据

char filter()

{

chardatanew; //新数据变量

datanew=get_data(); //获得新数据变量

if((datanew-data)>A||(data-datanew>A))

return data;

else

returndatanew;

}

说明:限幅滤波法主要用于处理变化较为缓慢的数据,如温度、物体的位置等。使用时,关键要选取合适的门限制A。通常这可由经验数据获得,必要时可通过实验得到。

(2)中值滤波算法

该运算的过程是对某一参数连续采样N次(N一般为奇数),然后把N次采样的值按从小到大排列,再取中间值作为本次采样值,整个过程实际上是一个序列排序的过程。


算法的程序代码如下:#define N11 //定义获得的数据个数

char filter()

{

charvalue_buff[N]; //定义存储数据的数组

char count,i,j,temp;

for(count=0;count

{

value_buf[count]=get_data();

delay(); //如果采集数据比较慢,那么就需要延时或中断

}

for(j=0;j

{

for(value_buff[i]>value_buff[i+1]

{

temp=value_buff[i];

value_buff[i]=value_buff[i+1];

value_buff[i+1]=temp;

}

}

returnvalue_buff[(N-1)/2];

}

说明:中值滤波比较适用于去掉由偶然因素引起的波动和采样器不稳定而引起的脉动干扰。若被测量值变化比较慢,采用中值滤波法效果会比较好,但如果数据变化比较快,则不宜采用此方法。

(3)算术平均滤波算法

该算法的基本原理很简单,就是连续取N次采样值后进行算术平均。

算法的程序代码如下:char filter()

{

int sum=0;

for(count=0;count

{

sum+=get_data();

delay():

}

return (char)(sum/N);

}

说明:算术平均滤波算法适用于对具有随机干扰的信号进行滤波。这种信号的特点是有一个平均值,信号在某一数值附近上下波动。信号的平均平滑程度完全到决于N值。当N较大时,平滑度高,灵敏度低;当N较小时,平滑度低,但灵敏度高。为了方便求平均值,N一般取4、8、16、32之类的2的整数幂,以便在程序中用移位操作来代替除法。

(4)加权平均滤波算法

由于前面所说的“算术平均滤波算法”存在平滑度和灵敏度之间的矛盾。为了协调平滑度和灵敏度之间的关系,可采用加权平均滤波。它的原理是对连续N次采样值分别乘上不同的加权系数之后再求累加,加权系数一般先小后大,以突出后面若干采样的效果,加强系统对参数变化趋势的认识。各个加权系数均小于1的小数,且满足总和等于1的结束条件。这样加权运算之后的累加和即为有效采样值。其中加权平均数字滤波的数学模型是:


式中:D为N个采样值的加权平均值:XN-i为第N-i次采样值;N为采样次数;Ci为加权系数。加权系数Ci体现了各种采样值在平均值中所占的比例。一般来说采样次数越靠后,取的比例越大,这样可增加新采样在平均值中所占的比重。加权平均值滤波法可突出一部分信号抵制另一部分信号,以提高采样值变化的灵敏度。

程序代码如下:

char code jq[N]={1,2,3,4,5,6,7,8,9,10,11,12}; 

//code数组为加权系数表,存在程序存储区

char codesum_jq=1+2+3+4+5+6+7+8+9+10+11+12;

char filter()

{

char count;

char value_buff[N];

int sum=0;

for(count=0;count

{

value_buff[count]=get_data();

delay();

}

for(count=0;count

sum+=value_buff[count]*jq[count];

return(char)(sum/sum_jq);

}

(5)滑动平均滤波算法

以上介绍和各种平均滤波算法有一个共同点,即每获取一个有效采样值必须连续进行若干次采样,当采速度慢时,系统的实时得不到保证。这里介绍的滑动平均滤波算法只采样一次,将一次采样值和过去的若干次采样值一起求平均,得到的有效采样值即可投入使用。如果取N个采样值求平均,存储区中必须开辟N个数据的暂存区。每新采集一个数据便存入暂存区中,同时去掉一个最老数据,保存这N个数据始终是最新更新的数据。采用环型队列结构可以方便地实现这种数据存放方式。


程序代码如下:char value_buff[N];

char i=0;

char filter()

{

char count;

int sum=0;

value_buff[i++]=get_data();

if(i==N)

i=0;

for(count=0;count

sum=value_buff[count];

return (char)(sum/N);

}

(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以上的干搅信号应采用其他方式滤除。


推荐阅读

史海拾趣

High Voltage Semiconductor Inc公司的发展小趣事

为了更好地服务全球客户,美高测积极寻求与国际知名企业的合作。通过与半导体制造巨头台积电、英特尔等公司的合作,美高测不仅获得了先进的制造技术和市场洞察能力,还成功将其高压测试产品打入了这些巨头的供应链体系。同时,公司还与多个国家的科研机构建立了长期合作关系,共同开展前沿技术的研发和应用,进一步提升了公司的国际影响力。

蜂鸟无线公司的发展小趣事
为了减小PWM信号对电动机的干扰,可以在PWM信号输出端加入滤波电路,使输出电压更加平稳。
Dowosemi公司的发展小趣事

作为一家高新技术企业,Dowosemi公司深知研发投入对企业发展的重要性。他们每年都将大量的资金投入到研发领域,不断推出新的产品和解决方案。这些新产品不仅提升了公司的技术实力,也为公司带来了更多的市场机会。正是这种对研发的重视和投入,让Dowosemi公司在竞争激烈的电子行业中保持了持续的发展动力。

Fibrefab Limited公司的发展小趣事

Fibrefab Limited公司自创立之初,就致力于光纤通讯技术的研发。面对当时市场上光纤连接产品技术瓶颈,Fibrefab投入大量资源,成功研发出具有更高稳定性和更低损耗的光纤连接器。这一创新不仅解决了行业痛点,也帮助Fibrefab迅速在市场上树立起技术领先者的形象。随着技术的不断迭代升级,Fibrefab逐渐在光纤通讯领域确立了其市场领导地位。

BLACK&DECKER公司的发展小趣事

BLACK&DECKER一直致力于产品革新和专利申请。1914年,公司为世界第一台配有枪式手柄、扳机开关和通用马达的便携式手电钻申请了专利。这一发明极大地提高了工作效率,并在市场上取得了巨大的成功。此后,BLACK&DECKER不断推出创新产品,如1946年发明的世界上第一台专为家用消费者设计的便携式电钻,以及后续的电动篱笆剪、全绝缘电钻等一系列重要发明。

Diotec Electronics Corp公司的发展小趣事

随着环保意识的提高,Diotec开始关注绿色发展和社会责任。公司积极采用环保材料和生产工艺,减少生产过程中的环境污染。同时,Diotec还参与了一系列公益活动,为当地社区和环境保护事业做出了贡献。这些举措不仅提升了公司的社会形象,也为公司的长期发展奠定了基础。

问答坊 | AI 解惑

比较好

[:\'(][<:o)][<:o)]阿比较好…

查看全部问答>

解决垃圾短信--实名制

 随着移动通信的快速发展,一些不法分子利用移动通信网络发送了大量的非法或不健康的垃圾短信。这些垃圾短信已成为一种社会公害。因此,消除垃圾短信成为移动运营商和政府相关管理部门的一个重要任务。有专家提出,治理垃圾短信最有效的手段就 ...…

查看全部问答>

呼叫daicheng

一、vivi下如何用命令方式修改MACH_TYPE?用命令方式修改,就不用重新make vivi了吧? 二、我用的就是厂家提供的vivi镜像和内核镜像,可是烧进去不能启动。 你帮我看看下面这个分区有问题吗?我的flash是64M,可是vivi好像没有全部将它分区。 启动 ...…

查看全部问答>

dsp builder7.2中altbus没有Node Type选项是怎么回事?给点思路就给分!

我装的是matlab r2007a  quartus 7.2  dspbuilder 7.2 使用dspbuilder 时发现altbusaltbus没有Node Type选项,请问是怎么回事? 如果版本错了,问哪个版本合适,最好给个链接,不胜感激!…

查看全部问答>

PIC单片机用SPI 发送数据出现乱码问题

用的PIC单片机, 采用在定时器中断里面发送数据, 如果当前发送的数据块和下一个将要发送的数据块的时间间隔的间隔很短的话(10秒以内),不会出现乱码 只要时间间隔稍微长点(譬如23秒),就出现乱码了 想问下哪位大侠有此方面的经验,在 ...…

查看全部问答>

内核\协议栈\驱动

大家谈谈这三者的关系啊…

查看全部问答>

DP51 按键问题,当1个键按下时是什么判断的?部分程序有点看不懂,请教一下

#define RCtrl                0x10        void send_shift(uchar d) {         uchar i;         for(i = 0x80; i >= 0x01; i=i>> ...…

查看全部问答>

初步相识LM3S811,感觉设计门槛降低的真是惊人!----学习一

初步相识LM3S811,感觉设计门槛降低的真是惊人!,竟然各种需要的函数都设计好了,只要调用就可以了,根本不需要熟悉繁杂的寄存器。我把初次掌握的东西发给大家,供参考。 1、系统工作的时钟配置方法 在 clockInit( )函数里,库函数 SysCtlLDOSe ...…

查看全部问答>

如何用ad转换进行数据采集

请问个问题,我如何控制单片机,使单片机的采样速率达到1kps?能用定时器中断,如每隔1ms触发一次定时器中断,cpu来读取ad转换器中数据缓冲区的数据?比如ad转换的转换时间是40us,即一秒可以转换25k次模拟量,是不是如果ad转换器数据缓冲区中的数 ...…

查看全部问答>

可发电足球问世 30分钟产生电能点亮LED灯3小时

据国外媒体报道,踢足球充满乐趣且能锻炼身体,但现在它还能为你家提供电能。  非盈利社会企业Uncharted Play公司的八位哈佛大学毕业生组成的研究队伍发明出了能产生电力的足球,而它产生的电力可供一个小LED灯持续照明。研究人员将这个足球命名 ...…

查看全部问答>