⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我
语音识别之线性频谱图
- 线性频谱图
- 一、任务需求
- 二、任务目标
- 1、掌握频谱图绘制方法
- 2、掌握频谱图装饰方法
- 3、学习修改频谱图轴刻度
- 4、学习更改频谱图分析参数
- 三、任务环境
- 1、jupyter开发环境
- 2、python3.6
- 3、tensorflow2.4
- 四、任务实施过程
- 1、频谱图
- 2、装饰频谱图
- 3、更改轴刻度
- 4、更改分析参数
- 五、任务小结
- 说明
线性频谱图
一、任务需求
本实验深入演示specshow 可以做的所有事情,包括生成多种时、频域(spectro-temporal)数据的可视化。
librosa 的所有绘图函数都依赖于 matplotlib。因此在这里导入 matplotlib 的 pyplot API是有帮助的。
要求:利用librosa生成频谱图
二、任务目标
1、掌握频谱图绘制方法
2、掌握频谱图装饰方法
3、学习修改频谱图轴刻度
4、学习更改频谱图分析参数
三、任务环境
1、jupyter开发环境
2、python3.6
3、tensorflow2.4
四、任务实施过程
加载工具
import numpy as np
import matplotlib.pyplot as pltimport librosa
import librosa.display
首先,我们加载一个演示曲目
y, sr = librosa.load('/home/jovyan/datas/sorohanro_-_solo-trumpet-06.ogg')
1、频谱图
首先我们要显示一个普通的(线性)频谱图。我们将通过首先计算短时傅立叶变换,然后将幅度映射到分贝尺度来做到这一点。
# 短时傅里叶变换
D = librosa.stft(y)
S_db = librosa.amplitude_to_db(np.abs(D), ref=np.max)
matplotlib有两种主要的绘图方式,pyplot接口和面向对象接口,这两种方式librosa都支持。
接下来我们演示pyplot接口:
plt.figure()
# 绘制频谱图
librosa.display.specshow(S_db)
# 添加颜色条
plt.colorbar()
上图展示了一段声音对应的db频谱图,注意他的数值是负数,这和我们通常理解的分贝不同,音频分析中的db“参照点”不同寻常理解的分贝。
音频分析通常采用满刻度电平,0dBFS(0dB Full Scale),即把16bit采样的±32767允许的最大值作为0dB,这就是参考点。
也就是把有可能出现“数字过载”的临界点作为参照点,在这样的标准下,大多数的实际电平自然都是负值。
然后是面向对象接口
fig, ax = plt.subplots()
img = librosa.display.specshow(S_db, ax=ax)
fig.colorbar(img, ax=ax)
如你所见,两个图形其实是相同的,但它们使用不同的编程接口来构建。
大多数人都会认为 pyplot 界面学起来更快,但面向对象的界面对于复杂的图形可能更灵活一些。
对于本实验的其余部分,我们将使用面向对象的接口。
2、装饰频谱图
上一步表达了频谱图的基本内容,但缺少轴标签。没有这些信息,读者就不可能知道如何解释可视化结论。specshow 提供了许多工具来自动装饰绘图的轴。对于上图,x 轴对应于时间,y 轴对应于由离散傅立叶变换产生的线性间隔频率。我们可以告诉 specshow 相应地轴标签:
fig, ax = plt.subplots()
img = librosa.display.specshow(S_db, x_axis='time', y_axis='linear', ax=ax)
ax.set(title='Now with labeled axes!')
fig.colorbar(img, ax=ax, format="%+2.f dB")
看起来好多了,我们还在颜色条中添加了格式字符串,以便读者了解如何读取色标。
3、更改轴刻度
线性频率标度有时很有用,但通常很难阅读。或者,通常使用对数频率轴。这样做的好处是每个八度音程都占据恒定的垂直范围。
我们可以告诉 specshow 使用对数缩放频率轴,就像上面一样:
fig, ax = plt.subplots()
# 修改为指数坐标
img = librosa.display.specshow(S_db, x_axis='time', y_axis='log', ax=ax)
# 添加标题
ax.set(title='Using a logarithmic frequency axis')
fig.colorbar(img, ax=ax, format="%+2.f dB")
现在纵坐标轴被转换为对数标签,这样做的好处在于音程变成了线性的,例如国际标准音A440,它的下一个八度起始位置是880,再下一个八度是1760。这样指数增加的音程,在现在的坐标轴上,总是等距的。
4、更改分析参数
librosa 使用的默认参数设置(例如,sr=22050、hop_length=512等)可能不适用于每个信号。如果您更改参数的默认值,例如在计算 STFT 时,您可以将相同的参数传递给specshow。这可确保正确计算轴刻度(例如时间或频率)。
例如,在下面的示例中,我们将hop_length设置为256,n_fft设置为4096.
fig, ax = plt.subplots()
D_highres = librosa.stft(y, hop_length=256, n_fft=4096)
S_db_hr = librosa.amplitude_to_db(np.abs(D_highres), ref=np.max)
# 绘制频谱图,横坐标时间,纵坐标指数坐标
img = librosa.display.specshow(S_db_hr, hop_length=256, x_axis='time', y_axis='log',ax=ax)
ax.set(title='Higher time and frequency resolution')
fig.colorbar(img, ax=ax, format="%+2.f dB")
hop_length决定了相邻两帧之间不重叠的音频样本数量。
五、任务小结
本实验完成了specshow 生成频谱图。通过本实验我们学习到了包括生成多种时、频域(spectro-temporal)数据的可视化的相关知识,需要掌握以下知识点:
- 掌握频谱图绘制方法
- 掌握频谱图装饰方法
- 学习修改频谱图轴刻度
- 学习更改频谱图分析参数
–end–
说明
本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我