在 Audacity 中绘制波谱
Posted
技术标签:
【中文标题】在 Audacity 中绘制波谱【英文标题】:Plot spectrum of a wave as in Audacity 【发布时间】:2016-02-25 19:22:34 【问题描述】:我想绘制类似于 Audacity 可以绘制的频率图:
我没有找到可以做到这一点的软件(在命令行中),所以我开始使用 python 来做到这一点,使用 specgram 函数。 由于我无法重做这样的图表(来自 Audacity 的紫色图表),我想知道是否有人确切地知道 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)))
我不明白如何才能在任何带有 Audacity 的音频 WAV 上看到这些 dB 与频率的“降低”
干杯
【问题讨论】:
【参考方案1】:据我所知,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
。 (一个常见的选择。)
【讨论】:
为什么是前 2048 个样本?不应该计算所有样本吗?【参考方案2】:谢谢,我很接近但你找到了。 最后代码很简单:
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 轴单位,我几乎是一个像素准确的大胆:
Final plot
【讨论】:
以上是关于在 Audacity 中绘制波谱的主要内容,如果未能解决你的问题,请参考以下文章