0
我想将一个Hann窗口应用于正弦信号,并应用FFT来恢复频率和振幅。这是我创建的一个典型案例,用于在我移至我的数据(我想要准确确定频率内容和幅度的实时信号)之前增加我的理解。在下面的代码中,我需要通过2.0倍来恢复幅度。我理解乘以2/N,但现在我乘以4/N。有没有人遇到过这个问题,或者有谁能提供解释为什么这是?这里是我的代码:窗口化FFT后恢复幅度以恢复正确振幅
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文档,非常小心地注意它对正常化的描述。 – 2014-12-02 23:07:42
谢谢你的评论。我可以同意它可以有点毛茸茸的。我的问题更多与汉恩窗口有关。如果我不使用Hann Window和np.fft.fft(x),那么我只需要乘以2/n(这对我有意义)。只有在我有效需要以4/n倍增的窗口时,我不确定原因。 – 2014-12-02 23:13:02