我想绘制类似于Audacity可以绘制的频率图:
我没有找到一个软件(在命令行中),所以我开始使用python来执行它,使用specgram函数。 由于我无法重做这样的图形(大胆的紫色图形),我想知道是否有人确切知道Audacity正在绘制什么,这意味着什么,并且在某处有伪代码吗?我在音频处理方面的基础知识不足,但如果有人指导我,我想我可以编写任何建议/伪代码/程序。 现在,我在这里,策划这样的事情,这大致是我到目前为止所看到的。
> pxx, freqs, bins, _ = plt.specgram(y, NFFT=s, Fs=rate, noverlap=0,
cmap=plt.cm.binary, sides='onesided',
window=signal.blackmanharris(s),
scale_by_freq=True,
mode='magnitude')
plot(freqs, numpy.log10(pxx.max(axis=1)))
我不明白如何才能获得dB与频率的“降低”,我可以在任何具有Audacity的音频WAV上看到
干杯
答案 0 :(得分:0)
据我所知,Audacity绘制了幅度谱,即前2048个样本的fourier transform的绝对值。您可以绘制与short time fourier transform的每个频率仓相关的所有时间块中的最大幅度。
也许这符合您的需求:
import numpy as np
from scipy import signal
from matplotlib import pyplot as plt
y = y[0:2048] * signal.blackmanharris(2048)
X_amp = np.abs(np.fft.rfft(y))
X_db = 20 * np.log10(X_amp)
freqs = np.fft.rfftfreq(2048, 1/rate)
plt.plot(freqs, X_db)
修改强>
哦,我在Audacity manual找到了这个页面。因此plt.specgram
可以模仿Audacity,只需np.average(pxx, axis=1)
。手册没有说明使用了什么跳数...也许尝试将noverlap
- 参数设置为s/2
。 (一种常见的选择。)
答案 1 :(得分:0)
谢谢,我很亲密,但你找到了。 最后代码非常简单:
pxx, freqs, bins, _ = plt.specgram(y, NFFT=s, Fs=rate, noverlap=0,
cmap=plt.cm.binary, sides='onesided',
window=signal.blackmanharris(s),
scale_by_freq=True,
mode='magnitude')
plot(freqs, 20 * log10(mean(pxx, axis=1)), 'g')
而且,除了y轴单位,我几乎只有一个像素可以准确地反对大胆: