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

语音合成与识别

开发平台:

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. /************************************************************************* * Feature extraction * sampleN = Number of speech samples * frameN = Number of output parameter frames * frameN = int((sampleN-(frameSize-shiftSize))/shiftSize) *************************************************************************/
  9. #include "StdAfx.h" #include "FE_feature.h"
  10. /* Note that lpc_to_formant() returns formantN frequencies */
  11. int Fe::lpc_to_formant(float* acf, int norder, float* formant, int formantN, vector<CComplex>& rootsA)
  12. {
  13. int i;
  14. float ztmp[]={0,1}; Polynomial z(1,ztmp); Polynomial A = 1;
  15. for(i=1;i<=norder;i++)
  16. A = A*z - acf[i];
  17. if(rootsA.size() != norder+1) rootsA.resize(norder+1);
  18. vector<float> allFormantA(norder+1);
  19. A.Roots(&rootsA[0]);
  20. for(i=0;i<=norder;i++)
  21. allFormantA[i] = (float)0;
  22. int n=0;
  23. allFormantA[n++]=0;
  24. for(i=1; i<=norder;i++){
  25. if(imag(rootsA[i]) > 0){
  26. allFormantA[n++] = arg(rootsA[i]);
  27. }
  28. }
  29. qsort(&allFormantA[0], n, sizeof(float), FE_CompareFloat);
  30. for(i=0;i<=formantN && i<n;i++) formant[i]=allFormantA[i];
  31. return formantN;
  32. }
  33. int Fe::formant_check_range(FeMatrix<float>& formant, int formantN, int frameN)
  34. {
  35. /* F0: 80 - 500 Hz, F1: 200 - 1200 Hz, F2: 400 - 3500Hz, F3: 1000 - 5000 Hz, F4: 2000 - 6000 Hz */
  36. int i,k;
  37. float fmin, fmax;
  38. for(k=1;k<formantN;k++) {
  39. if(k==0) { fmin=80, fmax=500; }
  40. else if(k==1) { fmin=200, fmax=1200; }
  41. else if(k==2) { fmin=400, fmax=3500; }
  42. else if(k==3) { fmin=1000, fmax=5000; }
  43. else if(k==4) { fmin=1500, fmax=6000; }
  44. else { fmin=2500, fmax=8000; }
  45. for(i=2;i<frameN-2;i++){
  46. formant[i][k]=my_max(fmin, my_min(fmax, formant[i][k]));
  47. }
  48. }
  49. return frameN;
  50. }
  51. int Fe::formant_median_filter(FeMatrix<float>& formant, int formantN, int frameN)
  52. {
  53. int i;
  54. float smoothFormant[32];
  55. int margin=7;
  56. float ftmp[7];
  57. for(i=3;i<frameN-3;i++){
  58. int j;
  59. for(j=0;j<=formantN;j++){
  60. for(int n=0;n<7;n++){
  61. ftmp[n]=formant[i+n-3][j];
  62. }
  63. smoothFormant[j]=GetMedian(ftmp,7);
  64. }
  65. float a0,a1,a2;
  66. for(j=0;j<formantN;j++){
  67. a0=fabs(formant[i][j]-smoothFormant[j]);
  68. if(j>0) a1=fabs(formant[i][j]-smoothFormant[j-1]);
  69. else a1=FLT_MAX;
  70. a2=fabs(formant[i][j]-smoothFormant[j+1]);
  71. if(a1<a0 && a1<a2){
  72. formant[i][j-1]=formant[i][j];
  73. formant[i][j]=smoothFormant[j];
  74. }
  75. else if(a2<a0 && a2<a1){
  76. formant[i][j+1]=formant[i][j];
  77. formant[i][j]=smoothFormant[j];
  78. }
  79. }
  80. }
  81. return(frameN);
  82. }
  83. int Fe::formant_linear_filter(FeMatrix<float>& formant, int formantN, int frameN)
  84. {
  85. int i,k;
  86. /* low-pass filter, x=filter([1 2 1]/4, [1], x); */
  87. vector<float> x;
  88. for(k=0;k<formantN;k++) {
  89. x.resize(frameN);
  90. for(i=0;i<frameN;i++) x[i]=formant[i][k];
  91. formant[0][k]=(x[0]+2*x[0]+x[1])/4;
  92. for(i=1;i<frameN-1;i++){
  93. formant[i][k]=(x[i-1]+2*x[i]+x[i+1])/4;
  94. }
  95. formant[frameN-1][k]=(x[frameN-2]+2*x[frameN-1]+x[frameN-1])/4;
  96. }
  97. return(frameN);
  98. }
  99. int Fe::formant_remove_nonvoice(FeMatrix<float>& formant, int formantN, int frameN, vector<float>& pitchA)
  100. {
  101. assert(pitchA.size()>0);
  102. int n;
  103. for(n=0; n<pitchA.size() && n<frameN; n++){
  104. if(pitchA[n] == 0){
  105. for(int k=0;k<formantN;k++) formant[n][k] = 0;
  106. }
  107. }
  108. for( ; n < frameN; n++){
  109. for(int k=0;k<formantN;k++) formant[n][k] = 0;
  110. }
  111. return(frameN);
  112. }