数字滤波器设计——IIR 滤波器

news2024/11/15 20:53:49

数字滤波器设计实践介绍

此示例说明如何使用 Signal Processing Toolbox® 产品中的 designfilt 函数,根据频率响应设定设计 FIR 和 IIR 滤波器。该示例重点讲述低通滤波器,但大多数结果也适用于其他响应类型。

此示例主要介绍数字滤波器的设计,而不是其应用。如果您要了解有关数字滤波器应用的详细信息,请参阅数字滤波实践介绍。

 IIR 滤波器设计

FIR 滤波器的缺点之一是它们需要很大的滤波器阶数才能满足某些设计设定。如果波纹保持不变,滤波器阶数与过渡带宽度成反比。通过使用反馈,使用小得多的滤波器阶数即可满足一组设计设定。这就是 IIR 滤波器设计背后的思想。“无限冲激响应” (IIR) 一词源于这样的事实:当冲激施加到滤波器时,输出永远不会衰减到零。

  • 当计算资源非常宝贵时,IIR 滤波器非常有用。然而,稳定的因果 IIR 滤波器无法提供完美的线性相位。在要求相位线性的情况下,避免使用 IIR 设计。

使用 IIR 滤波器的另一个重要原因是相对于 FIR 滤波器,IIR 滤波器的群延迟较小,从而瞬时响应更短。

Butterworth 滤波器

Butterworth 滤波器是具有最大平坦度的 IIR 滤波器。通带和阻带中的平坦度导致过渡带非常宽。需要较大的阶数才能获得具有窄过渡带宽度的滤波器。

设计一个最小阶 Butterworth 滤波器,其通带频率为 100 Hz,阻带频率为 300 Hz,最大通带波纹为 1 dB,阻带衰减为 60 dB。采样率为 2 kHz。

Fp = 100;
Fst = 300;
Ap = 1;
Ast = 60;
Fs = 2e3;

dbutter = designfilt('lowpassiir','PassbandFrequency',Fp,...
  'StopbandFrequency',Fst,'PassbandRipple',Ap,...
  'StopbandAttenuation',Ast,'SampleRate',Fs,'DesignMethod','butter');

Chebyshev I 类滤波器

通过允许通带波纹,Chebyshev I 类滤波器的过渡带宽度小于同阶 Butterworth 滤波器。

  • Butterworth 和 Chebyshev I 类滤波器都具有最平坦的阻带。对于给定的滤波器阶数,需要在通带波纹和过渡带宽度之间进行权衡。

设计与上述 Butterworth 滤波器设定相同的 Chebyshev I 类滤波器。

dcheby1 = designfilt('lowpassiir','PassbandFrequency',Fp,...
  'StopbandFrequency',Fst,'PassbandRipple',Ap,...
  'StopbandAttenuation',Ast,'SampleRate',Fs,'DesignMethod','cheby1');

Chebyshev II 类滤波器

  • Chebyshev II 类滤波器具有最平坦的通带和等波纹阻带。

由于通常不需要非常大的衰减,我们可以通过允许一些阻带波纹,以相对较小的阶数获得所需的过渡带宽度。

设计一个最小阶 Chebyshev II 类滤波器,其设定与前面示例中相同。

dcheby2 = designfilt('lowpassiir','PassbandFrequency',Fp,...
  'StopbandFrequency',Fst,'PassbandRipple',Ap,...
  'StopbandAttenuation',Ast,'SampleRate',Fs,'DesignMethod','cheby2');

椭圆滤波器

椭圆滤波器通过允许通带和阻带中的波纹来泛化 Chebyshev 和 Butterworth 滤波器。随着波纹变小,椭圆滤波器可以任意逼近 Chebyshev 或 Butterworth 滤波器的幅值和相位响应。

  • 椭圆滤波器能够以最小的阶数获得给定的过渡带宽度。

dellip = designfilt('lowpassiir','PassbandFrequency',Fp,...
  'StopbandFrequency',Fst,'PassbandRipple',Ap,...
  'StopbandAttenuation',Ast,'SampleRate',Fs,'DesignMethod','ellip');

比较四个 IIR 滤波器的响应和阶数。

  • 对于相同的设定约束,Butterworth 方法产生最高阶,椭圆方法产生最小阶。

FilterOrders = [filtord(dbutter) filtord(dcheby1) filtord(dcheby2) filtord(dellip)]
FilterOrders = 1×4

     7     5     5     4
hfvt = fvtool(dbutter,dcheby1,dcheby2,dellip);
zoom(hfvt,[0 1e3 -80 2])

legend(hfvt,'Butterworth', 'Chebyshev Type I',...
  'Chebyshev Type II','Elliptic')

% 放大通带以查看波纹差异。
zoom(hfvt,[0 150 -3 2])

与通带或阻带设定完全匹配

对于最小阶设计,理想阶数需要舍入到下一个整数。这一额外的小数阶允许算法实际上超过设定。

  • 使用 'MatchExactly' 参数来约束设计算法,使其与一个频带完全匹配。另一个频带超出其设定。

默认情况下,Chebyshev I 类设计匹配通带,Butterworth 和 Chebyshev II 类匹配阻带,椭圆设计同时匹配通带和阻带(当超过阻带边缘频率时):

dellip1 = designfilt('lowpassiir','PassbandFrequency',Fp,...
  'StopbandFrequency',Fst,'PassbandRipple',Ap,...
  'StopbandAttenuation',Ast,'SampleRate',Fs,'DesignMethod','ellip',...
  'MatchExactly','passband');

dellip2 = designfilt('lowpassiir','PassbandFrequency',Fp,...
  'StopbandFrequency',Fst,'PassbandRipple',Ap,...
  'StopbandAttenuation',Ast,'SampleRate',Fs,'DesignMethod','ellip',...
  'MatchExactly','stopband');

hfvt = fvtool(dellip, dellip1, dellip2);
legend(hfvt,'Matched passband and stopband','Matched passband',...
  'Matched stopband');
zoom(hfvt,[0 1e3 -80 2])

匹配通带的设计和同时匹配通带与阻带的设计在 100 Hz 的通带频率值下具有正好 1 dB 的波纹。

群延迟比较

对于 IIR 滤波器,我们不仅需要考虑波纹/过渡带宽度的权衡,还需要考虑相位失真的程度。我们知道无法在整个奈奎斯特区间内都有线性相位。因此,我们可能想查看相位响应离线性有多远。实现此目的的一个好方法是观察(理想情况下为常量的)群延迟,查看它的平坦度。

比较上面设计的四个 IIR 滤波器的群延迟。

  • 如果关注相位问题,请记住 Butterworth 和 Chebyshev II 类设计具有最平坦的群延迟,因此引入的失真最小。

hfvt = fvtool(dbutter,dcheby1,dcheby2,dellip,'Analysis','grpdelay');
legend(hfvt,'Butterworth', 'Chebyshev Type I',...
  'Chebyshev Type II','Elliptic')

总结

在此示例中,您学习了如何使用 designfilt 获得各种具有不同约束和设计方法的低通 FIR 和 IIR 滤波器。designfilt 也可用于获得高通、带通、带阻、任意幅值、微分器和 Hilbert 设计。要了解有关所有可用选项的详细信息,请访问滤波器设计库。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

D3.js实现线条的流动效果(从一端移动到另一端并且变色)

参考&#xff1a; SVG&#xff1a;理解stroke-dasharray和stroke-dashoffset属性 使用SVG CSS实现动态霓虹灯文字效果 纯CSS实现帅气的SVG路径描边动画效果 实现的效果为&#xff1a;路径左移到完全看不见的地方&#xff0c;然后一边右移&#xff0c;一边从黑色变为红色 <…

社科院与杜兰大学金融管理硕士项目—人生的每一条路都可以看作是正确的路

成年人的世界里没有什么是容易的。生活中经常听到人说&#xff1a;早知道现在过得这么辛苦&#xff0c;当年真应该好好读书&#xff1b;早知道这个行业这么难出头&#xff0c;当年真不应该踏入这一行&#xff1b;早知道爱人这么不靠谱&#xff0c;当年不跟他结婚就好了……有时…

系统集成项目管理工程师软考知识点(每天更新)

第一章指路&#xff1a;系统集成项目管理工程师软考知识点&#xff08;第一章已完结&#xff09;_程序猿幼苗的博客-CSDN博客 第二章指路&#xff1a;系统集成项目管理工程师软考知识点&#xff08;第二章已完结&#xff09;_程序猿幼苗的博客-CSDN博客 本专栏将会更新完整~ …

【DRF开发手册】使用 Django Rest Framework 的 @action 定义自定义方法

本文节选自笔者博客&#xff1a; https://www.blog.zeeland.cn/archives/so3f209hfeac &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是Zeeland&#xff0c;全栈领域优质创作者。&#x1f4dd; CSDN主页&#xff1a;Zeeland&#x1f525;&#x1f4e3; 我的博客&…

C++ Primer Plus(第6版) 全书重点学习笔记

目录 第10章 对象和类 10.1 过程性编程和面向对象编程 10.2 抽象和类 10.2.1 类简介 10.2.2 实现类成员函数 10.3 类的构造函数和析构函数 10.3.1 声明和定义构造函数 10.3.2 使用构造函数 10.3.3 默认构造函数 10.3.4 析构函数 10.4 this指针 10.5 对象数组 10.6 …

[长安杯 2021学生组]baigei

Index 前言介绍漏洞 利用思路利用过程一.编写交互函数二.填充Tcache Bin三.释放Tcache Bin四.获取Libc地址五.Tcache Bin Attack六.完整EXP&#xff1a; 前言 最近有点迷茫&#xff0c;开始放松自己了。 心态还不是很对&#xff0c;需要继续调整。 介绍 本题是一题经典的堆题…

Java学习笔记:内部类,静态内部类,匿名内部类

​这是本人学习的总结&#xff0c;主要学习资料如下 疯狂Java讲义第三版&#xff0c;李刚编&#xff0c;电子工业出版社出版 目录 1、内部类1.1、内部类简介1.2、内部类与外部类的关系和区别&#xff1a;1.3、内部类的语法 2、 非静态内部类3、静态内部类4、匿名内部类 1、内部…

“链引擎”入驻案例 | 每天超过35万条存证上链,长安链支撑链上价值流动

引言 长安链“链引擎”计划&#xff08;Powered by Chainmaker&#xff09;(简称&#xff1a;PBC计划)是由长安链生态联盟发起的一项应用赋能计划&#xff0c;旨在以长安链技术体系为核心支撑&#xff0c;汇聚产业各方力量&#xff0c;为应用方提供技术、品牌、生态等支持&…

Keil系列教程03_主窗口和工具栏详细说明

1写在前面 本文先让大家简单认识一下Keil的主窗口界面&#xff0c;然后再进一步认识Keil的文件、编译和调试工具栏。 Toolbars工具栏就是在菜单下面的两行快捷图标按钮&#xff0c;这些快捷按钮之所以在工具栏里面&#xff0c;在于它们使用的频率较高。比如保存按钮、编译按钮…

ChatGPT智能AI对话软件

ChatGPT智能AI的市场前景非常广阔&#xff0c;因为随着人工智能技术的不断发展和应用&#xff0c;人们对于智能AI对话系统的需求也越来越大。未来&#xff0c;智能AI对话系统将在各个领域得到广泛应用&#xff0c;例如智能客服、智能家居、自动驾驶等等&#xff0c;这些都有助于…

STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机

STM32 HAL库PID控制电机 第二章 TB6612FNG芯片驱动GB37-520电机(HAL库) 1 电路图 2 TB6612简介 TB6612是双驱动&#xff0c;可同时驱动两个电机 STBY&#xff1a;接单片机的IO口清零电机全部停止&#xff0c;置1通过AIN1 AIN2&#xff0c;BIN1&#xff0c;BIN2 来控制正反转…

linux下静态库和动态库的制作

一.静态库的制作 linux下库的命名规则&#xff1a;在linux下以libXXX.a为命名&#xff0c;lib&#xff08;library&#xff09;前缀是固定的&#xff0c;代表这个是库。接下来介绍静态库的制作流程。 1.1通过gcc编译获得.o文件 一般源程序经过预处理完成头文件和宏的展开&am…

运行时内存数据区之虚拟机栈——局部变量表

这篇内容十分重要,文字也很多,仔细阅读后,你必定有所收获! 基本内容 与程序计数器一样&#xff0c;Java虚拟机栈&#xff08;Java Virtual Machine Stack&#xff09;也是线程私有的&#xff0c;它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型&#xf…

我想知道,就目前形势而言,学java好还是C++好?

前言 就现实点看看&#xff0c;可以对比现在Java和C的市场占有率&#xff0c;可以看到&#xff0c;到目前为止&#xff0c;Java在国内编程语言的市场仍然是占据着大头&#xff0c;在招聘当中Java的人数占有率仍然是遥遥领先于C&#xff0c;Java目前开阔的市场以及其巨大的岗位…

阿里,字节,拼多多,B站挨个面试一遍,你们猜哪个待遇最高?

我面试的是软件测试岗位&#xff0c;去年中旬的时候从原来的公司离职了&#xff0c;不是工作不好&#xff0c;而是公司发展速度太慢&#xff0c;自己干了几年&#xff0c;也没有太大的成长。以我目前的工作经验和实力&#xff0c;我认为准备一两个月&#xff0c;进大厂不是什么…

VS2022下载安装与基本使用(写C语言)

最近遇到一种问题&#xff0c;就是想要写一写C语言的代码&#xff0c;但是网页编辑器功能不全&#xff0c;GCC需要安装Liunx系统&#xff0c;VS又体量太大过于复杂&#xff0c;用keil又需要连接硬件&#xff0c;所以比较纠结。 工作中通常使用的是Keil&#xff0c;但是如果有时…

有记忆功能的动态通讯录

目录 前言1.进行文件操作的改造1.1contact.h的改造1.2contact.c的改造1.3test.c的改造 2.带文件操作的动态通讯录源码2.1contact.h2.2contact.c2.3test.c 总结 前言 前面我们一起学习的动态通讯录&#xff0c;一退出此程序联系人的信息就不见了&#xff1b;学习了文件操作操作后…

cocos creator 中使用web worker

1.应用场景&#xff1a;一些阻塞线程的方法可以放到worker里面去执行&#xff0c;不影响主线程&#xff0c;避免页面卡顿。 啊&#xff0c;有人就会说了&#xff0c;setTimeout不就可以了吗&#xff0c;还有什么async... JS本身就是单线程设计的&#xff0c;不管你是setTimeo…

EIGRP配置邻居关系详解

1.2 EIGRP 邻居关系 1.2.1 实验目的 通过 EIGRP 邻居建立的相关实验&#xff0c;学习到如何调整 EIGRP 的 HELLO 和 HOLD 时间&#xff0c;使用 被动接口阻止不必要的邻居关系&#xff0c;认证 EIGRP 邻居&#xff0c;静态邻居的配置以及哪些参数影响 EIGRP 邻居建立。 1.2.…

【数据库】Redis数据类型详解

目录一、5种基本数据类型1. String2. List3. Hash4. Set5. ZSet二、3种特殊类型1. Bitmap2. HyperLogLog3. Geospatial index一、5种基本数据类型 Redis 共有 5 种基本数据结构&#xff1a;String&#xff08;字符串&#xff09;、List&#xff08;列表&#xff09;、Set&#…