FE_window.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. #include "StdAfx.h"
  9. #include "FE_window.h"
  10. #ifndef M_PI
  11. #define M_PI    3.14159265358979323846
  12. #endif
  13. FeWindow::FeWindow()
  14. {
  15. }
  16. FeWindow::~FeWindow()
  17. {
  18. }
  19. int FeWindow::Windowing(float *inputA, int inputN, string& wkind)
  20. {
  21. if(wkind == "Hamming")
  22. do_hamm_window(inputA, inputN);
  23. else if(wkind == "Hanning")
  24. do_hann_window(inputA, inputN);
  25. else if(wkind == "Rectangular" || wkind == "Bartlett")
  26. do_rect_window(inputA, inputN);
  27. else if(wkind == "Triangular")
  28. do_tri_window(inputA, inputN);
  29. else
  30. do_rect_window(inputA, inputN);
  31. return 1;
  32. }
  33. int FeWindow::Windowing(float *inputA, int inputN, WindowKind wkind)
  34. {
  35. if(wkind == WIN_HAMMING)
  36. do_hamm_window(inputA, inputN);
  37. else if(wkind == WIN_HANNING)
  38. do_hann_window(inputA, inputN);
  39. else if(wkind == WIN_RECT || wkind == WIN_BARTLETT)
  40. do_rect_window(inputA, inputN);
  41. else if(wkind == WIN_TRI)
  42. do_tri_window(inputA, inputN);
  43. else
  44. do_rect_window(inputA, inputN);
  45. return 1;
  46. }
  47. int FeWindow::do_hamm_window(float *inputA, int inputN)
  48. {
  49. if(hamm_window.size() != inputN){
  50. hamm_window.resize(inputN);
  51. float temp = (float)(2 * M_PI / (float)(inputN-1));
  52. for (int i=0 ; i<inputN ; i++ ) hamm_window[i] = (float)(0.54 - 0.46*cos(temp*i));
  53. }
  54. for (int i=0 ; i<inputN ;i++ ) inputA[i] = hamm_window[i]*inputA[i];
  55. return(1);
  56. }
  57. int FeWindow::do_hann_window(float *inputA, int inputN)
  58. {
  59. int i;
  60. if(hann_window.size() != inputN){
  61. hann_window.resize(inputN);
  62. float temp = (float)(2. * M_PI / (float)(inputN-1));
  63. for (i=0 ; i<inputN ; i++ ) hann_window[i] = (float)(0.5 - 0.5*cos(temp*i));
  64. }
  65. for (i=0 ; i<inputN ;i++ ) inputA[i] = hann_window[i]*inputA[i];
  66. return(1);
  67. }
  68. int FeWindow::do_rect_window(float *inputA, int inputN)
  69. {
  70.   return(1);
  71. }
  72. int FeWindow::do_tri_window(float *inputA, int inputN)
  73. {
  74. int i;
  75. if(tri_window.size() != inputN){
  76. tri_window.resize(inputN);
  77. for (i=0 ; i<inputN ; i++ ) {
  78. if(i <= inputN/2) tri_window[i]=((2*i)/(float)inputN);
  79. else              tri_window[i]=(2-(2*i)/(float)inputN);
  80. }
  81. }
  82. for (i=0 ; i<inputN ;i++ ) inputA[i] = tri_window[i]*inputA[i];
  83. return(1);
  84. }