CHEETAH.W

静心积累

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

代码结构

已知函数或代码段详解

testdtw.m是测试脚本。

 1 disp('正在计算参考模板的参数...')
 2 for i=1:10
 3     fname = sprintf('..\\ch6\\%da.wav',i-1);
 4     x = wavread(fname);
 5     [x1 x2] = vad(x);
 6     m = mfcc(x);
 7     m = m(x1-2:x2-2,:);
 8     ref(i).mfcc = m;
 9 end
10 
11 disp('正在计算测试模板的参数...')
12 for i=1:10
13     fname = sprintf('..\\ch6\\%db.wav',i-1);
14     x = wavread(fname);
15     [x1 x2] = vad(x);
16     m = mfcc(x);
17     m = m(x1-2:x2-2,:);
18     test(i).mfcc = m;
19 end
20 
21 disp('正在进行模板匹配...')
22 dist = zeros(10,10);
23 for i=1:10
24 for j=1:10
25     dist(i,j) = dtw(test(i).mfcc, ref(j).mfcc);
26 end
27 end
28 
29 disp('正在计算匹配结果...')
30 for i=1:10
31     [d,j] = min(dist(i,:));
32     fprintf('测试模板 %d 的识别结果为:%d\n', i, j);
33 end
  1. 使用同样的方法计算参考模板和测试模板的MFCC系数。
    其中经过读入输入数据、计算MFCC、端点检测、截取需要帧的MFCC系数。
  2. 利用dtw计算相异程度。
  3. 比较相异程度,最低的为匹配值。
  • VAD

vad.m,端点检测。输入语音信号列向量,输出[x1 x2],x1开始点,x2结束点。

  • MFCC

mfcc.m,Mel频率倒谱系数的算法里面的一行代码是

bank=melbankm(24,256,8000,0,0.5,'m');

里面的24即计算24阶Mel频率倒谱系数。该函数输入整段语音列向量,即wavread读出的向量。输出为矩阵,每行代表一个帧计算得来的24维特征。在进行MFCC计算时一般需要检测端点。

  • DTW和DTW2

dtw/dtw.m和dtw/dtw2.m,这两个是动态时间规整算法,输入两个列数相同矩阵。矩阵每一行表示语音信号的每一个帧,一行中的每一个元素表示改帧通过特征提取而得来的一个值,比如24阶MFCC系数有24个特征值,那么一行就是24个元素。每一个帧的点数与这里的长度无关,因为这一步的输入是从特征提取函数而来比如MFCC。

输入两个比较矩阵,每行为一个帧的特征。输出为一个值,即匹配程度。

 

posted on 2012-05-22 11:36  Ethan.Wong  阅读(1761)  评论(3编辑  收藏  举报