Numpy 功率谱错误地产生负值

Numpy 功率谱错误地产生负值,numpy,scipy,signal-processing,fft,spectrum,Numpy,Scipy,Signal Processing,Fft,Spectrum,我有一个实时的信号,由: 我只是想计算它的功率谱。为此,我只需写下: 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.rea

我有一个实时的信号,由:

我只是想计算它的功率谱。为此,我只需写下:

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(功率谱)
),但输出是:

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


虽然奇怪的是下一步当我进行FFT时。FFT函数输出负值,这与上面链接中讨论的理论相反,我不太明白为什么。有什么想法吗?

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

fft产生复结果(实部和虚部代表频谱的幅值和相位)。你必须得到复向量的(平方)大小才能得到功率谱。

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

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

功率谱也是FFT系数的平方大小


这样做,总功将是一个FFT,而不是3个。

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

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

功率谱也是FFT系数的平方大小


改为这样做,总功将是一个FFT而不是三个。

也许这是一个
FFT.fftshift
问题?@PaulPanzer您介意扩展吗?例如,你是说FFT没有正确考虑自相关的时间轴吗?在上面的代码中,它不是简单地假设
np.real(c1)
中的项之间的间隔是恒定的,并且索引与c1相同(即元素0是第一个,元素1是第二个,等等)?好吧,因为你似乎在说光谱的大小是确定的,而不是复杂的参数;这正是时域变化的影响。如果你的自相关图居中,那就错了,因为如果我没弄错的话,“fft坐标”中的零不在中心,而是在最左边。由于这种差异是一个常见的问题,因此有一个方便的功能
fftshift
@PaulPanzer谢谢您的澄清。所以它确实起作用了,给我的答案和当我将x轴更改为
np.fft.fftshift(freqs)
并将y轴更改为
fftshift(fft(ifftshift(c1))
时简单地取绝对值一样。文档确实提供了一些信息,尽管我仍然有点不确定为什么要应用
ifftshift
然后
fftshift
解决问题。有什么想法吗?可能是fft.fftshift的问题?@PaulPanzer你介意扩展吗?例如,你是说FFT没有正确考虑自相关的时间轴吗?在上面的代码中,它不是简单地假设
np.real(c1)
中的项之间的间隔是恒定的,并且索引与c1相同(即元素0是第一个,元素1是第二个,等等)?好吧,因为你似乎在说光谱的大小是确定的,而不是复杂的参数;这正是时域变化的影响。如果你的自相关图居中,那就错了,因为如果我没弄错的话,“fft坐标”中的零不在中心,而是在最左边。由于这种差异是一个常见的问题,因此有一个方便的功能
fftshift
@PaulPanzer谢谢您的澄清。所以它确实起作用了,给我的答案和当我将x轴更改为
np.fft.fftshift(freqs)
并将y轴更改为
fftshift(fft(ifftshift(c1))
时简单地取绝对值一样。文档确实提供了一些信息,尽管我仍然有点不确定为什么要应用
ifftshift
然后
fftshift
解决问题。有什么想法吗?因为自相关是对称的,它的FFT只包括实分量。。。如果你把0放在正确的位置,因为自相关是对称的,它的FFT只包括实分量。。。如果您将0放在正确的位置,谢谢您的回复,我同意它最终是等效的(在上面的链接中演示)。虽然我想知道为什么我采用自相关然后FFT的方法不起作用(即,我应用FFT时出错)。您可能需要对自相关数据执行循环移位,以便在FFT之前0滞后系数进入索引0。但是取FFT结果的abs()做同样的事情。也许这是我误解了一个概念,但是为什么0滞后系数必须是指数0呢?FFT不是从本质上捕获自相关的周期性成分(或一般的任何函数)而独立于任何水平平移吗?不,FFT捕获整个信号。你知道一定是这样,因为如果你做iFFT,你会得到同样的信号。组件的“水平平移”在系数阶段捕获谢谢您的回复,我同意它最终是等效的(在上面的链接中演示)。虽然我想知道为什么我采用自相关然后FFT的方法不起作用(即错误I