在Python中获取Log Mel频谱图

时间:2020-07-21 23:48:43

标签: python numpy librosa

诸如How to convert a mel spectrogram to log-scaled mel spectrogram之类的其他问题询问了如何在python中获取对数缩放的梅尔谱图。我下面的代码会产生上述频谱图

ps = librosa.feature.melspectrogram(y=y, sr=sr)
ps_db= librosa.power_to_db(ps, ref=np.max)
librosa.display.specshow(ps_db, x_axis='s', y_axis='log')

如果我对此作图,我会得到想要的频谱图。

Librosa Display Plot

但是,如果我不使用librosa的display.specshow而只是执行

import matplotlib.pyplot as plt
plt.imshow(ps_db)

我明白了

matplotlib plot

我的问题是,display.specshow进行了什么转换以生成第一个图,如何仅使用ps_db和numpy重新创建该图,以使我的plt.imshow()调用与display.specshow对齐?

1 个答案:

答案 0 :(得分:1)

如评论中所建议,您需要将原点降低,将颜色图更改为岩浆(我想;也可以是"plasma""inferno",选择here)< / p>

import matplotlib.pyplot as plt

fig, ax = plt.figure()
plt.imshow(ps_db, origin="lower", cmap=plt.get_cmap("magma"))

就对数标度而言,据我所知,您获得的数据已经是对数标度,只是刻度线是错误的。如果不是这种情况,则需要使用从here改编而成的meshgrid重新采样数据:

h, w = ps_db.shape
x = np.linspace(0, 2, w)
y = np.logspace(1, 8, h)
X, Y = np.meshgrid(x,y)