功率谱错误地产生负值

计算科学 scipy 麻木的 傅里叶变换 信号处理
2021-11-30 04:22:41

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

在此处输入图像描述

我只是想计算它的功率谱,即信号自相关的傅里​​叶变换,在这种情况下也是一个纯实数和正数为此,我只需编写:

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 函数输出负值,这与上面链接中讨论的理论相反,我不太明白为什么。对出了什么问题有任何想法吗?

1个回答

这是由于隐含的时间偏移,它对应于相移,在此被视为符号反转。

您正在傅里叶变换的信号在 t=0 附近是对称的,这就是为什么您应该期望正功率谱的原因。的离散傅里叶变换 (DFT)是 FFT 算法实现的,定义为 其中是数据点的数量。xn

Xk=n=0N1xne2πikn,
N

忽略一些归一化问题,这可以解释为采样信号的傅立叶变换的近似值,其中是时间窗口的宽度。这就是隐式时移的来源。“正确的”时间样本值为因此具有实数和非负值的相位校正功率谱由 ,这解释了您观察到的快速符号变化。

ωk=2πk
tn=nT,
T
t^n=tnT/2,
X^k=n=0N1xne2πik(n1/2)=Xkeiπk,
Xk=(1)kX^k