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

语音合成与识别

开发平台:

Matlab

  1. function parameter= wav2ftr1(Inwav)
  2. % WAV2FTR Wave to MFCC feature extraction
  3. setparam;
  4. if isstr(Inwav),
  5. [Inwav,Fs,NBits] = wavread(Inwav);
  6. end
  7. % ====== Step 1: Pre-emphasis.
  8. Inwav = filter([1, -0.95], 1, Inwav);
  9. % ====== Step 2: frame blocking.
  10. Frame = buffer(Inwav, frameSize, overlap);
  11. load tri_coef.mat   % for triBandFilter parameter : fstart,fcent,fstop.
  12. normalize_coff = 10;
  13. energy = sum(Frame.^2)/frameSize;
  14. index = find(energy < threshold);
  15. energy(index) = [];
  16. logEnergy = 10*log10(energy)/normalize_coff;
  17. Frame(:, index) = [];
  18. parameter = [];
  19. for i = 1:size(Frame, 2);
  20.       % ====== Step 3: hamming window.
  21.       %            w(m) = 0.54 - 0.46 cos(2*pi*m / n) , 1<=m<=n+1.
  22.       %Wframe = Frame*(0.54 - 0.46*cos(2*pi*i / (FrameCount-1)));
  23.       Wframe  = hamming(frameSize).*Frame(:,i);
  24.       
  25.       % ====== Step 4: fast fourier transform.
  26.       %            Using FFT function to calculate. 
  27.       %            Compute square of real part and imaginary part.
  28.       %fftFrame = sqrt(real(fft(Wframe)).^2+imag(fft(Wframe)).^2);
  29.       fftFrame = abs(fft(Wframe));
  30.       
  31.       % ====== Step 5: triangular bandpass filter.
  32.       %            Using user defined function triBandFilter(fftFrame{i}).
  33.       P = 20;      %P means counts of log spectral magnitude.
  34.       tbfCoef = triBandFilter(fftFrame,P,fstart,fcent,fstop);
  35.       %tbfCoef = bandfilt(fftFrame,P,fstart,fcent,fstop);
  36.       
  37.       % ====== Step 6: cosine transform.
  38.       %            Using DCT to get L order mel-scale-cepstrum parameters.
  39.       L = 12;      %L means L order , generally L is 12.
  40.       cepstrum = mel_cepstrum2(L,P,tbfCoef);
  41.       parameter = [parameter cepstrum'];
  42. end;
  43. parameter = [parameter; logEnergy];
  44. %=========compute delta energy and delta cepstrum============
  45. %Calculate delta cepstrum and delta log energy
  46. %Combine them with cepstrum and log energy, get 26 order parameter.
  47. delta_window = 2;
  48. parameter = getDeltaFeature(delta_window, parameter);
  49. %========================Subfunction================================
  50. % ====== Triangular Band Filter
  51. function tbfCoef = triBandFilter(fftFrame,P,fstart,fcent,fstop)
  52. %The function is triangular bandpass filter.
  53. for i = 1 : P,
  54.    for j = fstart(i) : fcent(i),
  55.       filtmag(j) = (j-fstart(i))/(fcent(i)-fstart(i));
  56.    end;
  57.    for j = fcent(i)+1: fstop(i),
  58.       filtmag(j) = 1-(j-fcent(i))/(fstop(i)-fcent(i));
  59.    end;
  60.    tbfCoef(i) = sum(fftFrame(fstart(i):fstop(i)).*filtmag(fstart(i):fstop(i))');
  61. end;
  62. tbfCoef = log(tbfCoef.^2);
  63. % ====== Mel-scale cepstrum
  64. function cepstrum = mel_cepstrum2(L,P,tbfCoef)
  65. %compute mel-scale cepstrum , L should be 12 at most part.
  66. for i=1:L,
  67. coef = cos((pi/P)*i*(linspace(1,P,P)-0.5))';
  68. cepstrum(i) = sum(coef.*tbfCoef');
  69. end;
  70. % ====== Delta cepstrum and delta log energy
  71. function parameter = getDeltaFeature(delta_window,parameter)
  72. % Compute delta cepstrum and delta log energy.
  73. rows  = size(parameter,1);
  74. cols  = size(parameter,2);
  75. temp  = [zeros(rows,delta_window) parameter zeros(rows,delta_window)];
  76. temp2 = zeros(rows,cols);
  77. denominator = sum([1:delta_window].^2)*2;
  78. for i = 1+delta_window : cols+delta_window,
  79.    subtrahend = 0;
  80.    minuend    = 0;
  81.    for j = 1 : delta_window,
  82.       subtrahend = subtrahend + temp(:,i+j)*j;
  83.       minuend    = minuend + temp(:,i-j)*(-j);
  84.    end;
  85.    temp2(:,i-delta_window) = (subtrahend - minuend)/denominator;
  86. end;
  87. parameter = [parameter ; temp2];