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

article/2025/10/19 6:47:19

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

    • 1. 延迟
    • 2. 全通滤波器
    • 3.相位延迟和群延迟
    • 4. 实际生活中的例子
    • 总结:

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

1. 延迟

举一个最简单的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. 全通滤波器

全通滤波器,幅频响应为0db,但是可以改变个频率成分之间的相位关系。一阶全通滤波器有以下公式。
A ( z ) = c + z − 1 1 + c z − 1 A(z) =\frac{c + z^{-1}}{1 + cz^{-1}} A(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. 音乐厅的冲激响应必须要求线性相位。

http://chatgpt.dhexx.cn/article/qjHG9Zjt.shtml

相关文章

一阶RC低通滤波器的数学模型及算法实现

一阶RC低通滤波器的数学模型及算法实现 1. 一阶RC低通滤波器的连续域数学模型1.1 数学模型的推导1.2 频率特性1.3 物理作用 2. 一阶RC低通滤波器的算法推导2.1 离散化2.2 滤波系数 3. 一阶RC低通滤波器的C语言实现4. 缺点及改善方法4.1 缺点4.2 改善方法——动态调整滤波系数4.…

数字 一阶低通滤波器 详细分析

事件的起因是下图1,朋友偶然说到一阶低通滤波器,借此来详细介绍一阶低通滤波器的原理,并附上matlab仿真程序代码。图1中的一阶低通数字滤波器的公式为Eq(1): y(n) q*x(n) (1-q)*y(n-1) Eq(1) 其中,y(n)表示当前…

【滤波器学习笔记】一阶RC低通滤波

一阶RC低通滤波 从模拟到数字 本文整理自网络、《匠人手记》等书籍文章 模拟电路低通滤波时域、频域软件低通滤波 典型电路 图1 典型RC电路 直流、交流、脉冲信号都可以用它 时域 电容电流: Icdqdtd(C∙Uo)dtCdUodt 基尔霍夫电压定律得: UiRCdUo…

一阶低通数字滤波

一阶低通滤波算法: 3、 一阶低通滤波优缺点 一阶低通滤波数学意义:一阶低通滤波法采用本次采样值与上次滤波输出值进行加权,得到有效滤波值,使得输出对输入有反馈作用。 优缺点:滤波系数越小,滤波结果越平稳…

MATLAB—FIR数字滤波器设计

目录: 1 FIR滤波器的原理2 FIR滤波器的特点2.1 相位特性2.1.1 偶对称2.1.2 奇对称 2.2 幅度特性 3 几种滤波器函数3.1 fir1()3.2 fir2()3.3 kaiserord()3.4 firpm() 4 仿真实例4.1 代码4.2 仿真分析 本文是基于MATLAB的数字滤波器设计,所有数据基于计算机…

窗函数法设计FIR中,如何选择窗函数和阶数N

在用窗函数法设计FIR滤波器时,给出了滤波器要求的具体指标,包括通带频率fp、阻带频率fs、通带波纹Rp和阻带衰减As等,有了这些指标后,是否什么窗函数都可以选择呢?答案是否定的。那么怎么选择窗函数呢?在本小…

一阶RC低通滤波器(二)

这篇文章补充下前面讲的一阶低通滤波器。在母线电压采样或是在电机的三相端电压采样时,往往是先分压,再经过RC低通滤波器。电路图如下: 1:先求输出和输入的关系(Uao/Ua) 从上式可以看出系统相当于一个典…

二阶有源滤波器设计

1引入 为什么要用有源二阶滤波器? (1)从有源来说 对于无源二阶低通滤波器: 其幅頻方程为: 我们从中可以看出其通带截止频率为 有其品质因子为0.372。 我们根据上图得到二阶无源低通滤波器的品质因子只有0.372,如果希望Q大于0.5…

滤波算法——均值滤波,中值滤波,一阶(αβ)滤波,卡尔曼滤波

滤波算法——均值滤波,中值滤波,一阶(αβ)滤波,卡尔曼滤波 因工作涉及到数据滤波(滤噪)处理,汇总了一些网上简单的滤波算法,方便日后查看。 滤波算法包括:均值滤波,中值滤波,一阶…

一阶滤波器

1. 一阶滤波算法的原理 一阶滤波,又叫一阶惯性滤波,或一阶低通滤波。是使用软件编程实现普通硬件RC低通滤波器的功能。 一阶低通滤波的算法公式为: Y(n)αX(n) (1-α)Y(n-1) 式中:α滤波系数;X(n)本次采样值&…

FIR数字滤波器设计

今天给大侠带来FIR数字滤波器设计,由于篇幅较长,分三篇。今天带来第三篇,FIR数字滤波器设计,包括窗函数法设计FIR滤波器、频率采样法设计FIR滤波器以及基于firls函数和remez函数的最优化方法设计FIR滤波器。话不多说,上…

一阶二阶数字滤波器笔记

数字滤波器 一阶数字滤波器时域分析频域分析数字化代码示例 二阶巴特沃斯低通滤波器S域和Z域的频率关系分析巴特沃斯滤波器举例说明代码示例 声明:感谢知乎大佬的文章,原文链接 数字滤波器实现方法是把滤波器所要完成的运算编成程序并让计算机执行,也就…

简单二阶滤波器截止频率的计算

最近刚好学习到这了,而我在网上查资料的时候却非常难找,不少资料讲解不够详细,所以经过我努力也为了为大家做点贡献的想法,以自己的见解写下这篇文章。废话不多说,先从一阶滤波器讲起。 一阶低通滤波器: …

如何确定插值滤波器的阶数

在信号处理中,滤波器的系数我们往往都是通过MATLAB来设计,只要我们知道滤波器的通带截止频率和阻带起始频率,就可以通过MATLAB中的fdatool(在MATLAB2020中使用filterDesigner)来设计滤波器了。 我们使用归一化的参数来…

标识符无效

表中存在该列,插入的时候却显示 标识符无效,使用dbsql插入报错,自己写入数据没有问题! 查资料发现可能和列的大小写有关。这里强调sql一定用全大写来写避免不必要的麻烦!但是我改过后发现并不是这个问题…… 问题已解…

ORA-00904 ID 标识符无效 解决方案

msg:"数据访问异常" dev:"ORA-00904:"ID":标识符无效 ORA:即 Oracle 报错。 标识符无效是因为:SQL语句中,列名(ID)不在表中。解决方案&#x…

PLSQL ORA-00904 标识符无效

问题在于“COMPONET_ID” 是字符串,无法识别,如果不是字符串,就可以识别

Oracle标识符无效

Oracle在创建表的时候提示“ORA-00904:标识符无效” 原因为最后一行列定义多了一个逗号,去掉即可。

【Oracle相关】坑!使用oracle时,发生标识符无效解决办法

–真是个大坑 使用oracle时,发生标识符无效解决办法 一般出现该错误的原因: 1、列名写错导致 2、使用了关键字作为了列名 但是这次遇到的情况有点奇葩 通过dblink直接查询该表,并没有报出问题,但在存储过程中通过dblink访问就一直报标识符…

ORA-00904 标识符无效 解决方案

ORA:即Oracle报错。 标识符无效:SQL语句中,这个字段名不在表中。 解决方案:修改SQL语句中对应的字段或者修改表里面对应的列名。 在这里我想说一下,因为我用的是hibernate内部封装好的save方法,咱也不能去改…