一文读懂滤波器的线性相位,全通滤波器,群延迟


数字信号处理最常见的面试题,请简述FIR和IIR的区别。其中的一个区别是FIR可以方便地实现线性相位。那这个线性相位指的是什么呢?本篇博客通过两个例子, 延迟全通滤波器,来解释这些概念。
先说结论: 线性相位能保证信号中各频率成分的相对相位关系不改变。
通俗解释: 信号经过线性相位滤波器后,各个频率分量的延时时间是一样的
该篇博客是 滤波器的相位系列文章第一篇,深入理解可继续阅读《 一文读懂线性相位滤波器和最小相位滤波器

1. 纯延迟(FIR)

举一个最简单的FIR的例子,延迟。假设16kHz的采样频率,一个采样周期的延迟,可以用FIR来表示。利用Matlab来观看这个滤波器的频率响应,代码如下。采样频率为Fs = 16kHz, 采样周期为Ts,Ts = 1/Fs。其中num是传递函数的分子,den是传递函数的分母。分母只有 a0 = 1, 代表是一个FIR滤波器。分子b0 = 0, b1 = 1, 代表是一个采样点的延迟。

num = [0,1]
den = [1,0]
fvtool(num,den)

下图中,蓝色的实线表示的幅频响应,为0dB。红色实线表示相频响应,主要看相频响应。图中对1k,2k,4kHz频点的横纵坐标有截图,16kHz采样率下,1kHz的正弦信号一个完整的周期(这里说的周期指的是 2 π 2\pi 2π)内会得到16个采样值。一个采样周期的延迟,带来的相位变化是 − 2 π / 16 = − π / 8 = − 22.5 ° -2\pi/16=-\pi/8=-22.5\degree 2π/16=π/8=22.5°。而2kHz信号一个完整周期( 2 π 2\pi 2π)内会得到8个采样值,那么一个采样周期的延迟带来的相位变化是 − 2 π / 8 = − π / 4 = − 45 ° -2\pi/8=-\pi/4=-45\degree 2π/8=π/4=45°,同理,对4kHz的信号,相位变化是 − 2 π / 4 = − π / 2 = − 90 ° -2\pi/4=-\pi/2=-90\degree 2π/4=π/2=90°。下图中也可以得到验证。
在这里插入图片描述

这个滤波器对整个信号只产生了延迟一个采样点的效果,信号的各个频率成分之间的相位关系没有改变。从这个例子可以很清楚地看到,线性相位指的是滤波器对每个频点的相频响应是一个线性关系。如下图所示,上面的图表示2kHz信号和4kHz信号,中间的图表示两者之和,下面的图表示过了一个采样周期延迟的FIR滤波器。中间的图和下面的图,这两个频率成分的信号之间相位关系没有改变。
在这里插入图片描述

2. 全通滤波器(IIR)

全通滤波器,幅频响应为0db,但是可以改变个频率成分之间的相位关系。一阶全通滤波器有以下公式。
H ( z ) = c + z − 1 1 + c z − 1 H(z) =\frac{c + z^{-1}}{1 + cz^{-1}} H(z)=1+cz1c+z1
c = t a n ( π ∗ f c / f s ) − 1 t a n ( π ∗ f c / f s ) + 1 c=\frac{tan(\pi*fc/fs) - 1}{tan(\pi*fc/fs) + 1} c=tan(πfc/fs)+1tan(πfc/fs)1其中fc为截止频率,fs为采样频率。
设计一个fc = 2kHz,其幅频相频响应如下图所示。2kHz处幅频响应为 − π / 2 -\pi/2 π/2,4kHz处幅频响应为 − 3 π / 4 -3\pi/4 3π/4。很明显,这里已经不再是线性相位了。

fs = 16e3;
fc = 2e3;
c = (tan(pi*fc/fs) - 1)/(tan(pi*fc/fs) + 1)
num = [c,1];
den = [1,c];
fvtool(num,den)

在这里插入图片描述

我们再将2kHz和4kHz的和通过这个全通滤波器,看看输出是怎么样的。如下图所示,经过全通滤波器后,2kHz和4kHz信号的相对相位已经改变了。2kHz延迟了 π / 2 \pi/2 π/2,而4kHz延迟了 3 π / 4 3\pi/4 3π/4。最下面那幅图直接在输入信号上修改初始相位,也可以得到同样的效果。这里可以看出来,两个频率分量的相对相位关系发生了改变,两者之和的波形也发生了变化。
在这里插入图片描述

3.相位延迟和群延迟

以上两个例子可以看出,延迟和全通滤波器都能实现0dB的幅频响应,但相频响应区别很大。相位延迟和群延迟,就是用来描述这种不同。
对于线性时不变系统,输入为 x ( t ) = e i w t x(t) = e^{iwt} x(t)=eiwt
输出为 y ( t ) = H ( i w ) e i w t = ( ∣ H ( i w ) ∣ e i ϕ ( w ) ) e i w t = ∣ H ( i w ) ∣ e i ( ϕ ( w ) + w t ) y(t) = H(iw)e^{iwt} = (|H(iw)|e^{i\phi(w)})e^{iwt} = |H(iw)|e^{i(\phi(w)+wt)} y(t)=H(iw)eiwt=(H(iw)eiϕ(w))eiwt=H(iw)ei(ϕ(w)+wt)
其中线性系统的相频响应为
ϕ ( w ) = a r g { H ( i w ) } \phi(w) = arg\{H(iw)\} ϕ(w)=arg{H(iw)}
群延迟表示为
τ g = − d ϕ ( w ) d w \tau_g=-\frac{d\phi(w)}{dw} τg=dwdϕ(w)
相位延迟表示为
τ ϕ = − ϕ ( w ) w \tau_\phi=-\frac{\phi(w)}{w} τϕ=wϕ(w)
这里先解释群延迟,群延迟是相位对频率的微分。如果群延迟不是一个常数,信号的各频率成分的相对相位关系将发生变化,从而产生相位失真。上面两个例子的群延迟分别如下图所示,纵坐标的单位为采样周期。

延迟(FIR)的群延迟就是1个采样周期的延迟,对于每一个频率分量都是一样的。
在这里插入图片描述

全通滤波器(IIR)的群延迟会随频率变化,低频部分的延迟时间大于高频部分。信号经过这个系统之后,信号各频率成分的相对相位关系就改变了。
在这里插入图片描述

4. 实际生活中的例子

就音乐厅来说,如果把舞台上音乐家的歌唱声或乐器发出的声音作为输入,听众听到的上述声音作为输出的话,那么音乐厅可以看成输入输出之间的一个系统。最理想的情况是,输出与输入之间只有一个类似于延时的线性相位滤波器,也即是舞台上唱什么歌,听众就能听到什么歌,只是时间上稍微有滞后。

如果音乐厅这个系统不是线性相位的,会出现什么情况呢?音乐是由很多不同的频率成分构成的。这时候音乐中有些频率成分很快就从舞台上传过来了,有些频率成分则要过一阵才传过来。这样组合起来的音乐,先不论是否悦耳,至少和舞台上的已经不一样了。这时候也就意味着坐在不同位置的听众,听到的将是不同的音乐,这是人们不希望看到的。

同样的问题也会出现在音响系统中。因为音响一般有多路功放来驱动,每一路功放驱动一个频率范围。信号在进入多路功放之前会先经过crossover filter来进行分频,这个分频的过程很有可能带来非线性的相频响应。结果就是音响系统的群延迟并非一个常数。那么不同的乐器演奏的先后顺序会变化,无法准确还原录制时的音乐。

这种情况下,必须要求线性相位的响应。该举例转载于博客《线性相位重要性的理解》。下面这篇博客介绍了线性滤波器在ECG信号中的使用,也是通俗易懂,可以参考。《为什么设计的滤波器一定要用线性相位》

总结:

  1. 线性相位能保证信号中各频率成分的相对相位关系不改变。通俗解释是:信号经过滤波器后,各个频率分量的延时时间是一样的。
  2. 延迟(FIR)和全通滤波器(IIR)都能对信号实现0dB的幅频响应。但是FIR能实现线性相位,而且群延迟为一个常数。
  3. 要让信号传输不失真,这个传输系统必须具有常数幅度增益线性相位延迟。线性时不变系统只能保证常数倍的幅度增益,并不能保证线性相位延迟。
  4. 音乐厅的冲激响应必须要求线性相位。
FIR线性相位滤波器设计程序 FIR Linear Phase Filter Design Program ============================================= 编译命令: gfortran *.for (i1mach.for中定义了4个标准输入输出设备号:1输入:键盘;2输出:显示;3打印;4信息:显示) 编译输出: a.out/a.exe : 编译过程中会报告“警告”信息,可不理会 运行文件: a.out/a.exe < input.txt 输入采用归一化滤波器参数来设计滤波器。 编译环境: 在Windows中,程序使用MinGW环境编译。 在ubuntu linux中,程序使用build-essential环境编译,需要下载gfortran。 f2c是一个开源的fortran到c的转换软件,如果不想混合编程的话,可以用它。 ============================================= 这是1976年IEEE组织编辑出版的《IEEE电气工程师 数字信号处理 FORTRAN程序库》的FORTRAN源码之一。整个程序库总计33个源码文件,将陆续上传。 在上传之前,我对程序的执行结果做了初步校对。感兴趣的朋友可以参照程序库的影印版进行全面校对,并欢迎反馈结果。 该程序库的影印版参见http://download.youkuaiyun.com/download/wuyijun2010/2718795。 一些程序跟程序库的打印稿略有出入,主要是使用了一些小的函数,如i1mach.for等,并不对程序的完整性产生影响。 Fortran语言已经比较古老了。许多人不屑于使用它,认为不如C/C++好用。 其实,Fortran语言非常经典。使用Fortran编程,你大可不必关心诸如“指针、内存分配、数组越界”等等易错的问题。 学好Fortran编程,并不比学好C花更多时间,甚至更短。 最主要的,它是科学计算的主要程序语言。你不会拿一个算法的C程序去发表吧。 ============================================= 该书出版后的三十五年后的今天,这些算法仍然占据着数字信号处理领域的重要位置。即使今天的处理器速度已经今非昔比,这些精炼高效的程序仍然非常有效,因为算法的实现方式直接关系到系统成本。 同期还出版了由奥本海姆和谢弗合著的《数字信号处理》一书。今天这仍是一本关于数字信号处理方法的经典著作。作者在绪论中提到的应用几乎包括了现代信息处理的各个领域。一些领域的信号处理依靠传统模拟设备是不可能实现的。由于器件速度限制,当时的数字信号处理大多还不能实时实现。尽管如此,抱着数字化系统终将付诸现实的信念,人们积极地开始了对各种数字系统的研究工作。 今天,越来越多的数字信号处理系统不仅能够实时实现,而且已经成为了各种设备的核心。很多设备,只有在输入输出端口,才进行数字到模拟之间的转换,内部则完全是数字处理系统。 因此,掌握数字信号处理知识和方法,应该是每个电子工程师必备的。 ============================================= 摘录前言 <1976年出版> 在过去的十五年里,数字信号处理已极其活跃。 数字信号处理进展的重要方面是算法和这些算法程序的具体化。 本程序分为八章,每章部有专门的提要。 第一章中重点叙述了离散付里叶变换(DFT)并且给出了各种快速付里叶变换(FFT)及其有关的算法。 第二章中包括了功率谱估计的周期图和相关法算法以及相关谱估计和互谱估计的算法。 第三章中是以快速FFT为基础的卷积程序。 第四章中给出了有关线性预测信号处理技术的几种算法,包括自相关法,协方差法和格点法。 第五章中主要阐述了有限冲激响应(FIR)数字滤波器的设计与综合。 第六章中给出了有关无限冲激响应(IIR)数字滤波器设计程序的综合资料。 第七章里叙述了倒谱和同态算法,侧重于同态系统相位计算的难点。 第八章里给出了有关内插和抽取的几个程序。 本书是在1976年初,由IEEE声学、语言学以及信号处理学会所组成的数字信号处理委员会,着手进行的一项计划的结晶。 本书所有程序符合下列要求: (1)必须包括全部用户文件。 (2)程序必须用FORTRAN语言,并且符合ANSI FORTRAN标准。 (3)编码应全部注释并已经排除错误,尽可能地清晰,明撩。 (4)编码应能传送,并且与机器无关。 (5)应提供有关输入,输出综合调试实例。 程序的可移植性在这项计划里是很重要的目的。 特别注意了保证精度,明撩以及材料的一致性。 所有程序编码的列表,直接从中央收集计算机可读源材料中打印出。 作者的文件手稿打入计算机系统之后,迸行最后的编辑和校正。 书中全部打印材料由计算机带动的照相排版机得到。 =============================================
评论 39
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值