群延迟(Group Delay)是相位响应的负导数(瞬时斜率负值),表示信号各频率分量通过滤波器时的延迟时间。
具体来说,如果滤波器的相位响应为 θ(ω),那么群延迟 𝜏𝑔(𝜔) 定义为:
FIR(有限冲激响应)滤波器在设计得当的情况下,通常可以实现线性相位响应,线性相位滤波器在信号处理中的一个关键优势是它能够对输入信号施加一个恒定的群延迟(群延迟定义为相位响应的一阶导数,表示信号通过滤波器时所有频率成分的延迟是相等的)。这样,经过滤波后的信号在时间上只是整体移动了一下,信号的形状和特征不会改变。
以下是进一步阐明FIR滤波器恒定群延迟的一些要点:
-
线性相位特性:线性相位FIR滤波器具有对称或反对称的脉冲响应,这种对称性使得滤波器的相位响应是线性的,因此群延迟是恒定的。
-
群延迟定义:群延迟是相位响应的负导数。对于线性相位滤波器,相位响应是频率的线性函数,因此其导数是常数,表明群延迟是恒定的。
-
设计考虑:在设计FIR滤波器时,通常会选择使其具有线性相位特性的滤波器系数排列(如对称或反对称),以确保群延迟恒定。
一般来说,滤波器的长度(即滤波器系数的数量)确实会影响群延迟,但不一定总是越长的滤波器群延迟就越大。具体情况取决于滤波器的设计和类型。以下是一些详细解释:
-
FIR滤波器(有限脉冲响应滤波器):
- 对于线性相位的FIR滤波器,群延迟是常数,其值等于滤波器阶数的一半(即滤波器系数个数减一再除以二)。
- 例如,一个长度为N的线性相位FIR滤波器的群延迟大约为(𝑁−1)/2个样本。因此,对于FIR滤波器,滤波系数越长,群延迟确实越大。
-
IIR滤波器(无限脉冲响应滤波器):
- IIR滤波器的群延迟不是常数,而是随频率变化的。滤波器的阶数(即反馈和前馈系数的数量)会影响群延迟的特性,但不如FIR滤波器那么直接。
- 设计不当的高阶IIR滤波器可能在某些频率下具有较大的群延迟,但这不意味着滤波系数越长群延迟就越大,需要具体分析频率响应和相位响应。
对比不同长度FIR的滤波器,群延迟:
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import freqz, lfilter
# 定义不同长度的FIR滤波器系数
b1 = [0.1, 0.15, 0.5, 0.15, 0.1] # 长度为5
b2 = [0.01, 0.05, 0.14, 0.26, 0.29, 0.26, 0.14, 0.05, 0.01] # 长度为9
b3 = [0.005, 0.01, 0.03, 0.07, 0.15, 0.2, 0.3, 0.2, 0.15, 0.07, 0.03, 0.01, 0.005] # 长度为13
a = [1.0] # FIR滤波器的分母系数通常为1
# 计算频率响应和群延迟
def compute_group_delay(b, a):
w, h = freqz(b, a, worN=8000)
theta = np.angle(h)
group_delay = -np.diff(np.unwrap(theta)) / np.diff(w)
return w[:-1], group_delay
# 去除异常值
def remove_outliers(data, threshold=10):
median = np.median(data)
diff = np.abs(data - median)
mad = np.median(diff)
modified_z_score = 0.6745 * diff / mad
return data[modified_z_score < threshold]
# 计算不同长度滤波器的群延迟
w1, gd1 = compute_group_delay(b1, a)
w2, gd2 = compute_group_delay(b2, a)
w3, gd3 = compute_group_delay(b3, a)
# 去除异常值
gd1_no_outliers = remove_outliers(gd1)
gd2_no_outliers = remove_outliers(gd2)
gd3_no_outliers = remove_outliers(gd3)
# 绘制群延迟
plt.figure(figsize=(10, 6))
plt.plot(w1[:len(gd1_no_outliers)], gd1_no_outliers, label='Filter Length 5')
plt.plot(w2[:len(gd2_no_outliers)], gd2_no_outliers, label='Filter Length 9')
plt.plot(w3[:len(gd3_no_outliers)], gd3_no_outliers, label='Filter Length 13')
plt.title('Group Delay of Different Length FIR Filters')
plt.xlabel('Frequency [rad/sample]')
plt.ylabel('Group Delay [samples]')
plt.grid()
plt.legend()
plt.show()
展示不同群延迟对信号效果的影响:
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import freqz, lfilter
from scipy.ndimage import gaussian_filter1d
# 生成测试信号
fs = 1000 # 采样频率
t = np.linspace(0, 1, fs, endpoint=False) # 时间向量
signal = np.sin(2 * np.pi * 5 * t) + np.sin(2 * pi * 50 * t) # 5Hz 和 50Hz 的正弦波叠加
# 定义两个滤波器的系数
# 滤波器1:低群延迟
b1 = [0.1, 0.15, 0.5, 0.15, 0.1]
a1 = [1.0]
# 滤波器2:高群延迟
b2 = [0.01, 0.05, 0.14, 0.26, 0.29, 0.26, 0.14, 0.05, 0.01]
a2 = [1.0]
# 计算频率响应和群延迟
def compute_group_delay(b, a):
w, h = freqz(b, a, worN=8000)
theta = np.angle(h)
group_delay = -np.diff(np.unwrap(theta)) / np.diff(w)
return w[:-1], group_delay
# 计算两个滤波器的群延迟
w1, gd1 = compute_group_delay(b1, a1)
w2, gd2 = compute_group_delay(b2, a2)
# 平滑群延迟数据
gd1_smooth = gaussian_filter1d(gd1, sigma=2)
gd2_smooth = gaussian_filter1d(gd2, sigma=2)
# 对信号进行滤波
filtered_signal1 = lfilter(b1, a1, signal)
filtered_signal2 = lfilter(b2, a2, signal)
# 绘制原始信号和滤波后的信号
plt.figure(figsize=(14, 10))
# 原始信号
plt.subplot(3, 1, 1)
plt.plot(t, signal, label='Original Signal')
plt.title('Original Signal')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.grid()
plt.legend()
# 滤波器1后的信号
plt.subplot(3, 1, 2)
plt.plot(t, filtered_signal1, label='Filtered Signal (Low Group Delay)')
plt.title('Filtered Signal (Low Group Delay)')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.grid()
plt.legend()
# 滤波器2后的信号
plt.subplot(3, 1, 3)
plt.plot(t, filtered_signal2, label='Filtered Signal (High Group Delay)')
plt.title('Filtered Signal (High Group Delay)')
plt.xlabel('Time [s]')
plt.ylabel('Amplitude')
plt.grid()
plt.legend()
plt.tight_layout()
plt.show()
# 绘制两个滤波器的群延迟
plt.figure(figsize=(10, 5))
plt.plot(w1, gd1_smooth, label='Group Delay (Low Group Delay Filter)')
plt.plot(w2, gd2_smooth, label='Group Delay (High Group Delay Filter)')
plt.title('Group Delay of Filters')
plt.xlabel('Frequency [rad/sample]')
plt.ylabel('Group Delay [samples]')
plt.grid()
plt.legend()
plt.show()
可以看出,在高群延迟的情况下,1秒的时候,出的内容比较少一点
FIR脉冲响应的对称性决定了相位响应的线性特性
线性相位FIR(有限冲激响应)滤波器脉冲响应的对称性使得滤波器的相位响应是线性的,主要是因为数学上的对称性引入了相位响应的线性特征。这种特性确保了信号通过滤波器时,不同频率成分的相对相位保持不变,从而实现恒定的群延迟。以下是详细的解释:
1.脉冲响应对称性
偶对称:
奇对称:
2. 相位响应和线性相位
FIR 滤波器的频率响应可以表示为:
对于偶对称和奇对称脉冲响应,其相位响应为线性:
3. 数学推导
频率响应的计算
FIR滤波器的频率响应是其脉冲响应的离散时间傅里叶变换(DTFT):
我们将其分解为实部和虚部:
对称性的影响
对于偶对称的FIR滤波器,其脉冲响应因此,我们有:
利用欧拉公式 我们可以进一步简化:
由于是偶对称的,且
和
,因此虚部项相互抵消,得到:
这意味着频率响应的虚部为零,只剩下实部。
相位响应的计算
当频率响应只有实部时,我们可以直接计算其相位响应。因为
是实数且非负,我们的相位响应为零:
如果 是实数且为负,则相位响应为
:
线性相位的特性
从以上推导可以看到,偶对称的FIR滤波器的频率响应只有实部,其相位响应为零或的整数倍。这意味着这种滤波器的相位响应是线性的,即:
4. 恒定群延迟
由于线性相位响应的导数是常数,群延迟 也将是常数:
对于上述线性相位的表达式,群延迟是:
这意味着所有频率成分都被延迟相同的时间量,从而确保了信号波形的保真度。
总结:
线性相位FIR滤波器的脉冲响应的对称性导致了频率响应中的相位是频率的线性函数。这个线性关系直接导致了恒定的群延迟,从而保证了通过滤波器的信号的相对相位关系保持不变。这种特性使得线性相位FIR滤波器在许多需要保持信号波形的应用中非常有用。
从信号角度证明
1.线性相位情况:
线性相位响应的滤波器能够确保过滤的信号有相同的延迟时间(群延迟恒定)的原因在于线性相位响应的特性。下面通过详细的解释来阐述这一点。
考虑一个信号 的傅里叶变换
,通过线性相位响应滤波器后的输出信号
的傅里叶变换为:
其中,是滤波器的频率响应。假设
,则有:
通过逆傅里叶变换得到时域信号:
由于表示一个时移的相位因子,逆傅里叶变换结果为:
这表明信号 经过滤波器后只是整体上延迟了
个时间单位,没有发生其他变化。这是因为滤波器的线性相位响应使得所有频率成分的相对相位保持不变。
2.非线性相位情况:
在探讨滤波器的相位响应非线性情况下信号的延迟情况时,我们需要理解非线性相位响应如何影响信号各个频率成分的延迟,从而导致相位失真。下面通过数学推导和示例说明这一点。
非线性相位响应的影响
将非线性相位响应代入,得到:
通过逆傅里叶变换得到时域信号:
由于 是非线性函数,不再是简单的时移因子,逆傅里叶变换结果将是一个复杂的时域信号,其不同频率成分的延迟时间不同。这会导致相位失真,改变信号的波形。
数学推导示例
为了更具体地说明,假设输入信号是一个简单的正弦波:
其傅里叶变换为:
经过非线性相位响应滤波器后的输出信号的傅里叶变换为:
代入 后:
逆傅里叶变换后得到:
此时,输出信号的相位不仅仅是一个常数项,而是一个依赖于频率的非线性函数。不同频率成分将具有不同的相位延迟,这会导致输出信号与输入信号波形不一致,出现相位失真。
结论
当滤波器的相位响应是非线性时,信号的各个频率成分会经历不同的延迟时间,导致群延迟不恒定。这种情况下,信号的波形会发生变化,出现相位失真,无法保证信号的波形保真度。对于需要保持信号原始形态的应用场景,非线性相位响应滤波器是不合适的。
IIR 滤波器群延迟特性
IIR滤波器的群延迟通常不是恒定的,这意味着不同频率成分会有不同的延迟时间。与线性相位FIR滤波器不同,IIR滤波器的群延迟曲线通常会显示出较大的波动,特别是在滤波器的通带和阻带边界附近。这些波动会影响信号的相位一致性,从而导致信号波形的失真。特别是在处理具有多个频率成分的信号时。理解这些特性对于设计和应用IIR滤波器至关重要。
IR(无限冲激响应)滤波器在通带和阻带边界附近的群延迟曲线通常会显示出较大的波动,这主要是由于滤波器设计和系统稳定性等因素导致的。以下是这些现象的详细解释:
1. 极点和零点的影响
IIR滤波器是通过反馈和前馈结构实现的,它们具有极点和零点。这些极点和零点的位置会直接影响滤波器的频率响应和群延迟。
- 极点接近单位圆:IIR滤波器的极点如果接近单位圆的边界,会导致频率响应在该频率附近出现尖锐的变化。这种变化会导致群延迟在这些频率点附近出现急剧的波动。
- 零点的影响:零点的位置会影响滤波器的零点频率(即滤波器在该频率处完全衰减),这种影响同样会导致群延迟在这些频率附近出现波动。
2. 设计方法和滤波器类型
不同类型的IIR滤波器(如Butterworth、Chebyshev、Elliptic等)在设计上具有不同的特性。以下是几种常见的IIR滤波器及其对群延迟的影响:
- Butterworth滤波器:具有平坦的通带响应,但在阻带边界处可能会出现较大的群延迟变化。
- Chebyshev滤波器:具有陡峭的通带或阻带边界,这种陡峭的过渡区域会导致群延迟在该区域内出现较大的波动。
- Elliptic滤波器:具有最陡峭的过渡带和最小的带内波动,但由于极点和零点的位置更加复杂,因此群延迟波动更为显著。
3. 相位响应的非线性
IIR滤波器的相位响应通常是非线性的。非线性的相位响应意味着信号的不同频率成分在传播过程中会经历不同的延迟。这种非线性相位响应直接导致群延迟的波动。
4. 数学表述
群延迟是相位响应对频率的导数。对于一个复杂的IIR滤波器,相位响应函数 𝜃(𝜔)θ(ω) 可能是一个高阶的非线性函数,其导数(即群延迟 𝜏(𝜔))会随着频率发生显著变化,特别是在极点和零点附近。
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal import freqz, iirfilter, group_delay
# 设计一个IIR滤波器
b, a = iirfilter(N=4, Wn=0.5, rp=5, rs=60, btype='low', analog=False, ftype='ellip')
# 计算频率响应
w, h = freqz(b, a)
# 计算群延迟
w, gd = group_delay((b, a))
# 绘制频率响应和群延迟
fig, ax1 = plt.subplots()
ax1.set_title('IIR Filter Frequency and Group Delay Response')
ax1.plot(w / np.pi, 20 * np.log10(abs(h)), 'b')
ax1.set_ylabel('Amplitude [dB]', color='b')
ax1.set_xlabel('Normalized Frequency [×π rad/sample]')
ax1.grid()
ax2 = ax1.twinx()
ax2.plot(w / np.pi, gd, 'r')
ax2.set_ylabel('Group delay [samples]', color='r')
plt.show()