了解 matplotlib magnitude_spectrum 输出

问题描述 投票:0回答:2

我在理解 matplotlib 的 magnitude_spectrum 函数调用生成的输出时遇到问题。

我生成了一个频率为 50khz 的正弦波,

f_s = 488000.0 # Hz
t = np.arange(0.0, 1.0, 1/f_s)
s1 = 100*np.sin(2*np.pi*50000*t)

然后我在除以 FFT bins 的数量后绘制结果幅度谱

s1_magspec = plt.magnitude_spectrum(s1,Fs=f_s)
plt.plot(s1_magspec[0]/len(s1_magspec[0]))

结果是 50khz 的单个尖峰,但幅度为 50,而不是预期的 100。

谁能解释这是为什么?

这里是 ipython 笔记本的链接,描述了显示上述代码和结果图:

http://nbviewer.ipython.org/gist/bkinman/22cc15d3ad3b9b2db09e

python matplotlib signal-processing
2个回答
5
投票

看起来它与所使用的 FFT 窗口的默认设置有关。文档说默认是汉宁窗。如果您改用棚车窗:

s1_magspec = plt.magnitude_spectrum(s1, Fs=f_s, window=np.ones(s1.shape))

你会在 100 处达到峰值,就像使用直接的 numpy FFT 一样。

顺便说一句,如果您编辑问题以放入创建

s1_magspec
的代码行而不是依赖笔记本查看器,那将是很好的,到它的链接无疑会在某一天中断。


0
投票

幅度(100%)分为负(50%)和正(50%)频率。如果你输入这段代码,你就会明白我的意思(注意

sides='twosided'
):

s1_magspec = plt.magnitude_spectrum(s1, Fs=f_s, sides='twosided')

如果您添加一些直流偏移,请小心,例如30,它的振幅完全变为 0 Hz(注意

+ 30
):

s1 = 100*np.sin(2*np.pi*50000*t) + 30
s1_magspec = plt.magnitude_spectrum(s1, Fs=f_s, sides='twosided')

© www.soinside.com 2019 - 2024. All rights reserved.