lijinbao1.asv
上传用户:ay_070428
上传日期:2014-12-04
资源大小:11427k
文件大小:2k
源码类别:

语音合成与识别

开发平台:

Matlab

  1. %ABSE 求解函数
  2. clear all,clc;
  3. [x,fs,nbits]=wavread('8a.wav');
  4. %noise=wavread('pink.wav');
  5. %M=size(signal);
  6. %x=signal(1:M)+noise(1:M);
  7. x=x*(2^nbits/2);
  8. xx=filter([1 -0.9375], 1, x);
  9. %下面循环是求取每一帧的短时傅立叶变换(对应文中公式(2))
  10. N=32;
  11. Eb=zeros(size(xx,1),N);
  12. %外部变量
  13. for i=1:size(xx,1)
  14.     for n=
  15.   y = xx(i,:);
  16.  % s = y'.*hamming(256);
  17.   t(i,:)=(abs(fft(y)))';
  18. %下面是计算每一帧的谱的能量(对应文中公式(4))
  19.     for n=1:128
  20.         E(i,n)=t(i,n).^2;
  21.     end
  22. %下面是计算每帧中每个样本点的概率分布(对应文中公式(5))
  23.     Esum=sum(E);
  24.     for n=1:128
  25.       P(i,n)=E(i,n)/Esum;  
  26.     end
  27. %下面是计算每一帧的谱熵值(对应文中公式(6))
  28.     for n=1:128
  29.         H(i)=sum(P(i,n)*log(1/P(i,n)));
  30.     end
  31. %画出wav文件的波形和对应的信息熵
  32. subplot(411)
  33. plot(x);
  34. subplot(412)
  35. plot(H);
  36. %为了消除单个点受噪声的影响,现在把4点放在一起,变成一子带,4*32=128(对应文中公式(7))  
  37. for m=1:32
  38.        for k=(4*m-3):4*m
  39.            Eb(i,m)=Eb(i,m)+E(i,k);
  40.        end
  41.    end
  42. %实现文中公式(8)
  43.         Ebsum(i)=sum(Eb(i,:));  
  44.  for k=1:32
  45.      Pb(i,k)=Eb(i,k)/Ebsum(i);
  46.  end
  47. %实现文中公式(9)
  48.     for k=1:32
  49.         Hb(i)=sum(Pb(i,k)*log(1/P(i,k)));
  50.     end
  51. %画出wav文件的波形和对应的信息熵
  52. subplot(413)
  53. plot(Hb);
  54. %为了使熵能有效的说明语音谱的子带条形组织结构,引入了W(m,l)权值因子,下面是计算W(m,l)(对应文中(10)、(11)) 
  55.  Pb1(i)=min(Pb(i,:));
  56. for m=1:32
  57.     Pb_1(i,m)=Pb1(i)/Pb(i,m);
  58. end
  59. w(i,1)=(Pb_1(i,32)+Pb_1(i,1)+Pb_1(i,2))/3;
  60. for m=2:31
  61. w(i,m)=(Pb_1(i,m-1)+Pb_1(i,m)+Pb_1(i,m+1))/3;
  62. end
  63. w(i,32)=(Pb_1(i,31)+Pb_1(i,32)+Pb_1(i,1))/3;
  64. for k=1:32
  65.  Hb1(i)=sum(w(i,m)*Pb(i,k)*log(1/P(i,k)));
  66. end
  67. subplot(414)
  68. plot(Hb1);
  69. end