功率谱错误地产生负值

Power spectrum incorrectly yielding negative values

我有一个实时信号:

我只是想计算它的功率谱,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()

但输出给出:

具有负值输出。尽管如果我简单地取 y 轴上数据的绝对值并绘制它(即 np.abs(Power_spectrum)),那么输出是:

这正是我所期望的。尽管为什么只能通过取我的功率谱的绝对值来解决这个问题?我检查了我的自相关并绘制了它——它似乎按预期工作并且与其他人计算的相匹配。

尽管当我进行 FFT 时,下一步看起来很奇怪。 FFT 函数输出负值,这与上面 link 中讨论的理论相反,我不太明白为什么。有什么问题吗?

fft 产生复杂的结果(实部和虚部表示频谱的幅度和相位)。您必须取复向量的(平方)幅值才能得到功率谱。

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

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

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

改为这样做,这样总的工作将是一个 FFT 而不是 3 个。