为什么scipy和numpy的fft图看起来不一样?

2024-06-10 21:18:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在为一个课程做一些频谱分析,虽然我们还没有明确地教授傅里叶变换。我在scipy和numpy中使用了各种fft算法来处理一些我知道答案应该是什么样子的数据

在这种情况下,其AM信号在8kHz载波频率和1kHz调制正弦波顶部,因此在fft上应有3个清晰的峰值

当应用scipy.fftpack.rfftnumpy.fft.rfft时,我分别得到以下图:

Scipy:

enter image description here

纽比:

enter image description here

虽然2个fft的形状与峰之间的正确比率大致相同,但numpy的fft看起来更平滑,而scipy的fft的max峰稍小,噪声也更大。

我假设这在很大程度上归因于离散傅立叶变换算法的不同应用,并且已经看过其他关于scipy实现如何在运行时更快的文章。但我在想到底是什么导致了这种差异,哪一个更准确?

编辑:用于生成绘图的代码:

data = pd.read_csv("./Waveforms/AM waveform Sine.csv", sep = ',', dtype = float)

data = data.as_matrix()
time = data[:,0]
voltage = data[:,1]/data[:,1].max() # normalise the values

#scipy plot:
plt.figure()
magnitude =  scipy.fftpack.rfft(voltage)
freq = scipy.fftpack.rfftfreq(len(time),np.diff(time)[0])
plt.figure()
plt.plot(freq, np.absolute(magnitude), lw = 1)
plt.ylim(0,2500)
plt.xlim(0,15)

#numpy plot
magnitude = np.fft.rfft(voltage)
freq = np.fft.rfftfreq(len(time),np.diff(time)[0])

plt.figure()
plt.plot(freq, np.absolute(magnitude), lw = 1)
plt.ylim(0,2500)
plt.xlim(0,15)

Tags: fftnumpy算法datatimeplotnpplt