使用matplotlib显示频谱图

文章目录

  • 前言
  • 一、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()