Skip to content

JasonCaoCJX/Chord-Recognition

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Chord-Recognition

Chord Recognition based on CQT and PCP

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

原理

声学基础

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

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

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

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

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

音乐理论基础

音高

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

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

十二平均律

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

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

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

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

用钢琴举例,每两个相邻的琴键(对应相邻的乐音)之间的比为2^(1/12)

钢琴琴键

音程与和弦

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

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

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

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

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

时频转换

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

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

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

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

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

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

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

转换到频域后,不同频率的幅度就会清晰的显示出来

时频转换

时频转换的算法有很多,在这里我们使用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匹配

源代码

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

欢迎关注我的博客

About

Chord Recognition based on CQT and PCP

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages