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工具设计滤波器并获取这些系数。

请确保根据实际应用调整滤波器阶数、类型和系数,同时注意边界条件的处理,特别是对于实时流数据的第一段样本,可能需要预先填充足够的“零”值来初始化滤波器状态。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/698183.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大数据快速使用Kerberos认证集群

一、创建安全集群并登录其Manager 创建安全集群&#xff0c;开启“Kerberos认证“参数开关&#xff0c;并配置“密码“、“确认密码“参数。该密码用于登录Manager&#xff0c;请妥善保管。 登录MRS管理控制台页面。 单击“集群列表“&#xff0c;在“现有集群“列表&#xf…

【web性能】什么是图层?图层创建的条件?

CSS图层 浏览器在渲染一个页面时&#xff0c;会将页面分为很多个图层&#xff0c;图层有大有小&#xff0c;每个图层上有一个或多个节点。在渲染DOM的时候&#xff0c;浏览器所做的工作实际上是&#xff1a; 获取DOM后分割为多个图层&#xff1b;对每个图层的节点计算样式结果…

thinkphp6.0版本下子查询sql处理

目录 一&#xff1a;背景 二&#xff1a;查询实例 三&#xff1a;总结 一&#xff1a;背景 我们在实际业务的开发过程中&#xff0c;经常会碰到这样的场景&#xff0c;查询某些部门的客户信息&#xff0c;查询下过订单的客户信息。这里查询客户信息实际上就用到了子查询&…

打造智慧校园信息系统,提升学校科技实力

在如今数字化的时代&#xff0c;打造智慧校园信息系统已成为提升学校科技实力的关键。随着科技的迅猛发展&#xff0c;学校需要跟上时代步伐&#xff0c;利用先进技术建设一个高效、智能的信息系统&#xff0c;为学生、教师和管理人员提供更好的学习和工作环境。 智慧校园信息系…

专家解读 | NIST网络安全框架(3):层级配置

NIST CSF在核心部分提供了六个类别的关键功能和子功能&#xff0c;并围绕CSF的使用提供了层级&#xff08;Tier&#xff09;和配置&#xff08;Profile&#xff09;两种工具&#xff0c;使不同组织和用户更方便有效地使用CSF&#xff0c;本文将深入探讨CSF层级和配置的主要内容…

01、Linux网络设置

目录 1.1 查看及测试网络 1.1.1 查看网络配置 1、查看网络接口地址 2、查看主机状态 3、查看路由表条目 4、查看网络连接qing 1.1.2 测试网络连接 1.测试网络连接 2.跟踪数据包的路由路径 3.测试DNS域名解析 1.2 设置网络地址参数 1.2.1 使用网络配置命令 1.修改网卡…

干货 | 2024元宇宙技术融合与新质生产力的创新实践(免费下载)

【1】关注本公众号&#xff0c;转发当前文章到微信朋友圈 【2】私信发送 【3】获取本方案PDF下载链接&#xff0c;直接下载即可。 如需下载本方案PPT/WORD原格式&#xff0c;请加入微信扫描以下方案驿站知识星球&#xff0c;获取上万份PPT/WORD解决方案&#xff01;&#xff…

Apple - IOKit Fundamentals

本文翻译整理自&#xff1a;IOKit Fundamentals &#xff08;Updated: 2014-04-09 https://developer.apple.com/library/archive/documentation/DeviceDrivers/Conceptual/IOKitFundamentals/Introduction/Introduction.html 文章目录 一、I/O Kit 基础知识简介1、谁应该阅读本…

【Pyqt6 学习笔记】实现串口调试助手,并将接收到数据模拟键盘输出

文章目录 代码示例main.pyscreen_shot_module.pyqrcmd.pyuntitled.pyuntitled.ui 本文内容是 【Pyqt6 学习笔记】DIY一个二维码解析生成小工具的延申&#xff0c;在原来的基础上实现了串口调试助手功能&#xff0c;并利用 pywinauto的 keyboard模块将接收到数据模拟键盘输出…

计算机网络9——无线网络和移动网络3 蜂窝移动通信网

文章目录 一、蜂窝无线通信技术的发展简介1、蜂窝移动通信系统问世2、2G 蜂窝移动通信系统3、数据通信被引入移动通信系统4、3G 蜂窝移动通信系统4、4G 蜂窝移动通信系统 一、蜂窝无线通信技术的发展简介 1、蜂窝移动通信系统问世 移动通信的种类很多&#xff0c;如蜂窝移动通…

爱德华三坐标软件ACdmis.AC-dmis密码注册机

爱德华三坐标软件 AC-DMIS 是一款功能强大的三坐标测量软件&#xff0c;具有以下特点&#xff1a; • 支持多种测量模式&#xff1a;包括接触式测量、非接触式测量、复合式测量等&#xff0c;可以满足不同类型工件的测量需求。 • 高精度测量&#xff1a;采用先进的测量算法和…

选专业,优先考虑个人兴趣还是考虑就业?

2024高考季&#xff0c;站在人生的重要展示点上&#xff0c;不管是家长还是学生都非常紧张&#xff0c;尤其是在面临专业选择的时候&#xff0c;大家既要考虑个人兴趣又要考虑未来的就业需求&#xff0c;所以很多人都会因此陷入纠结。 我们在选择专业的时候&#xff0c;到底是…

神奇!你见过生成Prompt的Prompt?

目录 先上干货 这个Prompt是怎么来的 道路是曲折的 总结 PART/ 01 先上干货 你怎么会想到这些场景呢&#xff0c;比如健身计划、英语学习、旅游规划等等&#xff0c;其实挺不好意思的&#xff0c;大家被我骗了&#xff0c;这些都是我使用一个Prompt解决的。 对&#xf…

【perl】环境搭建

1、Vscode Strawberry Perl 此过程与tcl环境搭建很类似&#xff0c;请参考我的这篇文章&#xff1a; 【vscode】 与 【tclsh】 联合搭建tcl开发环境_tclsh软件-CSDN博客 perl语言的解释器可以选择&#xff0c;strawberry perl。Strawberry Perl for Windows - Releases。 …

硬件开发笔记(十七):RK3568底板电路串口、485、usb原理图详解

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/139589308 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

李廉洋:6.11黄金原油持续震荡上行,今日行情走势分析策略。

黄金消息面分析&#xff1a;上周黄金市场的走势受到了PCE通胀数据和美联储政策预期的显着影响。尽管市场对黄金的长期看涨情绪依然存在&#xff0c;但短期内金价的波动性预计将持续。4月份的PCE通胀数据显示价格压力有所降温&#xff0c;这一结果与分析师预期一致&#xff0c;但…

网络AI 大模型十大问题深度分析 2024

源自&#xff1a;AI云原生智能算力架构 注&#xff1a;若出现无法显示完全的情况&#xff0c;可搜索“人工智能技术与咨询”查看完整文章 4. 总结与展望 NetGPT 是移动网络和大模型间的双向融合趋势&#xff0c;在这份白皮书中&#xff0c;我们深入探讨了 NetGPT的十大基础问…

脉动圆形加载动画

效果图: 完整代码: <!DOCTYPE html> <html> <head><meta charset="UTF-8" /><title>脉动圆形加载动画</title><style type="text/css">body {background: #ECF0F1;display: flex;justify-content: center;al…

Qt中解决编译中文乱码和编译失败的问题

解决方法 1.使用#pragma execution_character_set(“utf-8”) QT5中在cpp中使用#pragma execution_character_set(“utf-8”)解决中文乱码&#xff0c;不过这里要求该源代码必须保存成带Bom的utf-8格式&#xff0c;这也是有些在网上下载的代码&#xff0c;加上这句源代码后还…

超强 BAAS 神器:支持自动生成API、对象存储、静态托管,云函数!

想象一下&#xff0c;你是一名开发者&#xff0c;你有一种强大的神器&#xff0c;可以让你摆脱繁琐的服务搭建和接口开发&#xff0c;免费使用众多第三方认证服务、对象存储、云函数和静态部署。这就是MemFire Cloud&#xff01; MemFire Cloud是懒人开发者的福音&#xff0c;一…