为什么我的 FFT 图有这些水平线?

Why do my FFT plots have these horizontal lines?

我是 Python 和信号处理的新手,我遇到了 FFT 问题。

我应该分析一组数据并从中找到调制频率。我写了一个基本的 FFT 脚本来做这个,输出看起来有点奇怪。它确实像普通 FFT 图一样显示峰值。但是,对于每条线,它都有一条连接两端的水平线,而不是两端展开。

我想问问这里可能是什么问题

这是我的脚本:

from numpy.fft import fft, fftfreq
import matplotlib.pyplot as plt

Nsample = len(data)
n=96 #for zero-padded
window = np.hanning(Nsample/2) #Hann window
data1 = data[(data['condition']=='a')]
data2 = data[(data['condition']=='b')]

#Apply Hann window then do FFT
data1_Hann = data1['val']*window
data1_FFT = fft(data1_Hann, n)
freq1 = fftfreq(n, d=0.026)

data2_Hann = data2['val']*window
data2_FFT = fft(data2_Hann, n)
freq2 = fftfreq(n, d=0.026)

plt.plot(freq1, np.abs(data1_FFT), freq2, np.abs(data2_FFT))
plt.xlabel("Frequency (Hz)")
plt.ylabel("Amplitude")

data 是一个 DataFrame,其中包含 2 个不同条件的值,它们混在一起,这就是为什么我将它们分开并且 Hanning window 应用于初始样本数的一半。对于每个条件,只有 12 个值,所以我进行了零填充,以使峰值清晰可见,图形看起来更平滑(我确实尝试使用较小的数字进行零填充,但线条仍然存在)。

答案:由于 fft 计算输出的顺序,该图看起来像这样:它从 0 Hz 开始(此处提供更多详细信息:https://numpy.org/doc/stable/reference/generated/numpy.fft.fftfreq.html

我使用 numpy.fft.fftshift() 函数解决了这个问题(此处提供了更多详细信息:https://numpy.org/doc/stable/reference/generated/numpy.fft.fftshift.html)。

解决方案已由@gavinb 和@yanziselman 提出。