基于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的问题

推荐阅读最新更新时间:2024-11-12 07:36

STM32 IAP 串口在线升级源码详解
下面着重介绍下本人修改源代码部分,下载官方例程,本人使用的是STM32F103C8T6芯片,修改ROM空间大小0x2000, 修改宏定义 更改启动文件,更改方法:更改的文件鼠标右键弹出窗口- Options for File ‘statup_stm32f10x_md.s’… - 选中红框里的两项(‘√’第一次选中后为深黑色,再次点击为浅灰色,浅灰色时点击确认,其中的原因我也不太懂,你们可以试试) 修改堆栈地址0x8002000 至此,BootLoader修改完毕直接下载进去就可以了。 下面修改测试程序,我用STM32CUBEMAX直接配置了一个流水灯程序,修改程序: 主函数添加地址偏
[单片机]
<font color='red'>STM32</font> IAP 串口在线升级源码详解
Robomaster-stm32-PWM学习笔记(stm32控制pwm输出)
学习笔记: 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。 将通用 定时器 分为四个部分: 1-选择 时钟 2-时基电路 3-输入捕获 4-输出比较 实践1-pwm- led 闪烁 要求产生周期为200ms,占空比为50%的PWM 信号 来控制led灯。 1.cubemax配置 由原理图可知,led引脚复用为 ti m5 周期为200ms,占空比为50%,Tim5挂在APB1总线上,CLK =
[单片机]
Robomaster-stm32-PWM学习笔记(<font color='red'>stm32</font>控制pwm输出)
stm32专题三十六:MDK编译过程和文件类型(二)
MDK工程的文件类型: 1 下图为 Project 目录下的工程文件 实际上,只需要有 unprojx 文件,就可以恢复整个工程。 具体描述: 2 源文件 3 output 和 list 文件 详细分析: 1 uvprojx 文件 uvprojx 文件就是我们平时双击打开的工程文件,它记录了整个工程的结构,如芯片类型、工程包含了哪些源文件等内容。 可以使用vscode直接打开 uvprojx ,来看一下里面的具体内容: 2 uvoptx 文件 uvoptx 文件记录了工程的配置选项,如下载器的类型、变量跟踪配置、断点位置以及当前已打开的文件等。 我们在程序 main.c 的第81行
[单片机]
<font color='red'>stm32</font>专题三十六:MDK编译过程和文件类型(二)
stm32库应用】SD驱动移植(基于SDIO外设)
来处理下SD卡这个东西(后期还将做fatfs文件系统移植) 图1 SD接口图 图1 的接口图不是完全正确的,每个PIN上都必须接一个50K的上拉电阻; 在ST官方提供的库里面有很多意见做好的外设,LCD,EEPROM,等等,当然我们比较幸运,也包括SD卡,这次移植基于3.5的库 我们要移植的文件在这个STM32F10x_StdPeriph_Lib_V3.5.0UtilitiesSTM32_EVAL下: 图2 移植需要的文件 因为我的板子是stm32f103vet6跟STM3210E_EVAL比较相近,所以选这个; 图3 common目录 把stm32_eval_spi_sd.c / stm32_ev
[单片机]
【<font color='red'>stm32</font>库应用】SD驱动移植(基于SDIO外设)
STM32 定时器输出比较时间模式
之前在《SM32定时器要点》中曾经讲过,定时器可以配置成六种模式,如下: TIM_OCMode 函数库描述 解释 TIM_OCMode_Timing TIM输出比较时间模式 冻结,输出比较不起作用 TIM_OOCMode_Active TIM输出比较主动模式 当比较发生时,强制输出高电平 TIM_OCMode_Inactiive TIM输出比较非主动模式 当比较发生时,强制输出低电平 TIM_OCMode_Toggle TIM输出比较触发模式 当比较发生时,输出翻转 TIM_OCMode_PWM1 TIM脉冲宽
[单片机]
<font color='red'>STM32</font> 定时器输出比较时间模式
STM32 UART2程序
USART1程序很多,看看USART2程序。注意红色部分,首先要使能相关端口的时钟。 因为USART2可以映射成不同的端口,所以要端口映射。 结合你自己的开发板,设置正确的映射口.(正点原子的是PA03PA02.) STM32F103ZE默认的USART2就是PA03PA02,如果配置映射,USART2端口是PD05PD06了。 程序在正点原子开发板SRAM中调试通过,开发环境IAR5.30. void USART2_Initialise( u32 bound ) { GPIO_InitTypeDef GPIO_InitStructure;//I/O¿ú3õê¼»ˉ½á11ìå NVIC_InitTypeDef N
[单片机]
基于STM32实现简单的CAN通讯过程
CAN通讯在车辆工程中用的非常广泛,本文将基于stm32实现简单的can通讯过程。 首先了解一下CAN通讯的主要特点: 1、 数据通信没有主从之分,任意一个节点可以向任何其他(一个或多个)节点发起数据通信,靠各个节点信息优先级先后顺序来决定通信次序。 2、 支持时间触发通信功能, 发送报文的优先级可软件配置。多个节点同时发起通信时,优先级低的避让优先级高的,不会对通信线路造成拥塞。 3、 CAN 是一种多主总线,通信介质可以是双绞线、同轴电缆或光导纤维。通信距离最远可达10KM(速率低于5Kbps),速率可达到1Mbps(通信距离小于40M)。 4、 CAN 总线采用了多主竞争式总线结构,具有多主站运行和分散仲
[单片机]
基于<font color='red'>STM32</font>实现简单的CAN通讯过程
STM32 掉电检测程序
当VDD下降到PVD阀值以下或当VDD上升到PVD阀值之上时,根据外部中断第16线的上升/下降边沿触发设置,就会产生PVD中断 void PVD_IRQHandler(void) { led_ctrl(LED1, ON); if(PWR_GetFlagStatus(PWR_FLAG_PVDO)) { MSD0_WriteSingleBlock(1, buf); } EXTI_ClearITPendingBit(EXTI_Line16); } void PVD_Init(void) { EXTI_InitTypeDef EXTI_InitStructure; NVIC_InitTypeD
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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