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

语音合成与识别

开发平台:

Matlab

  1. function [parameter,region_set]= feature_extrac(wavefile)
  2. %feature_extrac(wavefile) :
  3. %To get feature parameters from input wave file.
  4. %Generally ,sample rate of the wave file is 8KHz or 16KHz.
  5. %Inwav is data(time-amplitude) of the wave file.
  6. %Fs is sample rate(Freqency) of the wave file.
  7. %NBits means N bits to save one data.
  8. %[Inwav,Fs,NBits] = wavread('wavedir/w10.wav');
  9. [Inwav,Fs,NBits] = wavread(wavefile);
  10. %First Step : pre-emphasis.
  11. Inwav = pre_emphasis(Inwav);
  12. %Second Step: frame blocking.
  13. %             Frame size N(ms),overlapping region is M(ms)
  14. %             Generally , M = (1/3)*N , which N = 30.
  15. N = 32; %32 = (256/8000)*1000 , each frame has 256 points.
  16. M = (1/2)*N;
  17. FrameSize = round(N*Fs/1000);
  18. FrameLap  = round(M*Fs/1000);
  19. FrameCount= floor((size(Inwav,1)/(FrameSize-FrameLap)) - 1);
  20. parameter = [];
  21. threshold = 0.0003;  % for edge detetcion threshold.
  22. load tri_coef.mat   % for tri_band_filter parameter : fstart,fcent,fstop.
  23. for i = 1 : FrameCount,
  24.    startpos = (i-1)*(FrameSize-FrameLap)+1;
  25.    Frame{i} = Inwav(startpos:startpos+FrameSize-1);
  26.    %Calculate energy to do edge detection
  27.    energy(i) = sum(Frame{i}.^2)/FrameSize;
  28.    if energy(i) > threshold , 
  29.       energy(i) = 1;
  30.    else 
  31.       energy(i) = 0;
  32.    end;
  33. end;
  34. [region_set,legal_frame] = edge_detect(energy);
  35. for i = 1 : FrameCount,
  36.    if ismember(i,legal_frame),
  37.       %Third Step: hamming window.
  38.       %            w(m) = 0.54 - 0.46 cos(2*pi*m / n) , 1<=m<=n+1.
  39.       %Wframe = Frame*(0.54 - 0.46*cos(2*pi*i / (FrameCount-1)));
  40.       Wframe  = hamming(FrameSize).*Frame{i};
  41.       
  42.       %Forth Step: fast fourier transform.
  43.       %            Using FFT function to calculate. 
  44.       %            Compute square of real part and imaginary part.
  45.       %fft_frame = sqrt(real(fft(Wframe)).^2+imag(fft(Wframe)).^2);
  46.       fft_frame = abs(fft(Wframe));
  47.       
  48.       %Fifth Step: triangular bandpass filter.
  49.       %            Using user defined function tri_band_filter(fft_frame{i}).
  50.       P = 20;      %P means counts of log spectral magnitude.
  51.       TBF_coef = tri_band_filter(fft_frame,P,fstart,fcent,fstop);
  52.       %TBF_coef = bandfilt(fft_frame,P,fstart,fcent,fstop);
  53.       
  54.       %Sixth Step: cosine transform.
  55.       %            Using DCT to get L order mel-scale-cepstrum parameters.
  56.       L = 12;      %L means L order , generally L is 12.
  57.       Cepstrum = mel_cepstrum(L,P,TBF_coef);
  58.       
  59.       %Compute log_energy for parameter.
  60.       normalize_coff = 10;
  61.       log_energy = 10*log10(sum(Frame{i}.^2)/FrameSize)/normalize_coff;
  62.       
  63.       %parameter is 12+1 = 13 order now. 
  64.       %In other words, parameter is 13 x N matrix. N is size of legal_frame.
  65.       temp = [Cepstrum log_energy]';
  66.       parameter = [parameter temp];
  67.    end; 
  68. end;
  69. %=========compute delta energy and delta cepstrum============
  70. %Calculate delta Cepstrum and delta log energy
  71. %Combine them with Cepstrum and log energy, get 26 order parameter.
  72. delta_window = 2;
  73. parameter = delta_function(delta_window,parameter);
  74. %figure;
  75. %plot(Inwav);      
  76. %========================Subfunction================================
  77. function Inwav = pre_emphasis(Inwav)
  78. %s'(n) = s(n)-0.95s(n-1);
  79. Inwav = Inwav - 0.95*[0 ;Inwav(1:end-1)];
  80. function TBF_coef = tri_band_filter(fft_frame,P,fstart,fcent,fstop)
  81. %The function is triangular bandpass filter.
  82. for i = 1 : P,
  83.    for j = fstart(i) : fcent(i),
  84.       filtmag(j) = (j-fstart(i))/(fcent(i)-fstart(i));
  85.    end;
  86.    for j = fcent(i)+1: fstop(i),
  87.       filtmag(j) = 1-(j-fcent(i))/(fstop(i)-fcent(i));
  88.    end;
  89.    TBF_coef(i) = sum(fft_frame(fstart(i):fstop(i)).*filtmag(fstart(i):fstop(i))');
  90. end;
  91. TBF_coef = log(TBF_coef.^2);
  92. function Cepstrum = mel_cepstrum(L,P,TBF_coef)
  93. %compute mel-scale cepstrum , L should be 12 at most part.
  94. for i = 1 : L,
  95.    coef        = cos((pi/P)*i*(linspace(1,P,P)-0.5))';
  96.    Cepstrum(i) = sum(coef.*TBF_coef');
  97. end;
  98. function parameter = delta_function(delta_window,parameter)
  99. %compute delta value : delta cepstrum and delta log energy.
  100. rows  = size(parameter,1);
  101. cols  = size(parameter,2);
  102. temp  = [zeros(rows,delta_window) parameter zeros(rows,delta_window)];
  103. temp2 = zeros(rows,cols);
  104. denominator = sum([1:delta_window].^2)*2;
  105. for i = 1+delta_window : cols+delta_window,
  106.    subtrahend = 0;
  107.    minuend    = 0;
  108.    for j = 1 : delta_window,
  109.       subtrahend = subtrahend + temp(:,i+j)*j;
  110.       minuend    = minuend + temp(:,i-j)*(-j);
  111.    end;
  112.    temp2(:,i-delta_window) = (subtrahend - minuend)/denominator;
  113. end;
  114. parameter = [parameter ; temp2];