实验三 语音信号的Mel频率倒谱系数分析(4课时)
通过Matlab编程掌握语音信号的Mel频率倒谱参数的求解方法。
人耳听到声音的高低与声音的频率成对数关系,即:Mel(f)=2595lg(1+f/700),实际频率f的单位是Hz.根据Zwicker的工作,临界频率带宽随着频率的变化而变化,并与Mel频率的增长一致。类似与临界带的划分,可以将语音频率划分成一系列三角形的滤波器序列,如下图所示.
取每个三角形的滤波器频率带宽内所有信号幅度加权和作为某个带通滤波器的输出,然后对所有滤波器输出做对数运算,再进一步做离散余弦变换得到MFCC。
具体步骤如下:
(1)三角滤波器的输出则为此频率带宽内所有信号幅度谱加权和。
l = 1,2,....,40
(2)对所有滤波器输出作对数运算
l = 1,2,....,40
(3)作离散余弦变换(DCT)得到Mel频率倒谱参数(MFCC)。
i = 1,2,...,P,P为MFCC参数的阶数,取P=16。
实验三程序
[x,fs,bits]=wavread('c:\WINDOWS\Media\chimes.wav');
x=x(:,1);
x=x';
len=length(x);
N=256;
M=128;
Fn=fix((len-N)/M+1);
y=[];
for i=1:Fn
down=1+(i-1)*M;
up=down+N-1;
temp=x(down:up);
temp=temp.*hamming(N)';%每帧加hamming窗
y=[y;temp];
end
L=24;%滤波器个数
R=16;%mel参数的个数
k=0:N/2;
f=fs/N*k;%每点的频率值
mel=2595*log(1+f/700);%mel频率的变换
%melm=max(mel)
melm=2595*log(1+fs/1400);%mel频率的最高频率
r=0:L+1;%整个频率分为r个临界点
tri=melm/(L+1)*r;%每个mel临界频率的频率值
s=[];
for j=1:Fn
temp1=y(j,:);%提取一帧信号
p=abs(fft(temp1));%每帧信号的幅度谱
for l=1:L
tri1=[tri(l),tri(l+1),tri(l+2)];%三角滤波器的下截止频率,中心频率,上截止频率
low=find((mel>=tri1(1))&(mel<=tri1(2)));%三角滤波器下截止频率
high=find((mel>=tri1(2))&(mel<=tri1(3)));%三角滤波器上截止频率
w=[(mel(low)-tri1(1))/(tri1(2)-tri1(1)),(tri1(3)-mel(high))/(tri1(3)-tri1(2))];%三角形滤波器
m(l)=sum(w.*p([low,high]),2);%给每一段临界频率加三角窗
end
l=1:L;
for q=1:R
c(q)=sqrt(2/N)*sum(log(m).*cos((l-0.5)*q*pi/L),2); % 离散余弦变换得到MFCC
end
s=[s;c];
end
plot(s(6,:));%输出某一帧的MFCC参数