理解matplotlib magnitude_spectrum输出

vjhs03f7  于 2023-05-01  发布在  其他
关注(0)|答案(2)|浏览(152)

我在理解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箱数之后

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

结果是在50khz处的单个尖峰,但幅度为50,而不是预期的100。
有人能解释一下为什么会这样吗?
下面是一个ipython notebook的链接,描述了前面提到的代码和结果图:
http://nbviewer.ipython.org/gist/bkinman/22cc15d3ad3b9b2db09e

mwngjboj

mwngjboj1#

它看起来与所使用的FFT窗口的默认设置有关。文档说默认值是Hanning窗口。如果使用矩形窗:

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

你会得到100的峰值,就像一个简单的FFT一样。
顺便说一句,如果您编辑您的问题,将其放入创建s1_magspec的代码行中,而不是依赖于notebook查看器,那么这将是一件好事,到notebook查看器的链接无疑会在某一天中断。

bzzcjhmw

bzzcjhmw2#

振幅(100%)被分为负频率(50%)和正频率(50%)。你可以看到我的意思,如果你把这个代码(注意sides='twosided'):

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

只是要小心,如果你添加一些直流偏移,e。例如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')

相关问题