文章目录
- 前言
- 一、librosa内置的频谱显示
- 二、使用matplotlib的pcolormesh进行显示
- 三、完整代码
前言
虽然librosa里的display也可绘制频谱图,但是在制作图片过程中,发现绘制的图片有很大差异,这样我在模型训练过程中怕出现问题,因此这里翻了一下display源码然后用matplotlib进行绘制。
一、librosa内置的频谱显示
import matplotlib.pyplot as plt import librosa as lb from librosa import display # 读取音频 y, sr = sf.read("音频路径") # 短时傅里叶 frequency, times, mags = lb.reassigned_spectrogram(y=y, sr=sr) # 转换成db mags_db = lb.amplitude_to_db(mags, ref=1.0) # 显示 fig, ax = plt.subplots() display.specshow(mags_db, x_axis='time', y_axis='hz', ax=ax, sr=sr) plt.show()
- 使用同样的代码,差异很大。
二、使用matplotlib的pcolormesh进行显示
- 获取时间序列
times = lb.frames_to_times(np.arange(mags_db.shape[1]), sr=sr)
- 获取频率序列
n_fft = 2 * (mags_db.shape[0] - 1) # n_fft 为短时傅里叶变换的窗口宽度 frequencys = lb.fft_frequencies(sr=sr, n_fft=n_fft)
- 绘制频谱图
pc = ax.pcolormesh(times , frequencys , mags_db, cmap="Reds") fig.colorbar(pc, ax=ax)
三、完整代码
import matplotlib.pyplot as plt import librosa as lb from librosa import display # 读取音频 y, sr = sf.read("音频路径") # 短时傅里叶 frequency, times, mags = lb.reassigned_spectrogram(y=y, sr=sr) # 转换成db mags_db = lb.amplitude_to_db(mags, ref=1.0) # 获取时间序列 times = lb.frames_to_times(np.arange(mags_db.shape[1]), sr=sr) # 获取频率序列 n_fft = 2 * (mags_db.shape[0] - 1) # n_fft 为短时傅里叶变换的窗口宽度 frequencys = lb.fft_frequencies(sr=sr, n_fft=n_fft) # 显示 fig, ax = plt.subplots() pc = ax.pcolormesh(times , frequencys , mags_db, cmap="Reds") fig.colorbar(pc, ax=ax) plt.show()