【发布时间】:2017-07-28 14:09:57
【问题描述】:
我有一个实时信号:
我只是想计算它的功率谱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 函数输出负值,这与上面链接中讨论的理论相反,我不太明白为什么。对出了什么问题有任何想法吗?
【问题讨论】:
-
可能是
fft.fftshift问题? -
@PaulPanzer 你介意扩展吗?例如,您是说 FFT 没有正确考虑自相关的时间轴吗?在上面的代码中,是不是简单地假设
np.real(c1)中的item之间的间距与c1相同(即元素0是第一个,元素1是第二个,等等)? -
好吧,既然您似乎在说光谱的大小是可以的,但不是复杂的论点;这正是时域变化的影响。如果您的自相关图居中,那么这是错误的,因为如果我没记错,“fft 坐标”中的零不在中心,而是在最左边。由于这种差异是一个常见的头痛问题,因此有这个便利功能
fftshift。 -
@PaulPanzer 感谢您的澄清。因此,当我将 x 轴更改为
np.fft.fftshift(freqs)并将 y 轴更改为fftshift(fft(ifftshift(c1)))时,它似乎确实有效,并且给了我与简单地取绝对值相同的答案。该文档确实提供了一些信息,尽管我仍然有点不确定为什么确切地应用ifftshift然后fftshift解决了这个问题。有什么想法吗?
标签: numpy scipy signal-processing fft spectrum