IIR和FIR两种滤波器有什么区别?
概念的区分
IIR(Infinite Impulse Response,无限脉冲响应)和FIR(Finite Impulse Response,有限脉冲响应)滤波器是两种常见的数字信号处理滤波器类型,它们在结构、性能和用途上有显著区别:
结构差异:
IIR滤波器具有反馈结构,即滤波器的输出不仅取决于当前和过去输入信号的值,还包括过去的输出信号。这意味着IIR滤波器的冲激响应永远不会完全衰减到零,理论上无穷期延续。
FIR滤波器则不包含反馈环路,其输出只依赖于当前和过去的输入信号。FIR滤波器的冲激响应在有限时间内会衰减至零。
稳定性:
FIR滤波器总是稳定的,因为没有反馈回路,不存在发散的可能性。
IIR滤波器的稳定性取决于其极点位置,如果所有的极点都在单位圆内,则滤波器是稳定的;否则,可能会导致不稳定。
相位响应:
FIR滤波器具有线性相位响应,即所有频率的信号通过滤波器后,其相位延迟与频率成线性关系,这对于保持信号的相位同步和时间对齐很重要。
IIR滤波器一般具有非线性相位响应,除非特别设计,否则相位延迟会随着频率变化,这在某些应用中可能会带来问题。
滤波特性:
IIR滤波器因其反馈结构可以实现较高的滤波效率,用较少的阶数就能达到所需的滤波特性,比如陡峭的滚降特性或接近理想滤波器的响应曲线。
FIR滤波器虽然阶数较高时才能达到类似的效果,但因其线性相位和无发散风险,更适合需要精确相位和稳态无误差的场合。
设计灵活性:
FIR滤波器的设计通常更为直观和灵活,易于实现严格的带宽、阻带衰减和线性相位响应。
IIR滤波器可以基于经典滤波器设计方法(如巴特沃兹、切比雪夫等)实现特定频率响应,但其非线性相位特性增加了设计难度。
在工程实践中,选择IIR还是FIR滤波器通常取决于具体的应用需求。如果对相位线性度要求较高,或担心稳定性问题,通常会选择FIR滤波器。而在对计算资源有限,需要以较低阶数实现较强滤波效果,且对相位非线性有一定的容忍度时,IIR滤波器则是一个合适的选择。在现代DSP应用中,由于计算能力的增强,FIR滤波器因其稳定性、线性相位和易于设计的特点而越来越受到青睐。
C语言实现
实现IIR(无限脉冲响应)和FIR(有限脉冲响应)带通滤波器通常涉及到计算每个新样本点时的滤波操作。以下是对这两种滤波器的基本实现框架的概述以及示例C代码片段:
IIR带通滤波器

IIR滤波器通常通过递归的方式实现,即输出不仅取决于当前的输入样本,还取决于过去若干个输入样本以及过去若干个输出样本。巴特沃斯、切比雪夫、椭圆滤波器等经典滤波器结构都可以被用来设计IIR带通滤波器。以下是一个二阶Butterworth IIR带通滤波器的例子:
#include <math.h>// 假设我们已经有了滤波器的系数
#define B0 0.5 * (1.0 + sqrt(2)) // 振幅系数B0
#define B1 0.0 // 振幅系数B1
#define B2 (-1.0 * B0) // 振幅系数B2
#define A1 (-1.0 * sqrt(2) / 2.0) // 阻尼系数A1
#define A2 (1.0 - sqrt(2) / 2.0) // 阻尼系数A2// 初始化历史状态变量
float x_n_1 = 0.0; // 上一次输入样本
float x_n_2 = 0.0; // 上上次输入样本
float y_n_1 = 0.0; // 上一次输出样本
float y_n_2 = 0.0; // 上上次输出样本// IIR带通滤波器核心函数
float iir_bandpass_filter(float input)
{// 计算当前输出float output = B0 * input + B1 * x_n_1 + B2 * x_n_2 - A1 * y_n_1 - A2 * y_n_2;// 更新历史状态x_n_2 = x_n_1;x_n_1 = input;y_n_2 = y_n_1;y_n_1 = output;return output;
}// 使用滤波器
int main()
{float input_signal[signal_length];float output_signal[signal_length];// ... 填充input_signal...for (int i = 0; i < signal_length; ++i){output_signal[i] = iir_bandpass_filter(input_signal[i]);}// ... 处理output_signal...return 0;
}
注意,实际使用时你需要根据具体的设计参数(如截止频率、品质因数等)计算合适的滤波器系数B0、B1、B2、A1和A2。
FIR带通滤波器

FIR滤波器没有反馈部分,仅依赖于当前和过去若干个输入样本。带通FIR滤波器通常通过卷积实现,系数来自于窗函数法或其他设计方法。
#include <stdio.h>// 滤波器系数数组h[]
#define FILTER_ORDER 51 // FIR滤波器阶数
float h[FILTER_ORDER]; // 初始化滤波器系数
// ...省略了根据设计要求填充滤波器系数的过程...// FIR带通滤波器核心函数
void fir_bandpass_filter(float input, float* state, float* output)
{static const int STATE_SIZE = FILTER_ORDER - 1; // FIR滤波器的状态大小static float input_state[STATE_SIZE]; // 存储过去输入样本的状态// 移除最早的一个输入样本,添加最新的输入样本memmove(input_state + 1, input_state, sizeof(float) * (STATE_SIZE - 1));input_state[0] = input;// FIR滤波输出计算*output = 0.0;for (int i = 0; i < FILTER_ORDER; ++i){*output += h[i] * input_state[i];}
}// 使用滤波器
int main()
{float input_signal[signal_length];float output_signal[signal_length];float filter_state[FILTER_ORDER - 1] = {0}; // 初始化状态为零// ... 填充input_signal...for (int i = 0; i < signal_length; ++i){fir_bandpass_filter(input_signal[i], filter_state, &output_signal[i]);}// ... 处理output_signal...return 0;
}
同样,这里的FIR滤波器系数`h[]`需要根据目标频率响应曲线设计得到。在实际项目中,可以使用像MATLAB、Python的SciPy库或者其他DSP工具设计滤波器并获取这些系数。
请确保根据实际应用调整滤波器阶数、类型和系数,同时注意边界条件的处理,特别是对于实时流数据的第一段样本,可能需要预先填充足够的“零”值来初始化滤波器状态。
相关文章:
IIR和FIR两种滤波器有什么区别?
概念的区分 IIR(Infinite Impulse Response,无限脉冲响应)和FIR(Finite Impulse Response,有限脉冲响应)滤波器是两种常见的数字信号处理滤波器类型,它们在结构、性能和用途上有显著区别&#…...
让GNSSRTK不再难【第二天-第4部分】
第12讲 GNSS授时与PPS 12.1 为什么需要高精度时间 授时的传统理解就是时间传递或者对时。比如以前手机没这么方便时,大家还都使用石英钟手表看时间时,大家都习惯晚上七点准时对着中央一套的报时,来校准你家的机械钟或者挂钟,这就…...
「OC」UI练习(一)—— 登陆界面
「OC」登陆界面 明确要求 一个登陆界面的组成,用户名提示以及输入框,密码提示提示以及输入框,登陆按钮,以及注册按钮,根据以上要求我们将我们的组件设置为成员变量。 //viewControl.h #import <UIKit/UIKit.h>…...
基于机器学习和深度学习的NASA涡扇发动机剩余使用寿命预测(C-MAPSS数据集,Python代码,ipynb 文件)
以美国航空航天局提供的航空涡扇发动机退化数据集为研究对象,该数据集包含多台发动机从启动到失效期间多个运行周期的多源传感器时序状态监测数据,它们共同表征了发动机的性能退化情况。为减小计算成本,需要对原始多源传感器监测数据进行数据…...
计算机组成原理-常见计算题含IEE754
一、补码加减运算 二、溢出判断 采用一位符号位 采用双符号位 三、定点数的移位运算 算术右移 算数左移 反码的算术移位 补码的算术移位 四、浮点数的表示 一个右规的例子 五、IEEE754 移码...
InnoDB存储引擎非常重要的一个机制--MVCC(多版本并发控制)
Mysql是如何实现隔离性的?(锁MVCC) 隔离性是指一个事务内部的操作以及操作的数据对正在进行的其他事务是隔离的,并发执行的各个事务之间不能相互干扰。隔离性可以防止多个事务并发执行时,可能存在交叉执行导致数据的不…...
【DevOps】服务器硬件基础知识
目录 前言 1、处理器(CPU):服务器的“大脑” 2、内存(RAM):服务器的“工作台” 3、存储(Storage):服务器的“仓库” 4、 网络接口(NIC)&…...
6.10 c语言
7.1 if-else语句 简化形式 if(表达式)语句块 阶梯形式 if(表达式1)语句块1 else if(表达式2)语句块2 嵌套形式 if() if() 语句1 else 语句2 else if() 语句3 else 语句4 表达式一般情况下为逻辑表达式或关系表达式 #include <stdio.h>//从小到大排序,输出顺…...
jenkins插件之Jdepend
JDepend插件是一个为构建生成JDepend报告的插件。 安装插件 JDepend Dashboard -->> 系统管理 -->> 插件管理 -->> Available plugins 搜索 Jdepend, 点击安装构建步骤新增执行shell #执行pdepend if docker exec phpfpm82 /tmp/composer/vendor/bin/pdepe…...
vue3之基于el-image实现图片预览
实现的功能: 图片可放大预览,支持放大、缩小、向左向右旋转查看可点击任意一张图后进行左右切换查看大图 主要使用的方法:splice和concat 主要代码 // template中 <div><el-imagev-for"(item, index) in imgsData":src&q…...
wooyun_2015_110216-Elasticsearch-vulfocus
1.原理 ElasticSearch具有备份数据的功能,用户可以传入一个路径,让其将数据备份到该路径下,且文件名和后缀都可控。 所以,如果同文件系统下还跑着其他服务,如Tomcat、PHP等,我们可以利用ElasticSearch的备…...
Fedora的远程桌面
要在 Fedora 40 上开启远程桌面功能。 首先,要确保已安装 gnome-remote-desktop 和 vino 包。 这些软件包通常默认安装在 Fedora 的 GNOME 桌面环境中。 可以按照以下步骤操作: 1、判断电脑是否安装了 gnome-remote-desktop 和 vino 包: tomfedora:…...
CSS id选择器
目录 任务描述 相关知识 id选择器 id选择器语法 类选择器与id选择器的区别 编程要求 任务描述 在本关中,你将通过id选择器的方式完成页面菜单栏样式布局,栏目导航等任务。 完成任务之后,基本页面效果如下: 动态效果如下&am…...
22.搭积木
上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/717 题目描述 小爱用积木搭起一座金字塔。为…...
手机投屏到电脑时,手机提示连接失败
前言 注意,本方法建立在你已经通过其他帖子等解决了前置条件的情况下,手机提示连接失败情况下,包括但不限于关闭防火墙、安装无线投屏工具、手机和电脑连接在同一个WiFi频段下、关闭杀毒软件等。 具体操作方法 1、请进入设置 > 系统和…...
软件测试--Mysql快速入门
文章目录 软件测试-mysql快速入门sql主要划分mysql常用的数据类型sql基本操作常用字段的约束:连接查询mysql内置函数存储过程视图事务索引 软件测试-mysql快速入门 sql主要划分 sql语言主要分为: DQL:数据查询语言,用于对数据进…...
什么是PV操作
PV操作是一种在操作系统中用于同步和互斥的机制,它基于信号量(Semaphore)的概念。在并发编程中,多个进程或线程可能会同时访问共享资源,PV操作可以用来确保这些访问是同步的,以防止竞态条件和数据不一致的问题。 PV操作包括两个原子操作: P操作(Proberen,测试):这…...
差动放大器
差动器的出现是为了解决直接耦合电路存在的零点漂移问题,另外,差动放大器还有灵活的输入,输出方式。 一,基本差动放大器 差动放大器在电路结构上具有对称性,三极管VT1,VT2同型号,R1R2,R3R4,R5…...
【数据结构与算法 经典例题】括号匹配问题
💓 博客主页:倔强的石头的CSDN主页 📝Gitee主页:倔强的石头的gitee主页 ⏩ 文章专栏:《数据结构与算法 经典例题》C语言 期待您的关注 目录 一、问题描述 二、解题思路 🍃破解之道 🍃…...
2024年6月最新开源电视影视TVAPP原生源码和后台管理平台源码及完整教程
本套源码为本人维护更新完善半年左右的还在使用开发的源码,与市面上倒卖的残次品不一样,没有可比性,向下兼容安卓4.0,向上兼容安卓13以上TV电视系统, 完全无闪退,弹窗报错,卡死、异常死循环残次…...
终极Chrome全页截图指南:一键保存完整网页内容的高效方案
终极Chrome全页截图指南:一键保存完整网页内容的高效方案 【免费下载链接】full-page-screen-capture-chrome-extension One-click full page screen captures in Google Chrome 项目地址: https://gitcode.com/gh_mirrors/fu/full-page-screen-capture-chrome-ex…...
多层PCB结构与设计核心技术解析
多层PCB内部结构解析与设计指南1. 多层PCB技术概述1.1 多层PCB的基本概念现代电子设备对电路板的要求越来越高,多层PCB已成为复杂电子系统的标准配置。与单层或双层PCB相比,多层PCB通过在绝缘基材上叠加多个导电层,实现了更高的布线密度和更优…...
3个步骤打造静音散热系统:FanControl 262版智能风扇调控方案全解析
3个步骤打造静音散热系统:FanControl 262版智能风扇调控方案全解析 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub…...
从‘水变油’到‘大师一问三不知’:求实学风如何塑造科学巨匠与避免历史弯路
1. 科学史上的两副面孔:浮夸与求实 1993年,一场名为"水变油"的闹剧在国内掀起轩然大波。某"发明家"声称发明了能将水转化为燃料的"神奇添加剂",甚至获得了部分政府部门的支持。这个明显违背能量守恒定律的&quo…...
SpringBoot+Vue员工绩效系统实战:从数据库设计到权限控制的完整避坑指南
SpringBootVue员工绩效系统实战:从数据库设计到权限控制的完整避坑指南 在数字化转型浪潮下,企业绩效管理系统正从传统的Excel表格升级为智能化平台。本文将带您从零构建一个具备多维度考核、动态权限控制和可视化分析的绩效系统,重点解决实际…...
Matlab实战:5步搞定微电网源储荷协调调度(附完整CPLEX调用代码)
Matlab实战:微电网源储荷协调调度的5个工程化技巧 微电网调度是新能源时代的核心技术难题之一。面对风光发电的波动性和负荷需求的多变性,如何实现源、储、荷三者的动态平衡,成为电力工程师们每天都要应对的挑战。不同于学术论文中复杂的理论…...
手把手教你用Python打造一个简易图片颜色替换工具(含Tkinter GUI界面)
用Python和Tkinter构建智能图片颜色替换工具:从零到一的完整开发指南 在数字图像处理领域,颜色替换是一个基础但极其实用的功能。想象一下,你有一张产品照片需要快速调整主色调,或者需要将证件照的背景色统一更换——传统方式可能…...
从IMU初始化到点云去畸变:深入Fast-LIO2的传感器融合核心流程
从IMU初始化到点云去畸变:Fast-LIO2传感器融合全流程解析 在自动驾驶和机器人定位领域,激光雷达与IMU的紧耦合系统正成为高精度状态估计的主流方案。Fast-LIO2作为这一技术路线的代表,其核心创新在于将IMU的动力学特性与激光点云几何特征深度…...
告别裸机思维:在GD32单片机上用FreeRTOS管理多个传感器(附源码)
从裸机到多任务:GD32FreeRTOS传感器管理系统实战 在嵌入式开发中,当系统需要同时处理多个外设时,传统的裸机编程往往会陷入复杂的状态机迷宫。我曾在一个环境监测项目中深有体会——当温湿度传感器、光照传感器、按键和OLED显示屏需要协同工作…...
zotero-style:智能文献管理在学术研究中的创新实践
zotero-style:智能文献管理在学术研究中的创新实践 【免费下载链接】zotero-style zotero-style - 一个 Zotero 插件,提供了一系列功能来增强 Zotero 的用户体验,如阅读进度可视化和标签管理,适合研究人员和学者。 项目地址: ht…...
