2012-11-14 28 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去照顾。