FIR Hilbert 变压器的相位响应

信息处理 阶段 有限脉冲响应 希尔伯特变换
2022-01-29 19:26:27

下图显示了 FIR 希尔伯特变压器的线性相位响应,其恒定差异为 -0.06135923。我不确定我是否正确理解了相位响应的概念,但由于正交是输入信号偏移了 PI/2,为什么相位响应在 PI/2 处不是一条水平直线? 在此处输入图像描述

生成图形的代码直接从Scipy 的文档(页面底部的示例)中复制,除了我没有展开相位角并且我使用了以下滤波器系数:

N = 10
b = [2*np.sin(np.pi*n/2)**2/(np.pi*n) for n in range(1, N+1)]
b = np.append(-1*np.flip(b, 0), np.append([0], b))*np.hamming(2*N+1)

我尝试了不同的 N 值,每次相位响应线的行为都是相同的,只是陡度不同。

3个回答

斜率表示个样本的延迟。您可以通过将传递函数乘以个样本的负延迟的传递函数)或在 Python 中将脉冲响应居中于时间零:NeiωNNnp.exp(1j*w*N)

from scipy import signal
import numpy as np
N = 10
b = [2*np.sin(np.pi*n/2)**2/(np.pi*n) for n in range(1, N+1)]
b = np.append(-1*np.flip(b, 0), np.append([0], b))*np.hamming(2*N+1)
w, h = signal.freqz(b)
h = h*np.exp(1j*w*N)
import matplotlib.pyplot as plt
fig = plt.figure()
plt.title('Digital filter frequency response')
ax1 = fig.add_subplot(111)
plt.plot(w, 20 * np.log10(abs(h)), 'b')
plt.ylabel('Amplitude [dB]', color='b')
plt.xlabel('Frequency [rad/sample]')
ax2 = ax1.twinx()
angles = np.angle(h)
plt.plot(w, angles, 'g')
plt.ylabel('Angle (radians)', color='g')
plt.grid()
plt.axis('tight')
plt.show()

以上大部分内容来自您链接到的Scipy 文档。这被绘制:


图 1. 以零时间为中心的希尔伯特变压器的频率响应。

相位在频率为零时变为零,因为相位频率响应从正频率的π/2π/2

为什么相位响应在 PI/2 处不是一条水平直线?

不可能!因为群延迟是相位对频率的导数,这意味着你得到零群延迟(因为常数不依赖于)。π2f

由于这是一个因果过滤器,因此您不能有零延迟。那太棒了,但对于因果系统来说是不可能的。

因此,将其视为您的恒定相位事物,只是在时间上移动了滤波器长度的一半以成为因果关系。在频域中,时移变成了复振荡的乘法,并且具有线性相位!

您有一个线性相位,这是因果滤波器所期望的:滤波器在时域中延迟,而不是以为中心。t=0

回忆一下傅里叶变换的移位定理。时域中的偏移对应于频域中的复指数调制。