【发布时间】:2014-12-02 22:49:20
【问题描述】:
我正在尝试将 Hann 窗应用于正弦信号,其想法是应用 FFT 来恢复频率和幅度。这是我创建的一个典型案例,以在我开始处理我的数据(我想要准确确定频率内容和幅度的实时信号)之前增加我的理解。在下面的代码中,我需要乘以 2.0 的附加因子来恢复幅度。我理解乘以 2/N,但现在我乘以 4/N。有没有人遇到过这个,或者任何人都可以解释为什么会这样?这是我的代码:
import numpy as np
import matplotlib.pyplot as plt
# first create the time signal, which has two frequencies 13.2 hz and 43.9 hz
f_s = 100.0 # Hz sampling frequency
f = 1.0 # Hz
time = np.arange(0.0, 10.0, 1/f_s)
x = 5 * np.sin(13.2 * 2 * np.pi * f * time) + 3 * np.sin(43.9 * 2 * np.pi * f * time)
x = x + np.random.randn(len(time)) #inject some noise
# apply hann window and take the FFT
win = np.hanning(len(x))
FFT = np.fft.fft(win * x) * 2.0 # IT SEEMS I NEED AN ADDITIONAL FACTOR OF 2 TO RECOVER THE AMPLITUDES
n = len(FFT)
freq_hanned = np.fft.fftfreq(n, 1/f_s)
half_n = np.ceil(n/2.0)
fft_hanned_half = (2.0 / n) * FFT[:half_n]
freq_hanned_half = freq_hanned[:half_n]
# and plot
plt.plot(freq_hanned_half, np.abs(fft_hanned_half))
plt.xlabel("Frequency (Hz)")
plt.ylabel("Amplitude")
【问题讨论】:
-
这不会有太大帮助,但我只想说 FFT 规范化可能会让人感到困惑,尤其是因为不是每个人都以相同的方式进行。有些人喜欢正向变换中的“2”,但不喜欢反向变换。有些人喜欢反向但不喜欢正向。一些“拆分” 2,将 $\sqrt{2}$ 放在正向和反向。我只是建议非常仔细地阅读 np.fft 文档,特别注意它关于规范化的内容。
-
感谢您的评论。我同意它会有点毛茸茸。我的问题与 Hann Window 有更多关系。如果我不使用 Hann Window 而只使用 np.fft.fft(x),那么我只需要乘以 2/n(这对我来说很有意义)。只有在窗口中我实际上需要乘以 4/n,但我不确定为什么。
标签: python numpy signal-processing fft