python算法设计|基于CQT和PCP的和弦识别算法


基于CQT和PCP的和弦识别算法

  • 原理
    • 声学基础
    • 音乐理论基础
      • 音高
      • 十二平均律
      • 音程与和弦
    • 时频转换
    • PCP特征向量
  • 过程
  • 源代码
  • 结语

原理 声学基础 声音是物体振动时产生的波动现象,通过介质传达,最终由人或动物的听觉器官感知
声音的特征特性可以通过音量、音调、音色三个基本要素来实现
音量,即响度,是人耳对声音强度的主观感知,通常与声波的幅度有关
音调,是人类的耳朵对于声音强弱的一种主观感觉,通常与声波的频率有关
音色,又叫音品,是人类用来辨别区分具有相等的响度、相同的音调的两个不同的声音的一种特殊的性质,可以说是人类的耳朵,对于声音频率和响度的一种综合反应
音乐理论基础 音高
音高取决于发出声音的物体的振动频率,两者有正相关关系
我们平常讲的“标准音”,就是每秒振动440次的小字一组A音(频率为440hz)
十二平均律
音律,就是乐音体系中各音的绝对准确高度及其相互关系
包括五度相生律、纯律和十二平均律
这里我们只说一下现代音乐中最多使用的十二平均律
“十二平均律”通俗来说就是根据固定的比例将弦分割成十二个比值相等的部分
用钢琴举例,每两个相邻的琴键(对应相邻的乐音)之间的比为2^(1/12)
python算法设计|基于CQT和PCP的和弦识别算法
文章图片

音程与和弦
在乐音系统中,在一定的音高对应的两个乐音之间的间距关系被称为音程
和弦指的是,一组具有固定音程关系的声音
是将三个乐音或者三个以上的乐音,按照三度或者非三度,在纵向上加以重叠结合
和弦种类有很多,我们这个算法只涉及常见的大三和弦和小三和弦
这几乎可以用于大部分流行歌曲的和弦搭配
时频转换 我们知道每一个乐音都有相应的频率
反过来,只要提取到了相应的频率就可以找到对应的乐音
那么,对于构成一个和弦的多个音,说白了不就是一组频率嘛
但是,音乐是时间的艺术,我们常常都是在时域上提取信息
为了提取到频率的信息,就需要将时域转换到频域
可以这样理解,每一个频率的声波都是一个正弦波
我们听到的声音其实就是多个正弦波的线性和
转换到频域后,不同频率的幅度就会清晰的显示出来
python算法设计|基于CQT和PCP的和弦识别算法
文章图片

时频转换的算法有很多,在这里我们使用CQT算法,因其更符合乐音频率的提取
理论上,这样我们就可以轻松的提取出构成和弦的音
PCP特征向量 音级轮廓图(PCP)特征是由 Fujishima 在 1999 年提出的
是一种用于频谱对应音级的 12 维特征向量,每一维向量分别代表了一个半音音级
将提取出来频率对应各个乐音,符合的乐音为1,不符合的为0
例如C Major的PCP特征向量为
[1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0]
【python算法设计|基于CQT和PCP的和弦识别算法】对应C Major的构成就是
[C, C#, D, D#, E, F, F#, G, G#, A, A#, B]
过程 和弦识别算法主要包括以下几个部分:
  1. 读取音频文件,对音频在时域方面进行处理
  2. 时域频域转换
  3. 将提取到的谐波分量信息转化为色谱图
  4. 和弦与PCP匹配
源代码 本项目的源代码已完全公开
结语 欢迎热爱编程的小伙伴关注我的github博客
以及我的github仓库
里面有一些前端小技巧以及python算法设计跟大家一起分享
我们一起每天进步一点点!

    推荐阅读