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

news2024/9/24 13:21:47

数字滤波器设计实践介绍

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

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

FIR 滤波器设计

低通滤波器设定

在理想情况下,低通滤波器使信号中低于指定截止频率 ωc 的所有频率分量保持不变,并拒绝高于 ωc 的所有分量。由于实现理想低通滤波器所需的冲激响应是无限长的,因此无法设计出理想的 FIR 低通滤波器。理想冲激响应的有限长度逼近会导致滤波器的通带 (ω<ωc) 和阻带 (ω>ωc) 中都出现波纹,并导致通带和阻带之间的过渡带宽度非零。

当用有限冲激响应逼近时,通带/阻带波纹和过渡带宽度都是不希望出现的,且不可避免地与理想低通滤波器存在偏差。下图说明了这些偏差:

  • 实际的 FIR 设计通常包括过渡带宽度和最大通带和阻带波纹不超过允许值的滤波器。除了这些设计设定之外,还必须选择滤波器阶数,它等效于选择截断的冲激响应的长度。

滤波器设计中的设计设定可形象地比喻为下图所示的三角形,每个设定对应其中一个角。

三角形相当于选择设计设定时可用的自由度。由于各角之和是固定值,因此最多只能选择两个设定的值。第三个设定将由特定设计算法确定。此外,就像三角形中的各角一样,如果我们使一个设定更大/更小,它将影响其他一个或两个设定。

FIR 滤波器广受欢迎,因为它们非常稳定,并可以设计成具有线性相位的滤波器。尽管如此,这些滤波器仍可能有长瞬时响应,在某些应用中的计算成本可能很高。

最小阶 FIR 设计

通过指定通带和阻带频率以及通带波纹和阻带衰减,可以获得最小阶设计。然后,设计算法会选择符合设定的最小滤波器长度。

设计最小阶低通 FIR 滤波器,其通带频率为 0.37*pi 弧度/采样点,阻带频率为 0.43*pi 弧度/采样点(因此过渡带宽度等于 0.06*pi 弧度/采样点),通带波纹为 1 dB,阻带衰减为 30 dB。

Fpass = 0.37; 
Fstop = 0.43;
Ap = 1;
Ast = 30;

d = designfilt('lowpassfir','PassbandFrequency',Fpass,...
  'StopbandFrequency',Fstop,'PassbandRipple',Ap,'StopbandAttenuation',Ast);

hfvt = fvtool(d);

% 可以使用 filtord 函数查询生成的滤波器阶数。
N = filtord(d);
disp(N);
% 可以使用 info 函数获取用于设计滤波器的参数的有关信息
info(d)

默认情况下,designfilt 函数会选择一个等波纹设计算法。线性相位等波纹滤波器是令人满意的,因为对于给定阶数,这种滤波器与理想滤波器的最大可能偏差最小。 

然而,请注意,也可以使用 Kaiser 窗获得最小阶设计。即使 Kaiser 窗方法对相同设定产生更大的滤波器阶数,当设计设定非常严格时,该算法的计算成本更低,并且不太可能出现收敛问题。如果应用需要非常窄的过渡带宽度或非常大的阻带衰减,就可能出现这种情况。

使用 Kaiser 窗方法设计与上述设定相同的滤波器,并将其响应与等波纹滤波器进行比较。

dk = designfilt('lowpassfir','PassbandFrequency',Fpass,...
  'StopbandFrequency',Fstop,'PassbandRipple',Ap,...
  'StopbandAttenuation',Ast, 'DesignMethod', 'kaiserwin');

addfilter(hfvt,dk);
legend(hfvt,'Equiripple design', 'Kaiser window design')

N = filtord(dk)

以赫兹为单位指定频率参数

如果知道滤波器工作将使用的采样率,可以指定采样率和频率(以赫兹为单位)。重新设计采样率为 2 kHz 的最小阶等波纹滤波器。

Fpass = 370;
Fstop = 430;
Ap = 1;
Ast = 30;
Fs = 2000; 

d = designfilt('lowpassfir','PassbandFrequency',Fpass,...
  'StopbandFrequency',Fstop,'PassbandRipple',Ap,...
  'StopbandAttenuation',Ast,'SampleRate',Fs);
  
hfvt = fvtool(d);

固定阶、固定过渡带宽度

固定阶设计适用于对计算负载敏感或对滤波器系数个数有限制的应用。一种选择是以控制通带波纹/阻带衰减为代价来固定过渡带宽度。

假设一个 30 阶低通 FIR 滤波器,其通带频率为 370 Hz,阻带频率为 430 Hz,采样率为 2 kHz。对于这组特定设定,可使用两种设计方法:等波纹法和最小二乘法。下面我们为每种方法设计一个滤波器,并比较结果。

N = 30;
Fpass = 370;
Fstop = 430;
Fs = 2000; 

% Design method defaults to 'equiripple' when omitted
deq = designfilt('lowpassfir','FilterOrder',N,'PassbandFrequency',Fpass,...
  'StopbandFrequency',Fstop,'SampleRate',Fs);

dls = designfilt('lowpassfir','FilterOrder',N,'PassbandFrequency',Fpass,...
  'StopbandFrequency',Fstop,'SampleRate',Fs,'DesignMethod','ls');

hfvt = fvtool(deq,dls);
legend(hfvt,'Equiripple design', 'Least-squares design')

等波纹滤波器非常适合必须满足特定容差的应用,例如设计具有给定最小阻带衰减或给定最大通带波纹的滤波器。另一方面,如果我们想最小化通带/阻带中(理想滤波器和实际滤波器之间)的误差能量,这些设计可能并不理想。

  • 如果您要尽可能降低某个频带内信号的能量,请使用最小二乘设计。

在上述示例中,设计的滤波器在通带和阻带中具有相同的波纹。我们可以使用权重来减少其中一个频带内的波纹,同时保持滤波器阶数固定。例如,如果您希望阻带波纹是通带波纹的十分之一,则为阻带赋予的权重必须是通带权重的十倍。根据上述情况重新设计等波纹滤波器。

deqw = designfilt('lowpassfir','FilterOrder',N,'PassbandFrequency',Fpass,...
  'StopbandFrequency',Fstop,'SampleRate',Fs,...
  'PassbandWeight',1,'StopbandWeight',10);

hfvt = fvtool(deq,deqw);
legend(hfvt,'Equiripple design', 'Equiripple design with weighted stopband')

固定阶、固定截止频率

您可以使用窗口设计方法设计具有固定滤波器阶数和截止频率的滤波器。

  • 您可以使用不同窗口来控制阻带衰减,同时保持滤波器阶数不变。

例如,假设有截止频率为 60 Hz、采样率为 1 kHz 的 100 阶低通 FIR 滤波器。比较使用汉明窗和使用旁瓣衰减为 90 dB 的切比雪夫窗产生的设计。

dhamming = designfilt('lowpassfir','FilterOrder',100,'CutoffFrequency',60,...
  'SampleRate',1000,'Window','hamming');

dchebwin = designfilt('lowpassfir','FilterOrder',100,'CutoffFrequency',60,...
  'SampleRate',1000,'Window',{'chebwin',90});

hfvt = fvtool(dhamming,dchebwin);
legend(hfvt,'Hamming window', 'Chebyshev window')

您可以通过其他方式指定具有固定阶数的滤波器:固定截止频率、通带波纹和阻带衰减;固定过渡带宽度;以及固定半功率 (3dB) 频率。

【我是小蜜蜂,知识的搬运工!】

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

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

相关文章

MATLAB | 如何用MATLAB如何绘制各式各样精致的三元相图(ternary plot)

整了个大活&#xff0c;写了一个能够生成非常精致三元相图的函数&#xff0c;这种图主要用于展示三种变量之间的比例&#xff0c;本期实验绘制效果如下&#xff1a; 编写不易&#xff0c;这个工具写的脑壳痛&#xff0c;求多多点赞&#xff0c;依旧先介绍咋使用&#xff0c;工具…

嵌入式软件架构

总目录链接>> AutoSAR入门和实战系列总目录 总目录链接>> AutoSAR BSW高阶配置系列总目录 文章目录1 嵌入式软件分类 – BAREMETAL2 嵌入式软件分类 – 实时操作系统 (RTOS)3 嵌入式软件分类 – “通用”操作系统4 嵌入式软件分类 – 容器/微服务微服务容器5 嵌…

入行 4 年,跳槽 2 次,我摸透了软件测试这一行

最近几年行业在如火如荼的发展壮大&#xff0c;以及其他传统公司都需要大批量的软件测试人员&#xff0c;但是20年的疫情导致大规模裁员&#xff0c;让人觉得行业寒冬已来&#xff0c;软件测试人员的职业规划值得我们深度思考。 大家都比较看好软件测试行业&#xff0c;只是因为…

python入门(四)python眼里的图像

文章目录背景一.搭建jupyter环境Jupyter 是什么:安装Jupyter Lab1: cmd中找到 anaconda powershell prompt2.切换到python3.8环境中3. 安装Jupyter4. 运行jupyter-lab5. 备注6.命令练习二.图像的本质背景 本人工作中&#xff0c;用到了ai相关技术&#xff0c;但是java出身&…

CNStack 云服务云组件:打造丰富的云原生技术中台生态

作者&#xff1a;刘裕惺 CNStack 相关阅读&#xff1a; CNStack 多集群服务&#xff1a;基于OCM 打造完善的集群管理能力 CNStack 虚拟化服务&#xff1a;实现虚拟机和容器资源的共池管理 CNStack 云边协同平台&#xff1a;实现原生边缘竟能如此简单 01 前言 CNStack 2.0…

Linux网络IO精华指南

在互联网中提起网络&#xff0c;我们都会避免不了讨论高并发、百万连接。而此处的百万连接的实现&#xff0c;脱离不了网络 IO 的选择&#xff0c;因此本文作为一篇个人学习的笔记&#xff0c;特此进行记录一下整个网络 IO 的发展演变过程。以及目前广泛使用的网络模型。 1.网…

小说情感倾向分析工具

目前有很多中英文小说情感倾向工具&#xff0c;以下是一些常用的工具&#xff1a; 情感分析工具&#xff1a;可以对文本进行情感识别&#xff0c;根据文本中包含的情感信息&#xff0c;将其转化成情感值&#xff0c;通常有积极情感值、消极情感值、中性情感值等&#xff0c;常…

Vue3.0的生命周期

要说清这个生命周期钩子&#xff0c;首先我们要通过一个实例来讲解 就是点击这个按钮来切换Demo组件的显示隐藏&#xff0c;当然它也疯狂的操作Demo的挂载&#xff0c;卸载 红色是卸载流程&#xff0c;蓝色是挂载流程 我们写在外面可以实现&#xff0c;但是v3的思想是组合api因…

树状数组与线段树的应用

一、树状数组 树状数组给人的感觉就像&#xff0c;一直在维护前缀和一样&#xff0c;只是加快了前缀和的速度&#xff0c;再用前缀和结合题目得出一些性质&#xff0c;从而去解题。&#xff08;一些不成熟的看法&#xff09; 基础知识&#xff08;一般树状数组用来处理单点修…

含氢微网优化调度模型matlab

目录 1 主要内容 模型示意图 目标函数 2 部分程序 3 程序结果 4 下载链接 1 主要内容 最近咨询含氢微网优化调度模型的同学较多&#xff0c;本次就分享一个高质量的源码资源。该程序方法复现《Simulation of design and operation of hydrogen energy utilization syste…

ssm拦截器

ssm拦截器 #&#xff1a; 与之前的过滤器不一样&#xff0c;过滤器是指在servlet中的&#xff0c;而拦截器是属于SpringMVC的&#xff0c;可以对请求的数据进行提前操作和后置操作&#xff1a; 先自己创建一个拦截器Interception类&#xff08;其实人家真名叫Interceptor&…

flutter dart中用ffi调用golang或C的动态链接库

本文介绍从dart中&#xff0c;通过ffi方式调用golang生成的动态链接库。 go/lib.go package mainimport "C"//export GetKey func GetKey() *C.char {theKey : "123-456-789"return C.CString(theKey) }func main() {}cd go go build -buildmodec-shared…

高通QSSI方式导致CI编译失败问题记录

一、问题背景 1、QSSI说明 QSSI 是 Qualcomm Single System Image 的缩写&#xff0c;高通平台从Android Q开始&#xff0c;为了解决Android碎片化问题&#xff0c;把system.img和vendor.img进一步拆分&#xff0c;增加了QSSI编译选项&#xff0c;QSSI就是用来编译system.img的…

数据结构(ArrayList)

文章目录一、线性表二、顺序表2.1 ArrayList&#xff08;1&#xff09;概念&#xff08;2&#xff09;ArrayList 的构造&#xff08;3&#xff09;ArrayList 的方法&#xff08;4&#xff09; ArrayList的遍历&#xff08;5&#xff09;ArrayList的优缺点2.2 链表一、线性表 概…

symmetric funtion and antisymmetric function(对称性函数和反对称性函数)

symmetric funtion and antisymmetric functionantisymmetric functionsymmetric funtion附录今天看资料的时候遇到了一个说法&#xff0c;文中提及&#xff0c;f(x)f\left(x\right)f(x) 是一个 antisymmetric function&#xff0c;看到这个说法有点儿懵&#xff0c;这里特来记…

上海亚商投顾:沪指逼近3400点 CPO概念股再度爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪沪指今日震荡反弹&#xff0c;午后逼近3400点关口&#xff0c;创业板指则小幅调整。CPO概念股再度爆发&#xff0c;…

[oeasy]python00134_[趣味拓展]python起源_历史_Guido人生_ABC编程语言_Tanenbaum

python 历史 回忆上次内容 颜文字是kaomoji 把字符变成一种图画的方法一层叠一层很多好玩儿的kaomoji是一层层堆叠起来的meme 虚拟的表情也在真实世界有巨大影响 一步步地影响 字符编码就是这样一步步发展过来的python也是 一步步 发展到今天的 python究竟是 怎么发展的呢&…

异常(throwable)

异常 异常分类 &#xff08;1&#xff09;Throwable类 所有的异常类型都是它的子类&#xff0c;它派生两个子类Error、Exception。 &#xff08;2&#xff09;Error类 表示仅靠程序本身无法恢复的严重错误&#xff08;内存溢出动态链接失败、虚拟机错误&#xff09;&#…

分布式定时任务

本文引用了谷粒商城的课程 定时任务 定时任务是我们系统里面经常要用到的一些功能。如每天的支付订单要与支付宝进行对账操作、每个月定期进行财务汇总、在服务空闲时定时统计当天所有信息数据等。 定时任务有个非常流行的框架Quartz和Java原生API的Timer类。Spring框架也可以…

【面试题】20个常见的前端算法题,你全都会吗?

现在面试中&#xff0c;算法出现的频率越来越高了&#xff0c;大厂基本必考 今天给大家带来20个常见的前端算法题&#xff0c;重要的地方已添加注释&#xff0c;如有不正确的地方&#xff0c;欢迎多多指正&#x1f495; 大厂面试题分享 面试题库 前后端面试题库 &#xff08;…