• 周五. 6 月 14th, 2024

技术分享 嵌入式常见滤波算法的Matlab实现

admin

11 月 2, 2023 #postman, #嵌, #嵌入式系统

随着基于模型设计的广泛应用,模型在环仿真逐渐增多。 今天我们介绍几种常用的嵌入式滤波算法的matlab实现。

1、采用数字滤波算法克服随机干扰引起的误差,具有以下优点:

1、数字滤波不需要其他硬件成本,只使用一次计算过程,可靠性高,不存在阻抗匹配问题。 特别是,数字滤波可以过滤频率很低的信号,这是模拟滤波器无法做到的。

2、数字滤波采用软件算法实现,多个输入通道可以共享一个滤波程序,降低系统开支。

3、只要适当改变滤波器的滤波程序或操作,就可以很容易地改变其滤波特性,这对于滤除低频干扰和随机信号会有更大的效果。

4、单片机系统中常用的滤波算法有限幅滤波、中值滤波、算术平均滤波、加权平均滤波、滑动平均滤波等。

%%代码测试框架

clearsignal=wgn(1,1000,10);signal=10+signal;signalFited=zeros(1,1000);for i=1:1000signalFited(i)=MyFilter(@LowPasFilter,signal(i)); % 改一下句柄名字就可以了。endplot(signal);hold on;plot(signalFited);function output = MyFilter(fun,input)%MyFilter 滤波测试函数% MyFilter.m output=fun(input);end

 

2. 限制过滤

在此操作期间,将两个相邻样本相减以求出增量,然后将增量的绝对值与两个样本之间的最大允许差异maxErr进行比较。 maxErr的大小由被测对象的具体情况决定。 若小于或等于最大允许差值,则本次抽样有效; 否则,使用最后一次采样值作为该数据的样本。

限制滤波法主要用于处理变化缓慢的数据,如温度、物体位置等。使用时关键是选择合适的门限maxErr。 通常这可以从经验数据中获得,如有必要,可以通过实验获得。

function out = LimRanFilter(input)%LimRan 限幅度滤波函数% LimRanFilter.mmaxErr=5;%允许最大误差 persistent last;if isempty(last) last=input;end%上一次的值if((input-last)>maxErr(last-input)>maxErr)out=last;else out=input;endend

 

算法嵌入开发式教学_嵌入式计算机开发_嵌入式开发算法/

3. 中值滤波

这个操作的过程就是对某个参数连续采样N次(N一般为奇数),然后将N个采样值从小到大排列,然后取中间的值作为当前采样值。 整个过程实际上是一个序列。 排序的过程。

中值滤波更适合去除偶然因素引起的波动和采样器不稳定引起的脉动干扰。 如果测量值变化缓慢,中值滤波法会更好,但如果数据变化很快,则不宜使用该方法。

function output= MeanFilter(input)%MeanFilter 中值滤波% MeanFilter.mpersistent buff;if isempty(buff) buff=[200000];end%选择序列if(buff(1)<7) buff(buff(1))=input; buff(buff(1))=buff(buff(1))+1;elsefor i=2:5if(buff(i)>buff(i+1)) temp=buff(i); buff(i)=buff(i+1); buff(i+1)=temp;endend buff(2:6)=0; buff(1)=2;end%初始化滤波缓冲区output=buff(4);end

 

算法嵌入开发式教学_嵌入式计算机开发_嵌入式开发算法/

4. 移动平均过滤

平均滤波算法有一个特点,每次获得有效样本值时,必须连续进行多次采样。 当采样速度较慢时,系统的实时性无法保证。 这里介绍的滑动平均滤波算法只采样一次,将一次采样值和过去的几次采样值一起平均,得到的有效采样值即可投入使用。 如果对N个样本值进行平均,则必须在存储区域中开辟N个数据的临时存储区域。 每采集到一条新数据,就将其存入暂存区,同时删除最旧的数据。 保存的N条数据始终是最新更新的数据。 这种数据存储方法可以使用环形队列结构轻松实现。

functionoutput= MovAveFilter(input)%MovAveFilter滑动平均滤波%´MovAveFilter.mpersistentbuff;ifisempty(buff)buff=[ 0 0 0 0 0 ];end%滑动窗口persistentnumOfBuff;ifisempty(numOfBuff)numOfBuff=0;end%´当前窗口元素persistentk;ifisempty(k)k=1;end%计数器buff(k)=input;k=mod((k+1),5)+1;numOfBuff=numOfBuff+1;if(numOfBuff>5)numOfBuff=5;endoutput=sum(buff)/numOfBuff;end

 

嵌入式计算机开发_算法嵌入开发式教学_嵌入式开发算法/

5. 低通滤波

普通硬件RC低通滤波器的微分方程表示为差分方程,可以用软件算法来模拟硬件滤波的功能。 推导后,低通滤波算法如下:

Yn=a*Xn+(1-a)*Yn-1

式中,Xn——本次采样值

Yn-1——最后一次滤波器输出值;

a——滤波器系数,其值通常远小于1;

Yn——本次滤波的输出值。

functionoutput= LowPasFilter(input)%LowPasFilter低通滤波%´LowPasFilter.mpersistentyn0;ifisempty(yn0)yn0=0;end%上次输出值a=0.5;%滤波系数output=input*a+yn0*(1-a);yn0=output;end

 

嵌入式计算机开发_算法嵌入开发式教学_嵌入式开发算法/

这几种滤波算法比较常用,也比较方便仿真和编写。 根据实际情况可以使用扩展卡尔曼等的实现。 在一般领域,这些过滤算法已经可以取得很好的效果。

阿木实验室致力于前沿IT技术教育和智能装备,让机器人研发更高效!