历史上的今天
今天是:2025年05月11日(星期日)
2019年05月11日 | 基于stm32的FIR滤波
2019-05-11 来源:eefocus
这两天有个地方用到了距离传感器,选用的传感器是夏普的近红外距离传感器。后来调试的时候发现传感器出来的信号除了有个随着距离规律变化的直流信号以外还有一个周期为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.。接下来就看看效果吧 前面一段是没有滤波的图像,后面一段是滤波以后的图像,把滤波以后的数据做一个平均处理就已经很稳定了。 总的来说还是很有成就感的。

史海拾趣
|
1 嵌入式软件开发流程 参照嵌入式软件的开发流程。第一步:工程建立和配置。第二步:编辑源文件。第三步:工程编译和链接。第四步:软件的调试。第五步:执行文件的固化。 在整个流程中,用户首先需要建立工程并对工程做初步的配置,包 ...… 查看全部问答> |
|
本帖最后由 jameswangsynnex 于 2015-3-3 20:02 编辑 接地是防雷的一个重要步骤,那么接地应该怎样操作呢?下面详细给大家介绍一下: 简述 让雷电流迅速导入大地以防止雷击灾害为目的接地叫做防雷接地。 组成 防雷接地装置包括以下部分 ...… 查看全部问答> |
|
为什么用quartus编译时总是出现这个错误,要崩溃了,求各位大侠指点一下啊 Error: Peak virtual memory: 165 megabytes… 查看全部问答> |
|
[cetk]cetk测试的时候wince test kit工具弹出对话框说遇到问题需要关闭 小弟请教各位一个问题: 条件: pc机上运行wince test kit工具(即cetest.exe),通过activesync连接到target device并检测到设备上的驱动模块 操作: 选择任一device driver,并开始测试,都会弹出一个对话框提示wince test kit遇到问题需要关闭 ...… 查看全部问答> |
|
我下载了一个wince6.0 环境下编译的spi驱动源码,请问可以直接加到wince 5.0平台上操作吗? 另外,我在wince5.0平台上用该驱动程序编译之后,成功下载内核映象,烧了内核映象,在2440开发板上也可以成功显示界面,但在VC上(导入了前面建的SDK)用 ...… 查看全部问答> |
|
1. 显示部分电路 本实验仪的LED显示电路和键盘电路如图1。显示控制的位码由74HC374输出,经MC1413反向驱动后,做LED的位选通信号。位选通信号也可做为键盘列扫描码,键盘扫描的行数据从74HC245读回,374 ...… 查看全部问答> |
|
有谁知道一般的科学计算器用的是什么型号的CPU?51系列还是其它的呢?谢谢! 自己想搭个硬件平台做科学计算器,把自己的计算器拆开只看到一个裸片,一块大黑痣里面是啥都看不到郁闷!有人知道一般的科学计算器都用什么cpu来实现么,不知c51能不能符合要求,因为c51对浮点的支持比较差,只支持到单精度,这对对精度要求较高的 ...… 查看全部问答> |
|
以HID的SETREPORT为例说明如何使用STM32的USB库支持控制端点0 首先我们先回顾一下控制端点的传输方式:控制端点的传输有三个阶段,SETUP阶段、数据阶段和状态阶段;数据阶段又分为数据入(DATA IN)和数据出(DATA OUT),控制端点传输可以没有数据阶段;状态阶段有状态入(STATUS IN)和状态出( ...… 查看全部问答> |




