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

问题描述

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

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

FFT graph with horizontal lines

我想问一下这里可能有什么问题。

这是我的脚本:

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 个不同条件的值,这就是为什么我将它们分开并对一半的初始样本数应用汉宁窗口。对于每个条件,只有 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 提出了解决方案。