我想绘制与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)))我不明白怎样才能得到dB对频率的“降低”,我可以用Audacity在任何音频上看到它
干杯
发布于 2016-02-26 20:48:04
据我所知,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里找到了这个页面。因此,以np.average(pxx, axis=1)为例,plt.specgram模仿Audacity应该没问题。手册中没有说明使用的跳数大小...也许可以尝试将noverlap-parameter设置为s/2。(这是一个常见的选择。)
发布于 2016-02-29 02:47:26
谢谢,我已经很接近了,但是你找到了。最后,代码非常简单:
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轴单位之外,我几乎可以精确到一个像素,而不是audacity:
Final plot
https://stackoverflow.com/questions/35636426
复制相似问题