2014-12-02 58 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 
>>> 

這是否由兩個解釋相乘的必要性,以恢復離散幅度?