基于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参数相差较大。