基于MFCC参数的元音识别

基于MFCC参数的元音识别

一、需求分析

利用MFCC参数,对元音进行比对。读取每个元音的WAV文件,然后进行分帧,这里分帧的时候将重叠部分设置为0,即帧长wlen=256,帧移inc=256。每帧有256个数。

比对内容:1、同一个WAV文件的不同两帧进行对比;2、不同WAV文件的两帧进行对比。

比对方法:1、将两帧中每帧的12个mfcc参数相减,相减后求绝对值,画出波形,观察;2、将绝对值后的12个参数求和观察大小。

二、具体流程

这里写图片描述

三、元音比对

1、元音a的第一帧和第三帧的比对

元音a的第三帧的12个mfcc参数和a的第一帧的12个mfcc参数分别为:

这里写图片描述 这里写图片描述

二帧相减后求绝对值并画出波形为:

这里写图片描述

二帧相减后求绝对值再求和的结果为:19.8824

2、元音u的第一帧和第三帧的比对

元音u的第一帧的12个mfcc参数和u的第三帧的12个mfcc参数分别为:

这里写图片描述 这里写图片描述

扫描二维码关注公众号,回复: 2433774 查看本文章

二帧相减后求绝对值并画出波形为:

这里写图片描述

二帧相减后求绝对值再求和的结果为:19.3398

3、元音a的第一帧和元音u的第一帧的比对

元音a的第一帧的12个mfcc参数和u的第一帧的12个mfcc参数分别为:

这里写图片描述这里写图片描述

二帧相减后求绝对值并画出波形为:

这里写图片描述

二帧相减后求绝对值再求和的结果为:78.0083

四、具体实现代码

clc;
clear;
[xa,fs]=wavread('..\wav\a1.wav');      % 读入信号\a1\ 
[xu,fs]=wavread('..\wav\u1.wav');      % 读入信号\u1\ 
xxa=enframe(xa,256,256);%对x 256点分为一帧 
xa1=xxa(1,:);xa2=xxa(3,:);
sa1=abs(fft(xa1));sa2=abs(fft(xa2));
sa1=(sa1.^2)';sa2=(sa2.^2)';
xxu=enframe(xu,256,256);%对x 256点分为一帧 
xu1=xxu(1,:);xu2=xxu(3,:);
su1=abs(fft(xu1));su2=abs(fft(xu2));
su1=(su1.^2)';su2=(su2.^2)';
%mel滤波器组
fs=8000;
fl=0; fh=fs/2;
bl=1125*log(1+fl/700);%将频率转换为Mel频率
bh=1125*log(1+fh/700);
% [bl,c] = frq2mel(fl);
% [bh,ch] = frq2mel(fh);
p=24;%滤波器个数
nfft=256;%FFT点数
B=bh-bl;
y=linspace(0,B,p+2);%产生0到B之间p+2个数
Fb=700*(exp(y/1125)-1);%将Mel频率转换为频率
% Fb=mel2frq(y);
W2=nfft/2+1;%fs/2内对应的FFT点数
df=fs/nfft;
freq=(0:W2-1)*df;%采样频率值
bank=zeros(24,W2);%生成一个24行W2列的全零数组
for k=2:p+1%why从2开始?因为k-1
    f1=Fb(k-1); f2=Fb(k+1); f0=Fb(k);
    n1=floor(f1/df)+1;%f(m-1)在频域中的谱线索引号
    n2=floor(f2/df)+1;%f(m+1)在频域中的谱线索引号
    n0=floor(f0/df)+1;%f(m)在频域中的谱线索引号。f(m)是从0开始,而在MATLAB中数组的索引是从1开始,所以要加1,否则会出现index=0的错误
    for i=1 : W2
        if i>=n1 & i<=n0
            bank(k-1,i)=(i-n1)/(n0-n1);
        elseif i>n0 & i<=n2
            bank(k-1,i)=(n2-i)/(n2-n0);
        end
    end
    %plot(freq,bank(k-1,:),'r','linewidth',2); hold on
end
p2=p/2;
% DCT系数,p2*p
for j=0:p2-1           
    n=0:p-1;  
    dct(j+1,:)=cos((2*n+1)*j*pi/(2*p));  
end  
ca1=bank*sa1(1:129);ca2=bank*sa2(1:129);%一帧数据经过Mel滤波器后返回24个数
cu1=bank*su1(1:129);cu2=bank*su2(1:129);
cca1=dct*log(ca1);cca2=dct*log(ca2);
ccu1=dct*log(cu1);ccu2=dct*log(cu2);
ma=cca1-cca2;mu=ccu1-ccu2;mau=cca1-ccu1;
ta=sum(abs(ma));tu=sum(abs(mu));tau=sum(abs(mau));
figure(1);plot(abs(ma));
figure(2);plot(abs(mu));
figure(3);plot(abs(mau));

五、分析

二帧相减后求绝对值再求和的结果分别为:ta=19.8824;tu=19.3398;tau=78.0083

由此可以看出,同一元音音频的任意两帧MFCC参数相差较小,不同元音音频的任意两帧MFCC参数相差较大。

猜你喜欢

转载自blog.csdn.net/qq_39516859/article/details/80880130