subband spectral entropy used in speech endpoint detection.m
资源名称:speech.rar [点击查看]
上传用户:ay_070428
上传日期:2014-12-04
资源大小:11427k
文件大小:2k
源码类别:
语音合成与识别
开发平台:
Matlab
- %ABSE 求解函数
- clear all,clc;
- x=wavread('8a.wav');
- %noise=wavread('pink.wav');
- %M=size(signal);
- %x=signal(1:M)+noise(1:M);
- x = double(x);
- x = x /max(abs(x));
- xx=enframe(filter([1 -0.9375], 1, x),hamming(256),128);
- %下面循环是求取每一帧的短时傅立叶变换(对应文中公式(2))
- N=32;
- Eb=zeros(size(xx,1),N);
- %外部变量
- for i=1:size(xx,1)
- y = xx(i,:);
- % s = y'.*hamming(256);
- t(i,:)=(abs(fft(y)))';
- %下面是计算每一帧的谱的能量(对应文中公式(4))
- for n=1:128
- E(i,n)=t(i,n).^2;
- end
- %下面是计算每帧中每个样本点的概率分布(对应文中公式(5))
- Esum=sum(E);
- for n=1:128
- P(i,n)=E(i,n)/Esum;
- end
- %下面是计算每一帧的谱熵值(对应文中公式(6))
- for n=1:128
- H(i)=sum(P(i,n)*log(1/P(i,n)));
- end
- %画出wav文件的波形和对应的信息熵
- subplot(411)
- plot(x);
- subplot(412)
- plot(H);
- %为了消除单个点受噪声的影响,现在把4点放在一起,变成一子带,4*32=128(对应文中公式(7))
- for m=1:32
- for k=(4*m-3):4*m
- Eb(i,m)=Eb(i,m)+E(i,k);
- end
- end
- %实现文中公式(8)
- Ebsum(i)=sum(Eb(i,:));
- for k=1:32
- Pb(i,k)=Eb(i,k)/Ebsum(i);
- end
- %实现文中公式(9)
- for k=1:32
- Hb(i)=sum(Pb(i,k)*log(1/P(i,k)));
- end
- %画出wav文件的波形和对应的信息熵
- subplot(413)
- plot(Hb);
- %为了使熵能有效的说明语音谱的子带条形组织结构,引入了W(m,l)权值因子,下面是计算W(m,l)(对应文中(10)、(11))
- Pb1(i)=min(Pb(i,:));
- for m=1:32
- Pb_1(i,m)=Pb1(i)/Pb(i,m);
- end
- w(i,1)=(Pb_1(i,32)+Pb_1(i,1)+Pb_1(i,2))/3;
- for m=2:31
- w(i,m)=(Pb_1(i,m-1)+Pb_1(i,m)+Pb_1(i,m+1))/3;
- end
- w(i,32)=(Pb_1(i,31)+Pb_1(i,32)+Pb_1(i,1))/3;
- for k=1:32
- Hb1(i)=sum(w(i,m)*Pb(i,k)*log(1/P(i,k)));
- end
- subplot(414)
- plot(Hb1);
- end