基于DCT与PCA的matlab听歌识曲

简介

     本实验主要通过dct对音乐进行采样,获得矩阵后对矩阵进行pca处理,将处理后数据进行svm训练,之后获取模型用于实现听歌识曲。设计思路来源:利用傅里叶级数,其常用于信号处理,尤其是波函数的处理,可将时间函数转为不同频率波函数的叠加,提取出信息,从而大大减少需要比对的数据量,从而不需要逐一比对而识别歌曲。在之前具有对矩阵进行数据处理并识别的基础上,如果能通过这一变换将音乐转化成为矩阵,再复用矩阵处理,特征识别的相关算法,即可实现听歌识曲。在此思想基础上,基于MATLAB自主开发了一套算法完成听歌识曲的功能,并制作成了一个简单的图形界面能够方便使用与展示。

 采样方法及实现

      对于音乐进行采样得到矩阵,首先要明确矩阵的两个维度,才能确定使用什么样的采样算法及方式。首先考虑到使用的傅里叶变换可以获得函数在每个频率段上的分布信息,该分布信息可以作为一个维度。此外,音乐不同时间段内的状态差距较大,如果只作一次变换,显然不足以覆盖音乐每一片段含有的信息,所以以不同时间段作为另一维度。则得到的矩阵刻画了音乐的以下信息:在不同时间段上波函数在频率段的分布信息。下面将详细讲述如何在两个维度上进行采样,从而使得采样到的信息能够更好地反映音乐的特性。

    对于采样频段来讲,人耳的听力范围为20-20000hz,在每个频段上都进行采样是不现实的,合理选取频段既能减少运算量,又可以排除杂波。在哪些频段上采样最为合适呢?乐理知识给出了了答案。音乐由音符构成,音符则需要从音阶中获取,而音阶的分布必须符合“十二平均律”,即一个完整的八度音阶,最后一个音是第一个音频率的两倍,相邻的两个音,后一个音的频率比前一个音的频率所得的结果要么为2的十二分之一次方,要么为2的六分之一次方,这样构成的音阶才是和谐的,是通用的音乐标准。在频率段上采样,依照十二平均律及其采样可以获得音乐最基本的信息——音符组成信息。实现方法如下:以国际通用音准440hz为中心,选取20—20000hz之间该频率乘以2的十二分之n(n为整数)次方的频段及其周边频段,得到一个频律数列xk:k0,k1,k2......之后在该频段上对音乐做展开,即可得到波函数在该频率上的分布信息。

     接下来是采样时间的选择,过短的时间段选择会使得采样到的高频数据增多,过长的采样时间会降低采样效果,那么选取多长时间进行采样合理呢?同样参考乐理知识,一段音乐有若干小节组成,每一小节由若干音符组成,音符种类有八分音符,四分音符等,即时间占一拍的八分之一,四分之一。根据拍与小结的关系可以划分为四四节拍,四三节拍等。可以注意到,一拍即为音乐时长的基本单位,通常长度有1s和0.5s两种,那么依此选择时间1s为基本单位进行采样,可以得到每一秒音乐在不同频率段上的分布信息。

    有上述理论基础后,还需要知道如下的一些内容才能进行编写。首先,对于读入的音乐,MATLAB采用如下的数据结构进行储存,音频采样率f和n行2列的矩阵data,data的两列分别为在两个不同声道上的振幅大小。通常情况下,f为44100hz,这是出于采样定理,保证不把高频波段隐藏导致丢失信息,我们二次采样时不需要使用高于20000hz的频段,因为我们做的只是提取它现有的信息,而不是重新采样。此外,由于使用完整的傅里叶变换会产生两个频率的参数an bn(指数形式则是C-n和Cn)这是由于傅里叶级数是将函数由正余弦函数相加得到的,可以拟合波函数的相位信息,但是两个参数很明显比较麻烦。好在经过查询资料,人耳对于声波的相位信息不是很敏感,主要在于频率的影响,所以只使用正弦级数或者余弦级数进行展开即可。

读入音乐后,不是所有音乐都一样长,且MATLAB得到的矩阵每一个点的数据类型都为double,占用空间很大,所以就需要一定的处理使其减少数据量。首先是双通道变为单通道,数据减半,然后裁去开头15s,截取之后的90s,从而减少前奏,开始就进入副歌,前奏过长,等等反常规数据造成的影响。此后再以1秒为实践单位将散点进行余弦变换得到不同频段上的分布信息,即采用离散余弦变换DCT就可以得到不同频段的信息。得到一个m(频率段数)行n(采样秒数)列的矩阵。其中每秒共有f个采样点,构成数列xn:x0,x1,x2......,采取如下公式进行计算:

 

 

其中ε(k)在k=0时为0.5,其他为1,N总点个数,对应时间乘频率t*f,xk即为上述的频率数列,xn即为上述的的波函数点数列。根据以上算法,编写了相关的matlab代码,完成了音乐处理,DCT采样。

  矩阵处理及实现

     将每个音乐采样得到的矩阵横向摆放合并为一个大矩阵A,对这个矩阵进行处理,就可以获得训练用的数据了。采用主成分分析PCA算法,即将矩阵经过去均值,计算得到协方差矩阵,计算出协方差矩阵的特征向量,再将去过均值后的矩阵乘该特征向量阵,投影后得到矩阵B,该矩阵共有m(采样频段数)行n(时间段数乘歌曲数)列,制作标签后,最后用与之相匹配的分类算法进行训练即可。识别时,将单曲处理成采样后矩阵,抽出其中1s构成的一列去除均值,乘特征向量后得到m行1列矩阵,该矩阵可用于识别。由于之后已经给出了代码,且PCA的相关实现容易找到详细资料,具体的公式和计算方法就不再赘述。

 本文仅供学习使用,未经授权不得转载。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值