描述

在设计单片机程序的过程中,经常需要利用ADC采集外界模拟信号。有一些信号我们比较关注它的直流与低频分量,希望将高频噪声滤除,就需要借助低通滤波器。

低通滤波器常见的利用电子电路实现的方式是一阶RC无源滤波器。简单讲就是这样:

RC滤波器的各类计算略,有需要请谷歌。

RC滤波器用于单片机ADC输入有许多缺点。如果R的取值较小,就要求C较大,同时输入信号阻抗不能过大;如果R的取值较大,则ADC采样瞬间释放的电荷会使得端口电压升高而无法在采样时间内释放到稳定水平。这会导致采样精度问题。

而即便使用一个运放来缓冲RC滤波器的输出,再接入ADC,也只解决了输入阻抗问题,ADC电路受外界干扰仍然会在转换结果中产生噪声。因此,我们希望在单片机内部利用程序来实现低通滤波,彻底摆脱高频噪声。

数字低通滤波器有两种形式,IIR和FIR。

IIR是无限脉冲响应滤波器,它的特点是输出与无限久以前的输入有关。这就如同上面RC滤波器的响应,随着时间流逝,输出电压只会无限接近于输入电压,而不会等于。

用c语言实现IIR低通很简单:

int last = 0;

//下面的函数以固定频率运行,函数输出就是IIR低通滤波器的输出。

int lowpass()

{

int this = ADC();

last = (this * 1 + last * 15) / 16; //新的last 是旧的last * 15 / 16 + this * 1 / 16

return last;

}

如果对函数返回值作图,得到的波形就会和RC滤波器的波形一样。要改变截止频率,只需要改变函数第二句中新的last的组成(例如改成3/4和1/4,截止频率会提高)。

值得注意的是,上述代码使用了整数乘法和2的n次幂除法,因此编译优化后,在8位平台上运行超快。如果你使用带有浮点运算模块的平台,请直接使用浮点数。

IIR的特点是节省内存,上面的滤波器只使用了两个变量。

IIR的缺点是不稳定。如果你把15改成17,显然这个滤波器的输出会在一段时间后溢出。你必须负责保证IIR滤波器稳定。

FIR是有限脉冲响应滤波器,它的特点是输出与有限久以前(一段时间内)的输入有关。由于数字系统中采样是离散的,每一段时间内的采样数是固定的,所以FIR滤波器的每一个输出值,可通过对之前的若干个数量固定的采样值进行计算得到。特别是,因为对固定数量的采样值的计算在FPGA电路中可以并行实现,因此FIR滤波器常常被用于基于FPGA的数字信号处理系统。相对的,IIR滤波器不依赖之前的采样,但依赖于之前的滤波器状态(存在反馈),因此在大部分比一阶低通滤波器复杂的应用场合,IIR滤波器的各项特性没有FIR稳定(若要实现稳定,对计算精度要求较高),而且计算起来比FIR要慢,设计上也没有通用性。

下面我用c语言实现一个最简单的FIR低通。我们将最近的8次采样值加起来,求平均值,作为输出。

int buf[8];

int lowpass()

{

int k = 7;

while(k--)

buf[k] = buf[k-1]; //将buf[6] 移到buf[7], buf[5] 移到buf[6],等等,以空出buf[0]

}

buf[0] = ADC();

return (buf[0] + buf[1] +.。.+ buf[7]) / 8;

}

这个滤波器的时域图像有点像这样:

值得注意的是,上面这个函数可以被进一步简化,以加速计算。上面这种滤波器有另一个名字:滑动平均滤波器,这个滤波器大部分股民应该很熟悉。

虽然时域图像很美观,但是这个滤波器的频域图像一点也不美观:

可见,随着点数的增加,图像看起来只是从右向左缩水,对高频的抑制并不好。

所以如果想要获得比较好的低通效果,不应该增加点数,而应该将多个一样的FIR滤波器串联使用(一个的输出作为下一个的输入)。

注:pass是“遍”的意思,表示迭代次数。

上面是串联使用的幅频响应。而时域图像也很美观:

结尾给出的是写这篇文章时随手找到的资料。大家一定要学会使用谷歌搜索英文关键词,因为老外比我们对待知识的态度更严肃也更开放。

刚才的滑动平均滤波器,时间复杂度是O(n)(设每次处理n个采样)。

可以优化为O(1)的形式:

int buf[8];

int k=0;

int result=0;

int lowpass()

{

result -= buf[k];

buf[k] = ADC();

result += buf[k];

k = (k + 1) % 8;

return result;

}

打开APP精彩内容

点击阅读全文

fir低通滤波器c语言,大神教你:FIR与IIR低通滤波器的最简最快实现相关推荐

  1. linux 计算器 c语言,大神教你如何用C语言实现科学计算器

    原标题:大神教你如何用C语言实现科学计算器 用C实现的科学计算器 使用C语言写的科学计算器,可以实现四则运算.三角函数运算.指对数运算:优先级正确:能智能屏蔽空格,能识别输入错误和运算错误,能实现继续 ...

  2. 大神教芯片数据手册怎么读

    题目:大神教芯片数据手册怎么读 [摘要]数据手册怎么看? 先看芯片特性.应用场合.内部框图,有一个宏观的了解. 重点关注芯片参数,同时参考手册给出的参数图. 选定器件后,研究管脚定义.推荐的PCB l ...

  3. 狼人杀服务器维护要多久,狼人杀:简单局的效率慢?大神教你如何速推简单局...

    狼人杀:简单局的效率慢?大神教你如何速推简单局 狼人杀这款以逻辑推理为主的大型桌游不仅受到广大年轻人的追捧,并快速成为了桌游界的标杆,而说到狼人杀的玩法相信大家都知道,要么狼人杀死人类,要么人类解决掉 ...

  4. 文章如何做伪原创 SEO大神教你几招做原创网站文章的心得

    想要创作出好的文章并被百度所喜欢,就非常需要SEO的优化能力,以及要对文章进行塬创或伪塬创,那么,如何做伪塬创文章?以及如何做好塬创网站文章呢?对此,本文小编就为大家带来了几招做"塬创&qu ...

  5. mc服务器出生地修改,《我的世界》MC出生地太坑爹怎么办?大神教你一个指令就搞定了!...

    <我的世界>MC出生地太坑爹怎么办?大神教你一个指令就搞定了!在沙盒游戏<我的世界>里面,玩家们刚开始进入游戏的地方就是出生地,又叫做出生点.这些出生地是系统随机安排生成的地方 ...

  6. win7如何开启无线网卡服务器,大神教你win7无线网卡怎么设置wifi

    wifi上网已经风靡全世界,可是电脑开启wifi是需要无线网卡的,那么win7无线网卡怎么设置wifi呢?这就有点深度了,大家都知道,小编最擅长深入浅出地教大家一些知识,今天就给大家带来大神教你win ...

  7. win10添加网络打印机_大神教你设置 win10系统安装打印机及驱动的详细方案 -win10使用教程...

    人吃五谷杂粮会生病,电脑也一样.工作运行时间久了就会出现很多的问题,比如win10系统安装打印机及驱动这样的状况,大部分伙计都是第一次看到win10系统安装打印机及驱动这样的事情,想请高手帮忙解决wi ...

  8. java魔剑天使_大天使之剑大神教你打造牛逼魔剑士

    大天使之剑大神教你打造牛逼魔剑士 大天使之剑哪个职业厉害?大天使之剑魔剑士怎么加点升级快?下面来看看大天使之剑大神教你打造牛逼魔剑士吧,有点长,希望对大家有帮助! 魔剑士是这个游戏升级最为快速的职业, ...

  9. pscc2018安装服务器无响应,强大的功能无法使用,大神教你一招解决PSCC2018无法安装扩展插件...

    原标题:强大的功能无法使用,大神教你一招解决PSCC2018无法安装扩展插件 详细讲解,希望对你有所帮助. 随着Adobe大魔王把PS小公举更新到了CC 2018版本以后,各种好用的插件.滤镜.扩展功 ...

  10. 立刷提现显示服务器繁忙,为什么我的网页显示服务器繁忙,求大神教破除方法...

    查看: 2449|回复: 12 为什么我的网页显示服务器繁忙,求大神教破除方法 当前离线UID经验22459 粮饷920 最后登录2021-8-4 在线时间1 小时 空城绝唱, 积分 22459, 距 ...

最新文章

  1. java获取当前路径
  2. TiXml使用详解(转)
  3. 【python图像处理】几何图形的绘制与文字的绘制(ImageDraw类详解)
  4. IDEA+scala+spark程序开发流程
  5. SAE去掉index.php实现自定义固定链接
  6. 移动端开发touchstart,touchmove,touchend事件详解和项目
  7. servlet 验证生命周期过程调用方法的次数
  8. 突发!Log4j 爆“核弹级”漏洞,Flink、Kafka等至少十多个项目受影响,微博、京东、网易等大厂都发起应急响应...
  9. 均匀B样条和准均匀B样条
  10. 走迷宫算法1(递归 非最短路径)
  11. SqlServer数据库 设置查询结果字体
  12. 主数据同步与分发实现
  13. 手写RPC(五) 核心模块网络协议模块编写 ---- 自定义协议
  14. iOS 11 NSPhotoLibraryAddUsageDescription 错误的解决办法
  15. eclipse配置https
  16. 基本数据类型 int操作 bool布尔操作 str字符串操作 for in 循环
  17. video 宽高自适应_HTML5/CSS/jQuery video大小屏幕自适应及获取视频宽高
  18. idea更改MySQL依赖版本时错误:Duplicated tag: ‘properties‘ (position: START_TAG seen ...
  19. Nooploop空循环 TOFSense-M 点阵激光测距传感器 模块 红外测距测高
  20. 西藏全国计算机等级考试系统,2019西藏计算机等级考试报名今天开始

热门文章

  1. 单片机c语言数字频率计的课程设计,课程设计基于单片机的简易数字频率计报告.doc...
  2. http请求webservice接口
  3. 计算机网络教程第五版课后答案(第一章)
  4. PCB检查流程checklist
  5. solidworks二次开发 学习日记--1 开发方式
  6. webqq机器人java_一步一步来做WebQQ机器人-(四)(获取好友列表和群列表)
  7. xclient 已停止工作
  8. 怎么才可以使用 IPX 协议???
  9. 2017第25届春季中西部(重庆)医疗器械展览会会刊(参展商名录)
  10. Ember Model