基于stm32的FIR滤波

发布者:tyloo820最新更新时间:2019-05-11 来源: eefocus关键字:stm32  FIR滤波 手机看文章 扫描二维码
随时随地手机看文章

这两天有个地方用到了距离传感器,选用的传感器是夏普的近红外距离传感器。后来调试的时候发现传感器出来的信号除了有个随着距离规律变化的直流信号以外还有一个周期为1ms的尖峰脉冲信号形状如下图示

这样的波形会影响采集数据的结果,硬件上已经固定了,所以就选择从软件方面来寻找解决方案。


之前涉及的软件滤波无非就是采用求平均值的方法或者用排序的方法取中间值。但是发现这种传统的方法都不能解决问题,无奈之下只好请出FIR了。在网上找到一段关于FIR滤波器的C代码,


const double Gains[65] = {

  0.0009479362407674,0.0009929350550642, 0.003930214337694,0.0004266602318381,

   0.002659113001781, 0.005817509119983,-0.000228463397681, 0.006702278150725,

   0.008005149622821,-0.0008554957856821,  0.01422482817203, 0.008473933262289,

  -1.620146125747e-17,  0.02516227532517, 0.004919104877225, 0.005096205867541,

    0.03751085310479,-0.004203950025341,  0.01799639204041,   0.0469989686148,

   -0.01876523334251,  0.04251211195407,  0.04699049465662, -0.03660751758108,

    0.08342623579446,  0.02691060679784, -0.05397754228244,   0.1541577471136,

   -0.04192656769609, -0.06664039473937,   0.3591036736045,  -0.5005151692802,

     0.6415102143687,  -0.5005151692802,   0.3591036736045, -0.06664039473937,

   -0.04192656769609,   0.1541577471136, -0.05397754228244,  0.02691060679784,

    0.08342623579446, -0.03660751758108,  0.04699049465662,  0.04251211195407,

   -0.01876523334251,   0.0469989686148,  0.01799639204041,-0.004203950025341,

    0.03751085310479, 0.005096205867541, 0.004919104877225,  0.02516227532517,

  -1.620146125747e-17, 0.008473933262289,  0.01422482817203,-0.0008554957856821,

   0.008005149622821, 0.006702278150725,-0.000228463397681, 0.005817509119983,

   0.002659113001781,0.0004266602318381, 0.003930214337694,0.0009929350550642,

  0.0009479362407674

};

#define ORDER        64                       //阶数



 double Buffer[ORDER];        //采样历史数据





double Fir(double Input)

{

        double Output=0.0;        //数据输出

        unsigned int Index;                //下标索引

        

        //采样数据移位

        for(Index=ORDER;Index>0;Index--) 

Buffer[Index]=Buffer[Index-1];


        Buffer[0]=Input;

        

        //计算输出

        for(Index=0;Index        {

                Output+=Gains[Index]*Buffer[Index];

        }

        

        return Output;

}


给出的代码是一个64阶的带阻滤波器。代码很好理解,需要用matlab生成系数。matlab设置的步骤如下


打开matlab(我用的2013b)在APPS种找到“Filter Designer & Analysis”


其中红色方框标记出来的是需要设计的,Filter Order设计滤波器的阶数,Fs是指的采样频率,Fc是截止频率。设计好以后直接点击“Design Filter”按键然后点击Targets ->


Generate C header.。接下来就看看效果吧

前面一段是没有滤波的图像,后面一段是滤波以后的图像,把滤波以后的数据做一个平均处理就已经很稳定了。


总的来说还是很有成就感的。


关键字:stm32  FIR滤波 引用地址:基于stm32的FIR滤波

上一篇:STM32学习记录——开发环境的搭建
下一篇:有关于stm32 串口DMA的问题

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved