python-3.x - 为什么 matplotlib 幅度谱函数似乎显示错误的幅度?
问题描述
我创建了一个由两个正弦波组成的 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()
解决方案
推荐阅读
- c++ - Why fstream is not inherited from ifstream and ofstream in c++?
- inheritance - 如何继承 odoo v8 上的 _constraints?
- regex - 在开始和结束模式之间保留字符串
- azure-iot-sdk - 注册组下的自动配置设备不起作用(java SDK)
- qt - Qml - qml 中的 C++ 信号参数“未定义”
- javascript - 使用 React 检查元素是否在视图中
- c++ - Gtkmm - 关闭窗口然后显示另一个窗口的正确方法
- java - Eclipse 中缺少 JPA 工具菜单
- angular - Angular 2提到primeng p-editor输入添加不起作用
- amazon-web-services - AWS SNS - 如何自定义 s3 事件