当前课程知识点:计算机音乐 > 第七章 音频同步 > 7.2 音乐特征提取 CQT > 音乐特征提取CQT
同学们大家好
在这一节里面
我们主要是来介绍
音乐里面的CQT特征
那么在计算机音乐当中
音频的频谱是非常重要的特征
我们前面讲过短时傅里叶变换
那么它可以展示
频谱在时间轴上的分布
但实际上我们常见的
音乐演奏当中
特别是西方古典音乐以及流行音乐
那么所用的频谱都是一些固定的组合
那么具体来说
例如在钢琴演奏当中
声音的频谱一定会满足
半音阶的关系
因为钢琴的每一个键的音高
本身就是根据12平均律来定音的
那么我们可以来听一下
在一个半音阶下面的钢琴的12个音
在半音阶的假设下面
每一个音的频谱的分布
都有一定的特点
那么我们如果对
钢琴的键盘进行编号
我们来观察一下
这里面的第48号
按键的频谱
那么我们可以看出
在竖直方向
它的频谱的分布是呈
整数倍分布的
那么这主要是因为
钢琴本身可以当做一件弦乐器
满足我们在前面章节里面讲过的
弦振动方程
而其它音的频谱的分布是类似的
只不过他们的主频不一样
那么并且在12平均律的假设下面
相邻的两个音的频率比都是相等的
按照半音阶的假设
音符以12个音作为一组
它可以被分为若干个八度
两个八度之间的频率比是1:2
而相邻的两个音的频率的比
则是2的1/12次方
这样我们就可以对音频进行编号
在MIDI编码当中
会使用128个按键
而钢琴所使用的则是从
21号到108号一共88个按键
在交响乐团当中所使用的标准音
A4
那么它是第69号
频率是440赫兹
当然也有些乐队会用441
或者442这样的频率
那么如果用这个A作为一个参考音的话
那么其它音的频率
就可以用这样的一个公式来计算
那么我们可以看出这些音高的分布
是呈指数分布的
在实际演奏当中
由于调音的关系
再加上大部分乐器其实
是有演奏微分音的技巧的
因此音符的频率不可能正好是标准的音高
那么一种可行做法就是
把傅里叶变换中的系数
进行进一步的离散化
以邻近原则
将音高化整为零
那么近似到半音阶上面的
每个音上面
这种做法本质上是
使用时间上的窗格以及
频域上的窗格
对整个音频进行进一步采样
等于说我们用这样窗格
放到整个音频的视频图里面
然后我们看一下
每个点落在哪一个格子里面
从而进行进一步的采样
那么这里面我们要注意到的是
因为半音阶是指数分布的
因此我们看到
现在的这些窗格在竖直方向
它并不是等距的
实际上由于八度之间满足两倍的频谱关系
因此
在钢琴键上面等距的八度音
在频谱上面实际上是呈等比数列分布的
那么这其实并不是什么好的事情
因为一方面它跟音乐上的语义不符合
另一方面在计算机程序当中
数字计算都是有精度问题的
如果他们不是等距分布的
那么不同音的精度就无法统一
一种切实可行的处理
就是对频谱取对数
这样原先等比分部的音高就会变成
等差分布的
从而在纵方向上进行分窗的时候
他们就可以像在时间上进行分窗一样
是等距分布的一些窗口
只不过对数频谱会对
前面的一个步骤
也就是傅里叶变换提出更高的一个要求
在线性频谱当中
短时傅里叶变换本质上是用一些
宽度一样的正弦波
去对原先的音频
进行卷积
但是在对数频谱下面
要保证取完对数之后还是等宽度的
就需要保持频率跟带宽的比
Q=f/B是一个常数
那么这样的傅里叶变换
也叫做constant Q transform CQT变换
那么在这里面我们忽略那些
复杂的数学计算
我们直接用python的第三方模块
来观察一下CQT的特征
并且我们可以跟短时傅里叶变换
做一个比较
那么接下来我们会使用
哥伦比亚大学的
librosa这个python的第三方模块
来提取CQT特征
那么按照这个官方文档的说明
librosa是可以通过pypl来安装的
所以我们首先在
命令行里面可以来安装
这个librosa
通过pypl命令可以来安装librosa
因为我之前已经装过了
所以它只会验证一下这个版本
并不会真正的去做更新
装好之后我们可以去参考
librosa的官方文档
可以打开他的官方文档
我们最重要的事情就是
通过库去观察他的CQT特征
这个模块是在Core下面的
Spectral representations
就是频谱表达
那么我们打开之后
我们会看到有短时傅里叶变换
有这个CQT
那么我们今天任务就是要
比较一下这个短时傅里叶变换跟CQT的
一个差别
那么我们可以参考
官方文档提供的事例的代码
我们把这个代码直接复制粘贴到
我们的程序里面
然后去
以刚才我们听到的钢琴的半音阶为例子
的一个频谱的表达
我们把官方提供的示例代码
全部的抄了过来
并且略加了修改
那么因为后面我们需要用到
numpy的一些函数
以及我们需要用Pyplot进行绘图
所以要把它们import进来
那么在librosa里面
它提供了一个load函数
可以更方便的去
获取音频的数据
那么获取这音频数据之后
我们就直接使用librosa下面的
Stft去获得短时傅里叶变换的频谱
以及用CQT去获得
CQT变换的频谱
并且我们对频谱都进行
强度的对数化
这样话会看的更加明显一点
然后我们通过subplot
把这两个图都画出来
那么现在我们运行一下看一下这个图
那么我们可以看到
这里的差别是非常的明显的
首先这Stft就短时傅里叶变换用的是
线性频谱
所以你看到它的音高的
分布并不是等距了
那么越往右边它的这音高的
分布越稀疏
而对于CQT变换来说
因为他是做过对数频谱的
所以半音阶它是完全是一个
等距离的一个阶梯的形状
此外因为它用的这个
傅里叶变换的这个
卷积的宽度不一样
所以你在Stft里面看到
高频的地方它的精度就会比较差
而对于SCQT变换来说
它在低频跟高频的精度是基本上一样
那么后面我们将会使用
以CQT作为基础的
频谱
作为音频同步的特征
尽管在实际演奏当中
CQT特征会对半音阶之间的微分音
进行四舍五入
那么光从音乐的特征的角度
这些微分音也许也是
非常重要的一些特征
特别是对于非西方音乐而言
但是如果只是从音频同步的角度来看
CQT特征无疑是一种
化零为整的思路
它可以将音频集中在与乐谱所
要求的音高上面
下一节我们将会对
这种特征进行进一步压缩
来介绍半音阶chroma特征
-欢迎辞
-1.1 计算机音乐导言
--计算机音乐导言
-1.2 计算机音乐课程主要内容
-1.3计算机音乐课程资源
-1.4 音乐的基本表达
--音乐的基本表达
-第一章作业
-2.1时域音频处理概述
--时域音频处理概述
-2.2 分窗处理1:OLA叠放
-2.3 分窗处理2:音量计算
-2.4 端点检测
--端点检测
-2.5 振幅包络
--振幅包络
-2.6 音频信号相乘
--音频信号相乘
-2.7 环形调制
--环形调制
-2.8 频率调制
--频率调制
-2.9 频率调制在音乐上的应用
-第二章作业
-3.1 频谱概述
--频谱概述
-3.2 傅里叶变换
--傅里叶变换
-3.3 短时傅里叶变换
--短时傅里叶变换
-3.4 加法合成
--加法合成
-3.5 线性滤波器
--线性滤波器
-3.6 京剧锣鼓经分析
--京剧锣鼓经分析
-第三章作业
-4.1 音色合成概述
--音色合成概述
-4.2 质点弹簧阻尼模型
--质点弹簧阻尼模型
-4.3 双线性滤波器
--双线性滤波器
-4.4 Modal合成
--Modal合成
-第四章测试
-5.1 一维振动模型概述
--一维振动模型概述
-5.2 弦振动模型
--弦振动模型
-5.3 达朗贝尔的行波解
--达朗贝尔的行波解
-5.4 梳状滤波器
--梳状滤波器
-5.5 Karplus Strong算法
-5.6 管状气鸣乐器模型
--管状气鸣乐器模型
-第五章作业
-6.1 音高跟踪概述
--音高跟踪
-6.2 时域音高跟踪
--时域音高跟踪
-6.3 频域音高跟踪
--频域音高跟踪
-6.4 K歌评分
--K歌评分
-第六章作业
-7.1 音频同步概述
--音频同步概述
-7.2 音乐特征提取 CQT
-7.3 音乐特征提取 Chroma
-7.4 动态时间规划概述
--动态时间规划概述
-7.5 动态时间规划实现
--动态时间规划实现
-第七章作业