2014-12-02 57 views
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") 
+0

这不会有很多帮助,但我只是说FFT归一化可能会引起混淆,尤其是因为并非每个人都以同样的方式进行。有些人喜欢正向变换中的“2”,但不是相反的。有些人喜欢它,但不是前锋。一些“分裂”2,在正向和反向都放置$ \ sqrt {2} $。我只是建议阅读np.fft文档,非常小心地注意它对正常化的描述。 – 2014-12-02 23:07:42

+0

谢谢你的评论。我可以同意它可以有点毛茸茸的。我的问题更多与汉恩窗口有关。如果我不使用Hann Window和np.fft.fft(x),那么我只需要乘以2/n(这对我有意义)。只有在我有效需要以4/n倍增的窗口时,我不确定原因。 – 2014-12-02 23:13:02

回答

1

冯翰窗口的平均值为(大约)0.5,为N=1000你有

>>> N=1000 ; print sum(np.hanning(N))/N 
0.4995 
>>> 

这是否由两个解释相乘的必要性,以恢复离散幅度?