matlab实现拨号音识别

整体思路大致就是直接spectrogram快速傅里叶变换得到语谱图然后获得三组返回值,分别对应音频信号的能量、频率、时间三个物理量。能量一开始是个复数所以要循环遍历然后abs()取模,储存成另一个矩阵,接着找这个矩阵里面能量值较高的点,注意这个点的行对应的是频率矩阵(就是刚开始得到的三个返回值的第二个)的下标,列对应的是时间的下标,所以只需要按照列的次序遍历、将得到的纵向下标返回储存起来,这里注意由于可能会有多个高能量点聚集在一起,所以要查找到一个后将行数下移几个单位,我的写法比较原始,就是读到一个高能量点下移一定单位,然后如果这个高能量点的纵向下标已经够大了,就直接把列右移几个单位(参考拨号音合成的频率,697,770,852,941;1209,1336,1477;差别还是不小的)这样对照频率的矩阵就能依照时间顺序得到拨号音的频率表,依次对照标准表(这里留20Hz左右的误差)就可以识别了,根据音频文件的不同要调整不同的识别参数,但这个参数对照工作区还算是挺好调的(个人感觉),然后需要注意的点是最后的音频文件读取出的能量矩阵(如果要用我的查找高能量点方法的话),当一列里面有高能量点时,一定要确保每列里面有高、低频率的内容,不然的话这个算法会直接把其中一个忽视掉进行下一个拨号音的采集。

然后还做了一个针对免提音的滤波,由于免提音的频率和拨号音相近,所以单纯的一个带通滤波肯定是无法满足需要的,so需要做一个大带通滤波和几个带阻滤波器,这个也(利用工具箱自动生成)做出来一并放文件里了,下面有介绍。

理解下来还是比较轻松的,适合我这种普通小白,希望能够帮到同样需要解决这个问题的人

然后文件里面会有endgame和endgame2两个版本,第一个版本是单声道,第二个版本是双声道+滤波,两个文件的参数都是我根据我现有的两个音频文件调整的(这两个音频文件也放在百度云里了,单声道a.wav,双声道b.wav,b.wav带免提声),希望在总结自身学习的同时能够给别人一丢丢的启发。

百度云里还有个ppt是我们交差用的,很多没放的图都在里面了。

上链接

链接:https://pan.baidu.com/s/1HxQOoap4KIxNIPtkmJrI-w?pwd=1234 
提取码:1234

你可能感兴趣的:(matlab)