signal-processing - 如何使用 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 轴使其看起来与第一张图像相似?
解决方案
我通过添加文档中提到的 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')
推荐阅读
- jenkins - 如何使用詹金斯并行执行 2 个纽曼任务。?
- sas - 如何使用前一行 SAS 的值创建字符串
- php - 将动态生成的 php 变量传递给 jquery 函数
- apache-spark - 无法将 DF 摄取到 elasticsearch
- android - Ajax 请求在实时 Google Play 应用程序中不起作用
- c++ - 如何检查网站是否包含 C++ 中的字符串?
- asp.net - ASP.NET - 模拟用户,但访问 SQL Server 时除外
- reactjs - 如何能够通过单击表reactjs的行来进入详细视图
- android - 表达式或语句中出现意外的标记“sha1”。用于为 facebook 开发者帐户应用程序生成 keyhash
- r - 可以使用什么方法在一页上打印多个 eclust 图?