scipy.fftpack 的 fft 图中出现常量线

constant lines occur in plot of fft with scipy.fftpack

当我用 scipy.fftpack 在信号上计算 FFT 并在之后绘制它时,我得到一条恒定的水平线(和一条垂直线在我的数据上)谁能解释为什么这些线会出现并且可能存在没有线条绘制频谱的解决方案?

让我们来看一个简单的信号。频率为 12 赫兹的正弦波。在此示例中,您可以在大约 y = 2.1.

处看到水平线
import numpy as np
import matplotlib.pyplot as plt
import scipy.fftpack

# test signal
omega = 2 * np.pi * 12
t = np.linspace(-15, 15, 1000)
ampl = np.sin(omega * t)

# compute fft, fft frequences
fft  = abs(scipy.fft(amp))
freq = scipy.fftpack.fftfreq(fft.size, t[1] - t[0])

# plot
plt.plot(freq, fft)

这是我的实验信号的 fft 图(放大)。您可以看到水平线 (y =~ 0.0015) 和垂直线 (x = 0)。

根据这些行,我无法在数组中找到任何数据。为什么会出现这些线条?

来自 FFT 的数据首先包括正频率,然后是负频率。您看到的线是连接正频率的最后一个点和负频率的第一个点的线。

为避免这种情况,您可以交换频谱的两半,以便数据以自然顺序出现:

plt.plot(scipy.fftpack.fftshift(freq), scipy.fftpack.fftshift(fft))

你是对的,这条线连接了第一个和最后一个数据。正如@SleuthEye 之前解释的那样,标准 fft 函数更喜欢先绘制正频率,然后绘制负频率。

添加第三行和第四行就很容易解决这个问题,如下

fftData = np.fft.fft(data)
freq = np.fft.fftfreq(lenData, 1/fSamp)
fftData = np.fft.fftshift(fftData)
freq = np.fft.fftshift(freq)