FE_delta.cpp
上传用户:italyroyal
上传日期:2013-05-06
资源大小:473k
文件大小:2k
源码类别:

语音合成与识别

开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////////
  2. // This is a part of the Feature program.
  3. // Version: 1.0
  4. // Date: February 22, 2003
  5. // Programmer: Oh-Wook Kwon
  6. // Copyright(c) 2003 Oh-Wook Kwon. All rights reserved. owkwon@ucsd.edu
  7. ///////////////////////////////////////////////////////////////////////////////
  8. /****************************************************************************  *  Computing delta coefficients, cepstral liftering, preemphasis  ****************************************************************************/ #include "StdAfx.h" #include "FE_feature.h"
  9. /************************************************************************  *    Compute Delta coefficients  ************************************************************************/
  10. int Fe::delta_compute(FeMatrix<float>& input, int filterLen, FeMatrix<float>& output) {
  11. int num_frames=input.size();
  12. if(num_frames==0) return 0;
  13. int dim=input[0].size();
  14. output.Resize(num_frames,dim);
  15. vector<float> filterCoeff(filterLen);
  16. delta_init_filter(&filterCoeff[0], filterLen);
  17. delta_basic(input, output, &filterCoeff[0], filterLen);
  18. return(1); }
  19. int Fe::delta_basic(FeMatrix<float>& input, FeMatrix<float>& output, float *filterCoeff, int filterLen)
  20. {
  21. int num_frames=input.size();
  22. if(num_frames==0) return 0;
  23. int dim=input[0].size();
  24. int i,j,n;
  25. int delta = (filterLen-1)/2;
  26. for(n=0;n<num_frames;n++){
  27. for(i=0;i<dim;i++){
  28. float sum = 0;
  29. for(j=0; j<filterLen; j++){
  30. float x = (n-delta+j >= 0) ? ((n-delta+j < num_frames) ? input[n-delta+j][i]: input[num_frames-1][i]) : input[0][i];
  31. sum += x * filterCoeff[j];
  32. }
  33. output[n][i] = sum;
  34. }
  35. }
  36. return(1);
  37. }
  38. int Fe::delta_init_filter(float *filterCoeff, int filterLen) {
  39. if(filterLen == 1){
  40. filterCoeff[0] = 1;
  41. return 1;
  42. } int j;
  43. int center = (filterLen-1)/2; float sqsum = 0; for (j=0; j<filterLen; j++) { filterCoeff[j] = (float)(j-center);
  44. sqsum += (filterCoeff[j])*(filterCoeff[j]); }
  45. /*      Assuming that cepstrum parameters are uncorrelated,      */
  46. /*      variances of cepstrum and delta cepstrum are set       */
  47. /*      approximately equal through the SQRT operation          */ for (j=0; j<filterLen; j++) { filterCoeff[j] /= (float)sqrt(sqsum); } return(1); }