功率谱错误地产生负值

时间:2017-03-08 05:59:25

标签: numpy scipy signal-processing fft spectrum

我有一个真实的时间信号:

enter image description here

我只想尝试计算其功率谱which is the Fourier transform of the autocorrelation of the signal, and is also a purely real and positive quantity in this case。为此,我只想写:

import numpy as np
from scipy.fftpack import fft, arange, rfftfreq, rfft 
from pylab import *

lags1, c1, line1, b1 = acorr(((Y_DATA)), usevlines=False, normed=True, maxlags=3998, lw=2)
Power_spectrum = (fft(np.real(c1)))
freqs = np.fft.fftfreq(len(c1), dx)
plt.plot(freqs,Power_spectrum)
plt.xlabel('f (Hz)')
plt.xlim([-20000,20000])
plt.show()

但输出结果为:

enter image description here

具有负值输出。虽然如果我只是在y轴上取数据的绝对值并绘制它(即np.abs(Power_spectrum)),那么输出是:

enter image description here

这正是我所期待的。虽然为什么这只能通过我的功率谱的绝对值来确定?我检查了我的自相关并绘制了它 - 似乎按预期工作并匹配其他人计算的内容。

enter image description here

虽然看起来奇怪的是我采用FFT的下一步。 FFT函数输出负值,这与上面链接中讨论的理论相反,我不太明白为什么。对于出了什么问题的任何想法?

2 个答案:

答案 0 :(得分:0)

fft产生复杂的结果(实数和虚数分量表示频谱的幅度和相位)。你必须采用复数向量的(平方)幅度来获得功率谱。

答案 1 :(得分:0)

功率谱是自相关的FFT,但这不是计算它的有效方法。

无论如何,可能使用FFT和iFFT计算自相关。

功率谱只是FFT系数的平方幅度。

相反,这样做总工作将是一个FFT而不是3。