对 FIR 全通滤波器设计结果的困惑

信息处理 过滤器 过滤器设计 Python 卷积 全部通过
2022-02-21 11:56:38

我尝试设计一个在频域中具有随机相位的 FIR 全通滤波器。我对我的结果有点困惑,不确定原因是编程错误还是对我自己的卷积和脉冲响应的误解。我使用 Python 和 Numpy:

import numpy as np

mag = np.ones(129) # magnitude is unitiy
phase = np.zeros(129)
random_numbers = (np.random.rand(128)-0.5)*2.0
phase[1:] = random_numbers * np.pi # phase is random except for dc offset
spec = mag*np.exp(phase * 1j) # get spectrum from magnitude and phase
coefficients = np.fft.irfft(spec) # do inverse fft to get coefficents, result is of length 256

如果我对系数进行 fft,则幅度看起来几乎正确。我的第一个问题:为什么最高频率被抑制?

系数的幅度谱

其次,如果我使用我的系数与脉冲进行卷积,我认为应该重现系数?但事实并非如此。为什么在 1.0 左右会有这些“随机变化”?

impulse = np.zeros(256, dtype=np.float64) # create impulse
impulse[256/2] = 1.0
result = np.convolve(impulse, coefficients, "same") # convolve it

系数和脉冲卷积结果的幅度谱

非常感谢任何解释或提示!

1个回答

Nyquist 的下降与您没有将值分配给Nyquist 的所需相位有关。您正确地将分配给 DC 处的相位,但您必须在 Nyquist 处执行相同操作,因为具有实值系数的滤波器在 DCNyquist 处具有实值频率响应。所以你只需要 127 个随机数,而不是 128 个。00

但是设计滤波器的幅度响应图具有欺骗性,因为通过对系数进行 FFT(长度为 256),您基本上只是绘制了所需的幅度(除了奈奎斯特点),因为您只是颠倒了您的设计过程。尝试对系数进行零填充并采用长度为 1024 或更长的 FFT。您会惊讶地发现您的滤波器根本不像一个非常好的全通滤波器。你在第二个情节中看到了一些迹象,这更现实。

请注意,非平凡 FIR 滤波器(即不仅仅是单个 delta 脉冲的滤波器)永远不可能具有完全恒定的幅度响应,因为它的传递函数是一个不能恒定的多项式(除非它是平凡多项式) . 您的全通滤波器的幅度响应特别差,因为滤波器很难近似那些随机相位跳跃。