首页 > 解决方案 > 如何使用 bins_per_octave 而非 12 在 librosa 中计算和可视化 CQT?

问题描述

在更改 bins_per_octave 参数时,如果 bins_per_octave 增加,y 轴上的比例会发生变化,并且绘图会向上移动。如何调整 y 轴以查看完整图?

y, sr = librosa.load("CScale.wav") #sr = 22050
y_16k = librosa.resample(y,sr,16000)
print(y.shape) #(1422336,)
print(y_8k.shape) #(516041,)
C = np.abs(librosa.cqt(y, sr=sr,bins_per_octave=12))
C_16k = np.abs(librosa.cqt(y_16k, sr=16000,bins_per_octave=24))
print(C.shape) #(84, 2779)
print(C_16k.shape) #(84, 2016)

plt.subplot(2, 1, 1)
librosa.display.specshow(librosa.amplitude_to_db(C, ref=np.max),sr=sr, x_axis='time', y_axis='cqt_note')

plt.subplot(2, 1, 2)
librosa.display.specshow(librosa.amplitude_to_db(C_16k, ref=np.max),sr=16000, bins_per_octave=24, x_axis='time', y_axis='cqt_note')

plt.colorbar(format='%+2.0f dB')
plt.title('Constant-Q power spectrum')
plt.tight_layout()

plt.show()

这是我的 CQT输出

如何调整第二张图像的 y 轴使其看起来与第一张图像相似?

标签: signal-processinglibrosa

解决方案


我通过添加文档中提到的 n_bins 和 fmin 参数来解决它,但我仍然不明白它是如何工作的。我想这样做以包括所有 88 个音符。

C_16k = np.abs(librosa.cqt(y_16k, sr=16000,fmin=librosa.note_to_hz('C2'), n_bins=60 * 2, bins_per_octave=12 * 2))
librosa.display.specshow(librosa.amplitude_to_db(C_16k, ref=np.max),fmin=librosa.note_to_hz('C2'),sr=16000, bins_per_octave=24, x_axis='time', y_axis='cqt_note')

推荐阅读