首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么matplotlib magnitude_spectrum函数似乎显示错误的大小?

为什么matplotlib magnitude_spectrum函数似乎显示错误的大小?
EN

Stack Overflow用户
提问于 2020-04-09 09:45:05
回答 1查看 268关注 0票数 1

我创建了一个由两个正弦波组成的1秒长的音频样本,然后使用matplotlibs幅度谱函数绘制频谱,结果似乎是错误的。这两个波在一秒的音频样本中具有完全相同的幅度,但幅度却有很大的不同。这对我来说似乎很奇怪,所以我也使用了numpys函数来绘制DFT,并且大小完全相同,正如我认为它们应该是一样的。结果图如下图所示。有人知道为什么会这样吗?我在代码中做错了什么吗?任何帮助都会得到重视。

最小工作示例:

代码语言:javascript
复制
import matplotlib.pyplot as plt
import numpy as np

sr = 20000
freq1 = 200
freq2 = 100
duration = 1

x = np.linspace(0, duration, sr * duration)
y = np.concatenate([0.5*np.sin(freq1 * 2 * np.pi * x[:10000]) + 0.5*np.sin(freq2 * 2 * np.pi * x[:10000]), np.sin(freq1 * 2 * np.pi * x[10000:15000]), np.sin(freq2 * 2 * np.pi * x[15000:20000])])

fig, ax = plt.subplots(3, 1, figsize=(12, 10))

ax[0].plot(x, y)
ax[0].axis(xmin=0, xmax=1)
ax[0].set_xlabel('Time [s]')
ax[0].set_ylabel('Amplitude [-]')

ax[1].magnitude_spectrum(y, Fs=sr, color='C1')
ax[1].axis(xmin=0, xmax=500)
ax[1].set_xlabel('Frequency [Hz]')
ax[1].set_ylabel('Magnitude [-]')

ax[2].plot(np.fft.rfftfreq(sr, d=1/sr), np.abs(np.fft.rfft(y, norm='ortho'))/100)
ax[2].axis(xmin=0, xmax=500)
ax[2].set_xlabel('Frequency [Hz]')
ax[2].set_ylabel('Magnitude [-]')

plt.tight_layout()
plt.show()

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-04-09 10:10:56

我认为这与matplotlib中使用的窗口有关。默认情况下使用汉宁窗口,因此请将窗口类型更改为window_none。此外,在这两种情况下,缩放的方式也不同。通过执行以下更改,您将看到它们都匹配。

代码语言:javascript
复制
from matplotlib import mlab
ax[1].magnitude_spectrum(y, Fs=sr, color='C1', window=mlab.window_none)

ax[2].plot(np.fft.rfftfreq(sr, d=1/sr), np.abs(np.fft.rfft(y))/sr)

结果:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61112685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档