使用matplotlib显示频谱图


前言

虽然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()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值