【DSP数字信号处理学习笔记】——FIR数字滤波器设计攻略:基于加窗傅里叶级数

本文主要是介绍【DSP数字信号处理学习笔记】——FIR数字滤波器设计攻略:基于加窗傅里叶级数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我们在上一篇Blog中详细介绍了如何设计IIR滤波器,对于此类滤波器,我们还必须得保证所设计出来的滤波器是稳定的。然而在FIR滤波器中,由于整个系统函数是 z − 1 z^{-1} z1 的多项式,因此传输函数必然是稳定的,所以在设计FIR滤波器时,稳定性就不是一个需要考虑的问题了。此外,与数字IIR滤波器不同,FIR滤波器的设计与模拟滤波器没有任何关系,其中一种FIR滤波器的设计方法就是对给定的频率响应在时域上进行截短。我们下面重点看看这种方法。

由低通FIR滤波器的设计开始

首先,我们现在需要设计一个低通FIR滤波器。那么怎么做呢?首先,对于理想低通滤波器的频率响应我们是很熟悉的了,它的频域和时域长下面这样:
在这里插入图片描述那么我们发现,这个时域信号 x ( t ) x(t) x(t) 很明显是无限长的,因此我们就需要对它进行截短,也就是说取 x ( t ) x(t) x(t) 的一部分去逼近 x ( t ) x(t) x(t) 的频域响应。那么,这个“截短”操作就大有讲究了,到底怎么截就是一个值得研究的问题。

“截短”可以基于两个准则—— 1. 最小积分平方误差准则;2. 一致逼近准则(一致逼近准则的物理意义就是波纹最小)。使用不同的准则,就会得到不同的加窗方式,这里我们不再赘述,教材中都对此有详细的解释。我们下面就简单看看都能用什么样的窗函数对这个时域信号进行截短。

这里需要说明一下的是,下面对各种窗的介绍,我们将给出时频图,其中,时域图表示我们的窗函数;而频域图窗的增益响应,显示了窗函数的主瓣和旁瓣。

【1】矩形窗
在这里插入图片描述(值得注意的是:矩形窗虽然总的误差能量最小,但是单点的波纹较大)

【2】汉宁窗(下图中粉色线)
在这里插入图片描述

【3】布莱克曼窗(下图粉色线)
在这里插入图片描述

还有许许多多各种样式的窗函数,我们也就不一一列举了。下面我们重点来看看:窗函数的主瓣和旁瓣对所截得的滤波器有什么影响。

我们首先看看如何对 x ( t ) x(t) x(t) 加矩形窗,结果会是怎么样:
在这里插入图片描述
那么频域上就是他们两者频谱的卷积,所以得出的最终信号的频谱是:
在这里插入图片描述

也就是说,直接的截短并不能完美地拟合原来的频谱,而是会出现波纹,也就是吉布斯现象。

吉布斯现象的特点:

  1. 最大波纹仅取决于窗函数的类型
  2. 最大波纹与滤波器的长度无关
  3. 与间断点的跳变幅度有关
  4. 矩形窗的最大波纹≈通带和阻带幅度差的11%

减小吉布斯现象的方法:

  1. 时域上:尽量避免出现时域上的跳变,使用渐变窗函数
  2. 频域上:增加过渡带带宽。

同时也会出现过渡带(也就是幅度需要一个时间去变化). 下面我们给出结论:窗函数的主瓣宽度越窄,那么过渡带就会越窄;窗函数的旁瓣高度越小,那么波纹就会越小。

【小Tips:过渡带带宽近似等于窗函数主瓣宽度】

【小Tips:2 在相同窗函数长度下,主瓣宽度有下面的关系:矩形窗<汉宁窗=汉明窗<布莱克曼窗】

主瓣宽度与窗函数类型以及窗长度有关;而旁瓣高度仅仅与窗函数类型有关。

FIR滤波器的设计步骤

首先,我们可以得到所需要的滤波器指标,包括通带截止频率 ω p \omega_p ωp;阻带截止频率 ω s \omega_s ωs,以及通带波纹,阻带波纹 δ s δ_s δs等。

接下来我们需要计算阻带衰减: 20 l g ( δ s ) 20lg(δ_s) 20lg(δs)

然后,我们根据考试中给出的各种窗的表格(如下图),选出合适的窗:(找一个小于,且最接近所算出来的阻带衰减的类型即可
在这里插入图片描述

然后计算过渡带,求出 M。(2M+1就是窗函数的长度)

最后计算一下窗函数的中心频率 ω c \omega_c ωc ω c = ω p + ω s 2 \omega_c = \frac{\omega_p+\omega_s}{2} ωc=2ωp+ωs

带入公式: h w [ n ] = s i n ω c n π n h_w[n] = \frac{sin \omega_c n }{\pi n} hw[n]=πnsinωcn
就可以得到窗函数的时域表达式,拿他经过M的时移信号跟IIR的时域(也时移M个单位)相乘,就可以得到FIR滤波器的时域函数,如下所示。
h w [ n − M ] ⋅ x [ n − M ] h_w[n-M]\sdot x[n-M] hw[nM]x[nM]


补充1:其他几种类型的FIR滤波器的相关设计要点

四种理想滤波器的时域函数形式应该还是需要记一下的,指不定考试就考到哪个了呢:

  1. 理想低通滤波器: h [ n ] = { s i n ( ω c n ) π n 0 ≤ n ≤ N − 1 0 e l s e h[n]= \begin{cases} \frac{sin(\omega_cn)}{\pi n}\quad 0≤n≤N-1\\ 0\quad else \end{cases} h[n]={πnsin(ωcn)0nN10else

  2. 理想高通滤波器:
    h [ n ] = { 1 − ω c π n = 0 ; − s i n ( ω c n ) π n ∣ n ∣ > 0 h[n]= \begin{cases} 1-\frac{\omega_c}{\pi}\quad n=0;\\ -\frac{sin(\omega_cn)}{\pi n}\quad\quad |n|>0 \end{cases} h[n]={1πωcn=0;πnsin(ωcn)n>0

  3. 理想带通滤波器
    h [ n ] = s i n ( ω c 2 n ) π n − s i n ( ω c 1 n ) π n ∣ n ∣ ≥ 0 h[n]=\frac{sin(\omega_{c2}n)}{\pi n}-\frac{sin(\omega_{c1}n)}{\pi n}\quad |n|≥0 h[n]=πnsin(ωc2n)πnsin(ωc1n)n0

  4. 理想带阻滤波器
    h [ n ] = { 1 − ω c 2 − ω c 1 π n = 0 ; s i n ( ω c 1 n ) π n − s i n ( ω c 2 n ) π n ∣ n ∣ ≥ 0 h[n]= \begin{cases} 1-\frac{\omega_{c2}-\omega_{c1}}{\pi}\quad n=0;\\ \frac{sin(\omega_{c1}n)}{\pi n}-\frac{sin(\omega_{c2}n)}{\pi n}\quad |n|≥0 \end{cases} h[n]={1πωc2ωc1n=0;πnsin(ωc1n)πnsin(ωc2n)n0

如果涉及到像带通带阻这样有多个截止频率的,如何设计呢?
【第一步】还是先计算出阻带衰减,选择合适的窗函数类型
【第二步】计算通频带,比如一个带通滤波器,那么它应该有两个通频带: ω s 1 − ω p 1 \omega_{s1}-\omega_{p1} ωs1ωp1 ω s 2 − ω p 2 \omega_{s2}-\omega_{p2} ωs2ωp2
【第三步】:我们选择最小的那个通频带带入公式,算出M。
【第四步】:计算出对应的中心频率,此时应该是: ω s 1 + ω p 1 2 \frac{\omega_{s1}+\omega_{p1}}{2} 2ωs1+ωp1 ω s 2 + ω p 2 2 \frac{\omega_{s2}+\omega_{p2}}{2} 2ωs2+ωp2


补充2:关于FIR与IIR

FIR滤波器的优点:易于实现现象相位,且稳定。缺点:在满足相同指标的前提下,FIR所需要的阶数比IIR要高,逼近效率较低。

IIR滤波器优点:阶数低,逼近效率高;缺点:难以实现线性相位,不一定稳定。

这篇关于【DSP数字信号处理学习笔记】——FIR数字滤波器设计攻略:基于加窗傅里叶级数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/429402

相关文章

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Java数字转换工具类NumberUtil的使用

《Java数字转换工具类NumberUtil的使用》NumberUtil是一个功能强大的Java工具类,用于处理数字的各种操作,包括数值运算、格式化、随机数生成和数值判断,下面就来介绍一下Number... 目录一、NumberUtil类概述二、主要功能介绍1. 数值运算2. 格式化3. 数值判断4. 随机

Python中的可视化设计与UI界面实现

《Python中的可视化设计与UI界面实现》本文介绍了如何使用Python创建用户界面(UI),包括使用Tkinter、PyQt、Kivy等库进行基本窗口、动态图表和动画效果的实现,通过示例代码,展示... 目录从像素到界面:python带你玩转UI设计示例:使用Tkinter创建一个简单的窗口绘图魔法:用

Go信号处理如何优雅地关闭你的应用

《Go信号处理如何优雅地关闭你的应用》Go中的优雅关闭机制使得在应用程序接收到终止信号时,能够进行平滑的资源清理,通过使用context来管理goroutine的生命周期,结合signal... 目录1. 什么是信号处理?2. 如何优雅地关闭 Go 应用?3. 代码实现3.1 基本的信号捕获和优雅关闭3.2

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

从去中心化到智能化:Web3如何与AI共同塑造数字生态

在数字时代的演进中,Web3和人工智能(AI)正成为塑造未来互联网的两大核心力量。Web3的去中心化理念与AI的智能化技术,正相互交织,共同推动数字生态的变革。本文将探讨Web3与AI的融合如何改变数字世界,并展望这一新兴组合如何重塑我们的在线体验。 Web3的去中心化愿景 Web3代表了互联网的第三代发展,它基于去中心化的区块链技术,旨在创建一个开放、透明且用户主导的数字生态。不同于传统