Numpy FFT 错误 - 带包络的梳状滤波器

Numpy FFT error - Comb filter with envelope

我目前在理解通过 Z 变换和 numpy 的 FFT 算法计算的频率响应函数之间存在一些差异时遇到了一些问题。它是由脉冲响应表示的简单回声:

h[n] = δ[n] + αδ[n-L]

其中 α 是回声的衰减因子,L 是样本中的延迟量。相应的传递函数为:

H(f) = ( e^(j2πfΔL) + α ) / e^(j2πfΔL)

其中Δ是采样周期。

在直接绘制上面的传递函数幅度和使用 numpy 的 fft 算法时,我似乎使用相同数量的频率区间得到不同的结果。 特别是,FFT 幅度似乎在整个频谱周围形成了一个包络线——我相信我应该得到一个简单的梳状滤波器作为传递函数方法:imgur

任何人都可以解释为什么会发生这种情况以及我是否可能忽略了什么?这是由于所采用的 DFT 算法错误造成的吗?

感谢您的宝贵时间,干杯!

import matplotlib.pyplot as pyplt
import numpy as np

fs = 48000  # Sample rate
T = 1/fs    # Sample period
L = 3000    # Delay
a = 0.5     # Attenuation factor

# h[n] = dirac[n] + a * dirac[n-L]
h = np.zeros(L)
h[0] = 1
h[L-1] = a

# Transfer function H
freqs = np.arange(0, fs, fs/(2*L))
e = np.exp(1j*freqs*2*np.pi*L*T)
H = (e + a)/(e)

# Transfer function H via FFT - same # of bins
H_FFT = np.fft.fft(h, 2*L)

pyplt.figure()
# Correct comb filter
pyplt.plot(np.abs(H))
# Runing FFT gives a form of strange envelope error
pyplt.plot(np.abs(H_FFT))
pyplt.legend()

你的代码差不多OK了。您需要更改的内容:

  1. 据我了解,傅立叶变换向量的长度没有理由与 L 成正比。它需要是采样频率的大小,即 fs。

  2. 你的L太高了。结果波动太快。尝试降低 L.

这里是一个修改后的代码来展示它是如何工作的,为清楚起见用两个不同的图绘制:

import matplotlib.pyplot as plt
import numpy as np

fs = 48000  # Sample rate
T = 1/fs    # Sample period
L = 3    # Delay
a = 0.5     # Attenuation factor

# h[n] = dirac[n] + a * dirac[n-L]
h = np.zeros(fs)
h[0] = 1
h[L] = a

# Transfer function H
freqs = np.arange(0, fs)
e = np.exp(1j*freqs*2*np.pi*L*T)
H = (e + a)/(e)

# Transfer function H via FFT - same # of bins
H_FFT = np.fft.fft(h)

# Correct comb filter
plt.figure()
plt.plot(np.abs(H))
# Runing FFT gives a form of strange envelope error
plt.figure()
plt.plot(np.abs(H_FFT))