当我使用 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)
Run Code Online (Sandbox Code Playgroud)
这是我的实验信号的 FFT 图(放大)。您可以看到水平线 ( y =~ 0.0015) 和垂直线 ( 在x = 0)。
根据这些行,我在数组中找不到任何数据。为什么会出现这些线条?
小智 5
你是对的,这条线连接了第一个和最后一个数据。正如@SleuthEye 之前所解释的,标准fft函数更喜欢首先绘制正频率,然后绘制负频率。
通过添加第三行和第四行就可以很容易地解决这个问题,如下
fftData = np.fft.fft(data)
freq = np.fft.fftfreq(lenData, 1/fSamp)
fftData = np.fft.fftshift(fftData)
freq = np.fft.fftshift(freq)
Run Code Online (Sandbox Code Playgroud)