我正在尝试设计一个近似希尔伯特变换的 FIR 滤波器,以获得相移和单位增益。但是,我无法调整过滤器以使其成为因果关系。我已经阅读了这个答案,这非常有帮助。这是我到目前为止所得到的。
import numpy as np
import matplotlib.pyplot as plt
from scipy.signal.windows import hamming
N = 50
H = hamming(2 * N + 1)
def coeff(n):
if n == 0:
return 0
return H[int(n + N - 1)] * (2 / np.pi) * (np.sin(np.pi * n / 2) ** 2 / n)
def freq(w):
return np.sum(
[coeff(n) * np.exp(-1 * 1j * w * n) for n in range(-N, N + 1)]
)
if __name__ == "__main__":
freq_vals = np.linspace(0, np.pi, 1000)
freq_resp = [np.abs(freq(w)) for w in freq_vals]
ang_resp = [np.angle(freq(w)) for w in freq_vals]
# plot frequency response
plt.plot(freq_vals / np.pi, freq_resp)
# plot phase shift
plt.plot(freq_vals / np.pi, ang_resp)
plt.show()
coeff
使用等式计算理想的希尔伯特变换系数
我取自离散时间信号处理 (3e) p.959。我已经限制. 此外,它应用汉明窗来减少吉布斯现象(参见上面的链接答案)。
freq
然后使用等式计算给定频率值的频率响应
现在,当我绘制这个(plt.plot
线)时,我得到了我期望的幅度和相位响应:
但是,我计算了脉冲响应值. 所以,这个过滤器不是因果的。我相信这个过滤器应该是时间不变的,所以我试图简单地改变它,以便现在范围从 0 到. 这是调整后的freq
功能:
def freq(w):
return np.sum(
[coeff(n - N) * np.exp(-1 * 1j * w * n) for n in range(0, 2 * N + 1)]
)
这会产生相同的频率幅度响应,但具有以下“不正确”的相位响应:
我希望我误解了这个过程的一些基本内容,但我不确定是什么。我怎样才能使这个滤波器与所需的相位响应有因果关系?为什么我试图使滤波器因果保持正确的幅度响应而不是相位响应?