【问题标题】:Why does matplotlib magnitude_spectrum function seem to show wrong magnitudes?为什么 matplotlib 幅度谱函数似乎显示错误的幅度?
【发布时间】:2020-07-21 13:45:01
【问题描述】:

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

最小的工作示例:

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()

【问题讨论】:

    标签: python-3.x numpy matplotlib signal-processing


    【解决方案1】:

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

    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)
    

    结果为@​​987654321@

    【讨论】:

    • 这正是我想要的,你甚至解释了我不明白的缩放,完美。非常感谢!
    猜你喜欢
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    • 1970-01-01
    • 2012-08-11
    • 2021-02-01
    • 1970-01-01
    • 2021-08-27
    相关资源
    最近更新 更多