历史上的今天
今天是:2025年04月01日(星期二)
2020年04月01日 | 单片机ADC采样算法----一阶低通滤波
2020-04-01 来源:eefocus
关于低通滤波,先看一下百度百科上的定义。


算法实现的公式如下:
y(n) = q*x(n) + (1-q)*y(n-1)
其中Y(n)为输出,x(n)为输入,y(n-1)为上一次输出值,其中q为滤波系数。取值范围为0--1.
也就是说若q=0.5时,这个公式代表的意思就是取本次采样值的50%,加上上一次采样值的50%,做为本次的采样结果。也就是说每次的采样结果都和上一次的采样结果相关。
看一下在单片机中C代码的实现
//参数:com 为采样的原始数值
//返回值:iData 经过一阶滤波后的采样值
unsigned int lowV( unsigned int com )
{
static unsigned int iLastData; //上一次值
unsigned int iData; //本次计算值
float dPower = 0.1; //滤波系数
iData = ( com * dPower ) + ( 1 - dPower ) * iLastData; //计算
iLastData = iData; //存贮本次数据
return iData; //返回数据
}
//主函数
void main( void )
{
while( 1 )
{
val1 = ReadVol_CH3() ; // 读取AD采样值
val3 = lowV( val1 ); // 采样值经过一阶滤波算法
printf("A%drn",val1); // 打印采样值
printf("B%drn",val3); // 打印经过滤波算法后的采样值
}
}
通过ADC采样输入电压,然后将采样值经过一阶滤波运算,通过串口分别打印采样值和经过一阶滤波运算后的值。
通过串口波形显示软件可以看到采样的结果为:

当滤波系数q=0.1时,本次采样数据占采样结果的10%,上一次采样数据占采样结果的90%,也就是说采样数据突变时对采样结果影响不大,采样的波形比较平滑。
由上面的波形也可以看出,蓝色波形为原始数据波形,波动范围比较大,橙色波形为经过一阶滤波算法后的波形,波形比较平稳。
将q值改为0.5时,看看采样情况。

可以看到当滤波系数增大到0.5时,本次采样数据和上次采样数据对结果的影响分别占50%。通过波形可以看到,经过滤波后的波形也出现了波动,但是波动范围相对于原始波形来说小了一点。
将q值继续增大,改为0.9时,看看采样情况。

通过波形可以看到将采样系数增大后,本次采样数据对采样结果影响占到了90%,经过一阶滤波后的波形基本和原始波形保持了同步,实时性比较好,但是稳定性会差一点。
通过不同滤波系数的对比发现:
滤波系数越小,滤波结果越平稳,但是灵敏度越低;
滤波系数越大,灵敏度越高,但是滤波结果越不稳定。
在实际应用中根据不同的需求,选择合适的滤波系数,以满足系统要求。
史海拾趣
|
选择要有明确性,然而在某些常用的软件中,并没有这样的概念,只要选择一框,就只能全部在一起了,不能针对个别的、同类的进行选择。这样的情况,在PCB设计人员看来,其实有些是很无奈的。然而用了某些软件,却也只能这样。 图2& ...… 查看全部问答> |
|
VxWorks程序员指南_Wind River 一本绝版的vxworks教程~~~听说翻译的比较差,但是看英文版还是挺累的……一般人都吃不消吧 【作 者】(美)Wind River著;王金刚等译 【丛书名】VxWorks开发人员指南丛书 【形态项】 403 ; 26cm 【出版项】 ...… 查看全部问答> |
|
也许大家在看到“披露外商半导体公司在华设立研发中心的居心?”这个标题时,会觉得博主是个愤青,可是我实在不知道用什么标题了。请大家将就吧。 10年前,当我刚进入半导体产业时,我对半导体是七窃通了六窃。 笔者在上篇“外企在华设立研发中心 ...… 查看全部问答> |
|
现象: 在网上下载的1138的tft2.4的例子同一型号的屏在8962上就运行不起来 sd_FAT32驱动的例子也在我的板子上运行不起来 但是针对8962的例子就完全可以 时钟频率(分频方式都一样)、i/o差不多什么都一样的,具体会有什么不 ...… 查看全部问答> |
|
把WINCE 5.0可以用的驱动移植到6.0上. 1,加LAN相关上网组件 2,加CS8900驱动到driver目录下,并修改dir 3,修改SMDK****.dat SET NO_CS8900= 4,修改注册表:IOBASE和sysintr及TCP/IP设置 5,修改 #define BSP_BASE_REG_PA_CS8900A_IOBASE& ...… 查看全部问答> |
|
下面是我的一段测试代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.IO.Ports; namespac ...… 查看全部问答> |
|
各位 我在键盘驱动中用Keybd_event模拟键盘向操作系统发送 “上下左右”和一些其他按键消息。 为什么我按下左右按键发送“左、右”都是正常的, 而当按下上下按键时: 发送“上”的时候却是先向“右”移动,一直移到头再向上移动 同样:发送 ...… 查看全部问答> |
|
最近准备用MSP430F1611(供电3.3V),准备利用它的IIC模块读取另一芯片(供电+5V)输出的IIC信号.很困惑,两个芯片的供电电压不同,IIC信号的幅值应当也不同,,能否通过将MSP430F1611的SDA和CLK信号线上拉到+5V,让这两个芯片正常通信.… 查看全部问答> |
|
ARM CPU的工作模式: 1.User:该模式为Unprivileged modes,该模式下的程序不能访问受保护的系统资源,不能更改CPU工作模式。如果需要跳出该模式,程序需要抛出一个异常(Exception),使CPU进入\"Exception\"模式。\"User\"模式下可以使用的 ...… 查看全部问答> |




