这个音频指纹暂时用来做同源音频聚类,判断歌曲是否是同一源的,
这里先介绍下飞利浦的方案-------A Highly Robust Audio Fingerprinting System,这个算法是在他上面的优化,
帧: 一段固定时间的音频信息,Ts;
相邻两个帧: 两个帧重叠时间域为 31/32,
步长: 一个帧与下一个帧起始时间之差,Tstep = 1/32 * Ts;
通过能量差分的关系,求得相邻音频两个帧(两帧之间的重叠区域为31/32)之间的能量关系,产生指纹,这个音频的特征值就是两帧之间的能量关系。
傅里叶变换成频率信息,把300 ---- 2000HZ 频率映射到33个频率带,计算各频率带的能量通过能量差分信息变换成二进制数。具体细节可以看论文
A Highly Robust Audio Fingerprinting System,这个方案,是把相邻帧之间的能量关系用来做为音频的特征。
大概步骤如下:
1. 提取一帧的音频信息
2. 加窗---汉宁窗
3. FFT,把振幅信息转成能量信息,
4. FFT结果取绝对值
5. 把频率在 300---2000,映射到33频率bands,计算各个band 能量
6.与上一帧能量值比较产生子指纹
详细说明
音频实现实际上也是频率信息,每一个采样点记录的是波形在该点的振幅,对于一个音频文件来说,他的特征是在频率信息上。我们分辨音乐是通过人耳来分辨的,耳朵听到声音实际上也是频率信息,在指纹算法中也需要模拟人耳朵。
产生指纹前面几步都没有什么要说的,都是些标准过程。从第5步才是说,如何把fft后结果映射到33个频率带中?需要模拟人的耳朵,人的耳朵对于频率范围在300---2000的声音比较敏感,人耳对于声音的鉴别主要集中在300 ---2000HZ这个频率段声音的强弱等信息来辨别,强弱信息就是能力信息,通过计算能量,来鉴别音频信息。
如何把300 --- 2000Hz 映射到33个频率带了,根据 bark scale,耳朵听到的频率与实际的频率并不完全一致,既然是模拟耳朵,需要按照人耳听到的频率来映射。我们根据300---2000HZ 频率bark值,平均分成33的频率段,计算每个频率段能量和。
我们得到33能量信息,E[ 1....33 ], E_ [ i ] = [ i + 1] - E[ i ]; F[ n, M]表示第n帧,E_[ M ] 的值。
如果 F[ n, M] --- F[ n-1, M] > 0 第子指纹第M位 为1 ,否则 为0,这样两个帧的比较可以产生一个32子指纹,一个指纹由256指纹构成。
我们所要做的是音频聚类,稍微做了一下修改,
论文中3s音频信息可以产生一个指纹,一个指纹由256个子指纹构成,如果一个音频所有的时段都产生指纹无意会非常大。
对于音频信息,可能开始与结尾几s都是空信息,我们音频选取中间的时间段生成指纹,在实验中采用的指纹时间段为 85s----100s, 120 ---135s,这两个时间段
产生指纹,建库时候是这样建的。进行歌曲匹配的时候,90--93产生一个指纹,126s---129s参数一个指纹,分别与85s----100s, 120 ---135s指纹库匹配。
实验结果
实验的结果并不理想,识别率在98%左右,主要是两个工作没有做,第一个就是滤波,第二个就是频段的划分,在实验中我是 按照 bark scale 值平均分成33的频率带的,对于滤波,我只采取了 300--2000Hz。
结果图:后边数字表示错误率,越小越好,阀门值是0.35,
Beyond - 海阔天空-64.mp3 compare with Beyond - 海阔天空.mp3 bit error: 0.0565186 0.0698242
Beyond - 海阔天空-64.mp3 compare with O Fortuna.mp3 bit error: 0.459351 0.443726
Beyond - 海阔天空-64.mp3 compare with 凤凰传奇-荷塘月色.mp3 bit error: 0.461304 0.45166
Beyond - 海阔天空-64.mp3 compare with 刘德华 - 冰雨.mp3 bit error: 0.455078 0.455811
Beyond - 海阔天空-64.mp3 compare with 叶倩文 - 秋来秋去-64.mp3 bit error: 0.458496 0.444458
Beyond - 海阔天空-64.mp3 compare with 叶倩文 - 秋来秋去.mp3 bit error: 0.455078 0.447876
Beyond - 海阔天空-64.mp3 compare with 唐古 - 做你心上的人.mp3 bit error: 0.443604 0.443237
Beyond - 海阔天空-64.mp3 compare with 女子十二乐坊 - 梁祝.mp3 bit error: 0.45752 0.4552
Beyond - 海阔天空-64.mp3 compare with 孙燕姿 - 比较幸福.mp3 bit error: 0.452759 0.459961
Beyond - 海阔天空-64.mp3 compare with 张学友 - 只想一生跟你走.mp3 bit error: 0.452637 0.434814
Beyond - 海阔天空-64.mp3 compare with 王宁-伤不起.mp3 bit error: 0.462769 0.454346
Beyond - 海阔天空-64.mp3 compare with 甄妮、罗文 - 铁血丹心.mp3 bit error: 0.450928 0.455322
Beyond - 海阔天空-64.mp3 compare with 贵妃醉酒.mp3 bit error: 0.459473 0.453735
Beyond - 海阔天空-64.mp3 compare with 邓紫棋 - 你把我灌醉.mp3 bit error: 0.442505 0.459351
Beyond - 海阔天空-64.mp3 compare with 阿悄 - 哭笑不得.mp3 bit error: 0.458374 0.463623
Beyond - 海阔天空-64.mp3 belong to :, Beyond - 海阔天空.mp3
这里记录下用到的库的一些API吧,可能以后有用
mpg123,mp3音频解码的库,
mpg123_param (mh, MPG123_FORCE_RATE, outputRate, 0.0); //设置音频解码后输出pcm采样率
mpg123_param(mh, MPG123_ADD_FLAGS, MPG123_MONO_LEFT, 0.0); //设置解码后pcm声道;
fftw 小波变换库,
本文转载自-http://blog.csdn.net/kappen123/article/details/20121169