1 音符提取方法和基本原理
本实验使用时频分析的方法完成音乐信号的音符提取。时频分析选择短时傅里叶变换(STFT)完成。其具体方法是将信号用一定长度的窗进行分割成若干帧,对每一帧分别作傅里叶变换,得到它们的频率信息,而每一帧对应的位置表示了该帧所在的时间信息,由此可以实现时频分析的功能。
STFT的局限性在于,频率分辨率和时间分辨率的耦合关系。即,频率分辨率的上升会带来时间分辨率的下降,反之亦然,两者不能同时达到最高,分辨率取决于窗口长度。针对这一问题,本次实验需要设定合适的窗口长度,使之能够尽量同时满足频率和时间分辨率的要求。
对需要处理的音乐信号特征进行分析可以得到,该信号为时长为10s,采样频率为8kHz的双声道信号,两个声道的信号差别不大。针对音乐的节奏和采样频率,可以使用窗口长度为1000的矩形窗,即将信号分为80帧,每帧信号为125ms。然后将每帧信号做fft,再求模平方得到功率谱。求功率谱中能量最大值所对应的频率点,该频率即为这一时间段对应的住频率,由于每帧信号时间足够短,可以认为该频率对应的音符为这一时间段的主要音符,将其提取出即可。
在得到了各个时刻主频之后,要利用音符音高对应的基频获得主频对应的音符。由于实验者对吉他一窍不通,对钢琴有一定的涉猎,本实验以钢琴琴键为准提取音符。钢琴的中央C基频约为261.63Hz,唱“do”。根据国际标准,相邻的半个音(即钢琴相邻键)的基频相差2^(1/12)倍。由此标准可以通过将获得的主频和261.63求比例,再求以2^(1/12)为底的对数,获得其对应音符与中央C相差的键数,正值为更高,负值为更低。
钢琴一个八度的12个琴键本别可以表示为如下形式:
Do Do# Re Re# Mi Fa Fa# Sol Sol# La La# Si
其中“#”表示比该音符高半个音的黑键。
为了表示不同八度的音符,用在该音符后面紧跟的数字表示。正数表示高若干八度,负数表示低若干八度。音符持续的时间用“*”后面的数字表示,数字代表持续的帧数,在时间上,即为该数字乘以125ms。
用该方法表示的钢琴音符谱较为完备。
2实验结果
本次实验获得的每帧主频以及从信号中提取的音乐音符如下:
STEP 8:
the main frequency of each frame are:
[96.0, 1680.0, 376.0, 376.0, 1776.0, 1776.0, 888.0, 1776.0, 888.0,1680.0, 1680.0, 1680.0, 1864.0, 888.0, 888.0, 1656.0, 888.0, 368.0, 376.0,368.0, 368.0, 376.0, 296.0, 296.0, 888.0, 296.0, 296.0, 296.0, 1752.0, 888.0