2012-11-14 31 views
2

用scipy.fftpack.fft()對某些樣本進行離散傅里葉變換並繪製這些樣本的大小後,我注意到它不等於原始信號的幅度。兩者之間有沒有關係?你能計算傅立葉變換的原始信號的幅度/功率嗎?

有沒有一種方法可以根據傅里葉係數計算原始信號的幅度而不需要反轉變換?

這裏的正弦波振幅7.0的例子,FFT幅度3.5

from numpy import sin, linspace, pi 
from pylab import plot, show, title, xlabel, ylabel, subplot 
from scipy import fft, arange 

def plotSpectrum(y,Fs): 
""" 
Plots a Single-Sided Amplitude Spectrum of y(t) 
""" 
n = len(y) # length of the signal 
k = arange(n) 
T = n/Fs 
frq = k/T # two sides frequency range 
frq = frq[range(n/2)] # one side frequency range 

Y = fft(y)/n # fft computing and normalization 
Y = Y[range(n/2)] 

plot(frq,abs(Y),'r') # plotting the spectrum 
xlabel('Freq (Hz)') 
ylabel('|Y(freq)|') 

Fs = 150.0; # sampling rate 
Ts = 1.0/Fs; # sampling interval 
t = arange(0,1,Ts) # time vector 

ff = 5; # frequency of the signal 
y = 7.0 * sin(2*pi*ff*t) 

subplot(2,1,1) 
plot(t,y) 
xlabel('Time') 
ylabel('Amplitude') 
subplot(2,1,2) 
plotSpectrum(y,Fs) 
show() 
+2

我想嘗試http://math.stackexchange.com/編程部分是真正切合你的問題。 – Jake

+0

你能舉個例子嗎?有很多原因沒有得到正確的幅度:錯誤的滿量程,忘記考慮採樣數量(取決於方法),... – lucasg

+0

它在你的代碼的評論中說,你只繪製一半的頻率範圍。這就是爲什麼你只能得到幅度的一半(對於任何嚴格實際的輸入信號)。 – hotpaw2

回答

6

是,Parseval's Theorem告訴我們,在頻域的總功率等於在時域的總功率。

雖然您可能看到的是正向FFT中縮放因子的結果。這個比例因子的大小是一個常規問題,但最常見的是它的一個因子N,其中N是數據點的數量。但它也可以等於1或sqrt(N)。檢查你的FFT文件。

另請注意,如果您只從一半頻域分箱中獲取功率(通常在時域信號純粹是實數並且在頻域中具有複共軛對稱性時),那麼將會有一個因子2去照顧。