用Python获取对数Mel谱图

用Python获取对数Mel谱图,python,numpy,librosa,Python,Numpy,Librosa,其他一些问题,如如何在python中获得对数比例的mel谱图。我下面的代码生成了上述光谱图 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.specshow并

其他一些问题,如如何在python中获得对数比例的mel谱图。我下面的代码生成了上述光谱图

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.specshow并只执行

import matplotlib.pyplot as plt
plt.imshow(ps_db)
我明白了


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

正如注释中所建议的,您需要将原点更改为lower,将colormap更改为magma(我猜;也可能是
“plasma”)
“地狱”
,已选择)

关于对数刻度,据我所见,你得到的数据已经是对数刻度了,只是刻度错了。如果不是这样,则需要使用改编自以下内容的
meshgrid
对数据重新采样:


您需要将imshow origin设置为“lower”:。您还需要将y轴设置为对数比例:
import matplotlib.pyplot as plt

fig, ax = plt.figure()
plt.imshow(ps_db, origin="lower", cmap=plt.get_cmap("magma"))
h, w = ps_db.shape
x = np.linspace(0, 2, w)
y = np.logspace(1, 8, h)
X, Y = np.meshgrid(x,y)