当我在信号上使用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
)。
根据这些行,我在数组中找不到任何数据。为什么会出现这些线?
答案 0 :(得分:2)
来自FFT的数据首先包括正频率,然后包括负频率。您看到的线是将正频率的最后一个点连接到负频率的第一个点的线。
为避免这种情况,您可以交换频谱的两半,以便数据以自然顺序发生:
plt.plot(scipy.fftpack.fftshift(freq), scipy.fftpack.fftshift(fft))
答案 1 :(得分:0)
您是对的,该行连接了第一个和最后一个数据。正如@SleuthEye先前解释的那样,标准fft
函数倾向于先绘制正频率,然后绘制负频率。
通过添加第三和第四行来解决此问题非常容易,如下所示
fftData = np.fft.fft(data)
freq = np.fft.fftfreq(lenData, 1/fSamp)
fftData = np.fft.fftshift(fftData)
freq = np.fft.fftshift(freq)