在 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 中绘制波谱的主要内容,如果未能解决你的问题,请参考以下文章

使用 Audacity 录制声卡声音

ubuntu怎么用audacity

audacity怎么用

怎样用audacity录音

GTK3 主题对话框在 Audacity 中呈现纯黑色背景

audacity开源VS2013环境搭建