matplotlib.mlab中可用的magnitude_spectrum结果与numpy.abs(numpy.fft.fft(data))之间的差异

时间:2015-04-24 10:12:55

标签: python numpy matplotlib signal-processing fft

我有一个简单的正弦波。我试图在频域中找到幅度谱 我使用了函数matplotlib.mlab.magnitude_spectrum(data) 我想验证此结果,因此我尝试numpy.abs(numpy.fft.fft(data)) 结果不同。
它应该是一样的吗?即使我尝试了  numpy.sqrt(matplotlib.mlab.psd(data)),结果不同。

我正在寻找解释。

1 个答案:

答案 0 :(得分:4)

主要有两个不同之处。首先,matplotlib.mlab.magnitude_spectrum在进行FFT之前将窗口函数应用于输入数据(默认情况下为Hanning window)。其次,它仅返回正频率,而np.fft.fft返回正频率和负频率:

import numpy as np
from matplotlib import pyplot as plt


x = np.random.randn(500)

mag1, f = plt.mlab.magnitude_spectrum(x)

# apply a hanning window to x
xw = np.hanning(x.shape[0]) * x

# use np.fft.rfft to get the positive frequencies only
mag2 = np.abs(np.fft.rfft(xw))

fig, ax = plt.subplots(1, 1)
ax.hold(True)
ax.plot(f, mag1, '-k', lw=2)
ax.plot(f, mag2, '--r', lw=2)
plt.show()

enter image description here

matplotlib.mlab.psd做了更复杂的事情 - 它使用Welch's method计算周期图,而不是仅采用FFT的平方幅度。它基本上采用平均周期图来覆盖信号的窗口重叠段,为您提供一个“更平滑”的周期图,它对噪声更加鲁棒,但会牺牲一些频率分辨率。根据您的信号的样子以及您选择的NFFT=noverlap= psd参数,您应该期望结果与magnitude_spectrum的结果完全不同。< / p>