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

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

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

原理

声学基础

声音是物体振动时产生的波动现象,通过介质传达,最终由人或动物的听觉器官感知

声音的特征特性可以通过音量、音调、音色三个基本要素来实现

音量,即响度,是人耳对声音强度的主观感知,通常与声波的幅度有关

音调,是人类的耳朵对于声音强弱的一种主观感觉,通常与声波的频率有关

音色,又叫音品,是人类用来辨别区分具有相等的响度、相同的音调的两个不同的声音的一种特殊的性质,可以说是人类的耳朵,对于声音频率和响度的一种综合反应

音乐理论基础

音高

音高取决于发出声音的物体的振动频率,两者有正相关关系

我们平常讲的“标准音”,就是每秒振动440次的小字一组A音(频率为440hz)

十二平均律

音律,就是乐音体系中各音的绝对准确高度及其相互关系

包括五度相生律、纯律和十二平均律

这里我们只说一下现代音乐中最多使用的十二平均律

“十二平均律”通俗来说就是根据固定的比例将弦分割成十二个比值相等的部分

用钢琴举例,每两个相邻的琴键(对应相邻的乐音)之间的比为2^(1/12)
基于CQT和PCP的和弦识别算法_第1张图片

音程与和弦

在乐音系统中,在一定的音高对应的两个乐音之间的间距关系被称为音程

和弦指的是,一组具有固定音程关系的声音

是将三个乐音或者三个以上的乐音,按照三度或者非三度,在纵向上加以重叠结合

和弦种类有很多,我们这个算法只涉及常见的大三和弦和小三和弦

这几乎可以用于大部分流行歌曲的和弦搭配

时频转换

我们知道每一个乐音都有相应的频率

反过来,只要提取到了相应的频率就可以找到对应的乐音

那么,对于构成一个和弦的多个音,说白了不就是一组频率嘛

但是,音乐是时间的艺术,我们常常都是在时域上提取信息

为了提取到频率的信息,就需要将时域转换到频域

可以这样理解,每一个频率的声波都是一个正弦波

我们听到的声音其实就是多个正弦波的线性和

转换到频域后,不同频率的幅度就会清晰的显示出来
基于CQT和PCP的和弦识别算法_第2张图片

时频转换的算法有很多,在这里我们使用CQT算法,因其更符合乐音频率的提取

理论上,这样我们就可以轻松的提取出构成和弦的音

PCP特征向量

音级轮廓图(PCP)特征是由 Fujishima 在 1999 年提出的

是一种用于频谱对应音级的 12 维特征向量,每一维向量分别代表了一个半音音级

将提取出来频率对应各个乐音,符合的乐音为1,不符合的为0

例如C Major的PCP特征向量为

[1, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0]

对应C Major的构成就是

[C, C#, D, D#, E, F, F#, G, G#, A, A#, B]

过程

和弦识别算法主要包括以下几个部分:

  1. 读取音频文件,对音频在时域方面进行处理

  2. 时域频域转换

  3. 将提取到的谐波分量信息转化为色谱图

  4. 和弦与PCP匹配

源代码

本项目的源代码已完全公开

结语

欢迎热爱编程的小伙伴关注我的github博客

以及我的github仓库

里面有一些前端小技巧以及python算法设计跟大家一起分享

我们一起每天进步一点点!

你可能感兴趣的:(python算法设计,算法,人工智能,python)