首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带包络的Numpy FFT误差梳状滤波器

带包络的Numpy FFT误差梳状滤波器
EN

Stack Overflow用户
提问于 2018-03-04 03:42:42
回答 1查看 1.4K关注 0票数 0

我目前有一些问题,理解一些差异的频率响应函数计算的Z-变换和numpy的FFT算法。这是一个简单的回声,用脉冲响应来表示:

代码语言:javascript
复制
h[n] = δ[n] + αδ[n-L]

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

代码语言:javascript
复制
H(f) = ( e^(j2πfΔL) + α ) / e^(j2πfΔL)

其中Δ是采样周期。

我似乎得到了不同的结果,使用相同数目的频率箱时,直接绘制传递函数的幅度以上和使用numpy的fft算法。特别是,FFT的幅值似乎在整个光谱周围形成了一个包络--我相信我应该得到一个简单的梳状滤波器,就像传递函数法一样:印古尔

有人能解释一下为什么会发生这种情况吗?我是否有可能忽略任何事情?这是由于所使用的DFT算法的错误吗?

感谢你的时间,干杯!

代码语言:javascript
复制
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()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-04 12:31:45

你的代码几乎没问题。你需要改变的是:

  1. 据我所知,没有理由认为傅里叶变换向量的长度与L成正比。它必须是采样频率的大小,即fs。
  2. 你的L太高了。结果波动太快了。用较低的L。

下面是一段经过修改的代码,用来显示它是如何工作的,为了清晰起见,用两个不同的数字绘制了这些代码:

代码语言:javascript
复制
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))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49091756

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档