如何用Python为从音频提取的各MFCC系数生成直方图
为每个MFCC系数生成直方图的实现方法
Librosa提取的mfcc_coeff形状为(n_mfcc, 帧数),每一行对应一个MFCC系数在所有帧上的取值。要实现类似Matlab的直方图效果,我们可以用matplotlib对每一行数据单独绘制直方图,具体步骤如下:
实现代码
import librosa import librosa.display import numpy as np import wavio import matplotlib.pyplot as plt # 参数设置与音频生成 rate = 44100 # 采样率 T = 1 # 音频时长(秒) f = 440.0 # 音频频率(Hz) t = np.linspace(0, T, int(T*rate), endpoint=False) x = np.sin(2*np.pi * f * t) wavio.write("sine.wav", x, rate, sampwidth=3) # 加载音频并提取MFCC特征 y, sr = librosa.load('sine.wav') mfcc_coeff = librosa.feature.mfcc(y=y, sr=sr, n_mfcc=40) # 绘制每个MFCC系数的直方图 n_mfcc = mfcc_coeff.shape[0] rows = 8 # 子图行数 cols = 5 # 子图列数 plt.figure(figsize=(15, 20)) # 设置画布尺寸 for i in range(n_mfcc): plt.subplot(rows, cols, i+1) # 提取当前系数的所有帧数据并转为一维数组 coeff_data = mfcc_coeff[i, :].flatten() # 绘制直方图,设置分箱数、颜色与边框 plt.hist(coeff_data, bins=30, color='skyblue', edgecolor='black') plt.title(f'MFCC 系数 {i+1}') plt.xlabel('系数值') plt.ylabel('帧数') # 自动调整子图间距,避免标签重叠 plt.tight_layout() plt.show()
关键细节说明
mfcc_coeff[i, :].flatten():将第i个MFCC系数的多帧数据转为一维数组,满足直方图的输入要求plt.subplot(rows, cols, i+1):按网格布局定位到对应子图(子图索引从1开始)plt.tight_layout():自动调整子图的间距和尺寸,防止标题、坐标轴标签相互遮挡
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

