我有一个简单的正弦波。我试图在频域中找到震级谱。
我使用了函数matplotlib.mlab.magnitude_spectrum(data)来验证这个结果,所以我尝试了numpy.abs(numpy.fft.fft(data)),结果是不同的。
应该是一样的,对吧?即使我试着
numpy.sqrt(matplotlib.mlab.psd(data)),结果是不同的。
我正在寻找这件事的解释。
发布于 2015-04-24 18:25:56
这里有两个主要的区别。首先,matplotlib.mlab.magnitude_spectrum在进行快速傅立叶变换之前对输入数据应用窗口函数(默认情况下为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()

matplotlib.mlab.psd做了一些更复杂的事情-它使用Welch's method计算周期图,而不仅仅是取FFT的平方幅度。它基本上是对信号的窗口重叠部分进行平均周期图,以牺牲一些频率分辨率为代价,给你一个“更平滑的”周期图,它对噪声更有鲁棒性。根据信号的外观,以及您对psd的NFFT=和noverlap=参数的选择,您应该会看到与magnitude_spectrum完全不同的结果。
https://stackoverflow.com/questions/29844783
复制相似问题