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

语音合成与识别

开发平台:

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. #ifndef _FE_ENHANCE_H_
  9. #define _FE_ENHANCE_H_
  10. #include "FE_common.h"
  11. /*-----------------------------------*/
  12. /* Definition for endpoint detectors */
  13. /*-----------------------------------*/
  14. #define NR_MAX_RECORD_TIME      10           /* 10 seconds */
  15. #define NR_WAV_BUF_SIZE         (NR_MAX_RECORD_TIME*16000)   /* 10 seconds at 16 kHz mono sampling frequency */
  16. #define NR_MAX_WIN_SIZE         512          /* maximum window size */
  17. /*----------------------------------*/
  18. /* Definition for noise reduction   */
  19. /*----------------------------------*/
  20. #define NR_MAX_FRAME_SHIFT          320
  21. #define NR_MAX_SPEC_LENGTH          257   /* FFT_LENGTH_1/2+1 */
  22. #define NR_OUT_BUF_SIZE (5*NR_MAX_WIN_SIZE)
  23. #ifdef _DEBUG
  24. #define NR_BUF_SIZE   NR_WAV_BUF_SIZE
  25. #else
  26. #define NR_BUF_SIZE   (2*16000)  /* save only 2 second speech to save memory */
  27. #endif
  28. /*----------------------------------*/
  29. /* Definition for Wiener filter     */
  30. /*----------------------------------*/
  31. #define NR_NUM_CHANNELS             23
  32. #define NR_FL                       17
  33. typedef struct {
  34.     int m_lowX;
  35.     int m_centerX;
  36.     int m_highX;
  37. float m_sumWeight;
  38. } WfMelFB; /* mel filter bank for noise reduction */
  39. class Wiener {
  40. public:
  41. /* basic part */
  42. int m_isWiener;
  43. int m_sampleRate;
  44. int m_winSize;
  45. int m_shiftSize;
  46. int m_fftSize;
  47. /* derived part */
  48. int m_specLength;
  49. float m_scaleFactor;
  50. /* for audio/file interface */
  51. short m_inputSpeech[NR_BUF_SIZE]; /* ring buffer for input speech */
  52. long m_inputEndX; /* end sample point to input speech */
  53. /* spectrum estimation */
  54. float m_HanningWin[NR_MAX_WIN_SIZE];
  55. float m_buf_in[4*NR_MAX_FRAME_SHIFT]; /* frame 0, frame 1, frame 2, frame 3 */
  56. float m_buf_out[4*NR_MAX_FRAME_SHIFT]; /* frame 0, frame 1, frame 2, frame 3 */
  57. float m_spec[NR_MAX_SPEC_LENGTH];
  58. float m_spec_re[NR_MAX_WIN_SIZE];
  59. float m_spec_im[NR_MAX_WIN_SIZE];
  60. /* Power spectral density mean */
  61. float m_sqrtInPSD[NR_MAX_SPEC_LENGTH];
  62. float m_lastSpectrum[NR_MAX_SPEC_LENGTH];
  63. float m_lastSpectrum2[NR_MAX_SPEC_LENGTH];
  64. float m_sqrtNoisePSD[NR_MAX_SPEC_LENGTH];
  65. long m_nbFrameX;
  66. /* Wiener filter design */
  67. float m_wienerFilter[NR_MAX_SPEC_LENGTH];
  68. float m_sqrtDen3PSD[NR_MAX_SPEC_LENGTH];
  69. /* Spectral subtraction design */
  70. float m_ssFilter[NR_MAX_SPEC_LENGTH];
  71. float m_oversubGain; /* over-subtraction gain (fg), usually 4 */
  72. float m_oversubCutoffFreq; /* over-subtraction cutoff frequency (fc), usually 800 Hz */
  73. float m_oversubFactor[NR_MAX_SPEC_LENGTH]; /* oversubFac(f) = fg/(1+f/fc) */
  74. /* for VAD for noise estimation */
  75. int m_nbSpeechFrame;
  76. int m_flagVADNest;
  77. int m_hangOver;
  78. float m_meanEn;
  79. long m_nbFrameVADNest;
  80. #ifdef _DEBUG
  81. short m_denSpeech[NR_BUF_SIZE]; /* ring buffer for denoised speech */
  82. long m_denEndX; /* end sample point to denoised speech */
  83. #endif
  84. float m_outSpeech[NR_OUT_BUF_SIZE];
  85. long m_localFrameX; /* time frame index of noise reduction (for internal use) */
  86. /* Mel filter-bank */
  87. int m_NumChannels;
  88. WfMelFB m_MelFB[NR_NUM_CHANNELS+2];
  89. float m_MelWeight[NR_MAX_SPEC_LENGTH];
  90. float m_H2mel[NR_NUM_CHANNELS+2];
  91. /* Mel IDCT */
  92. float m_hWFmirr[2*(NR_NUM_CHANNELS+1)+1];
  93. float m_melIdctMatrix[(NR_NUM_CHANNELS+2)*(NR_NUM_CHANNELS+2)];
  94. /* Apply filter */
  95. int m_bufStartX;
  96. float m_hWFw[NR_FL];
  97. float m_HanningWin2[NR_FL];
  98. /*--------------------*/
  99. /* Member functions */
  100. /*--------------------*/
  101. Wiener();
  102. virtual ~Wiener();
  103. int Init(int samplingRate, int isWiener);
  104. FeReturnCode InitNewUtterance(const char *fname);
  105. FeReturnCode OneFrame(short *sample, int sampleN, float *out, int frameX);
  106. void Close();
  107. #ifdef _DEBUG
  108. int SaveInput(const char *fname, int offsetX);
  109. int SaveDenoised(const char *fname, int offsetX);
  110. #endif
  111. private:
  112. int GetSample(short *sample, int sampleN);
  113. FeReturnCode OneFrameWiener(float *si, float *out);
  114. FeReturnCode OneFrameSS(float *in, float *out);
  115. void EstimateSpectrum(float *s, float *spectrum, float *re, float *im, int subSample);
  116. void ComputeMeanPSD(float *spectrum, float *lastSpectrum, float *lastSpectrum2, int flagVADNest, float *sqrtInPSD);
  117. void DesignWiener(int t, int flagVADNest, const float *in, const float *inPSD, float *noisePSD, float *den3PSD, float *filter);
  118. void DesignSpecsub(int t, int flagVADNest, const float *in, const float *inPSD, float *noisePSD, float *den3PSD, float *filter);
  119. void VADNest(int t, const float *s);
  120. void ApplyFilter(float *re, float *im, float *h, float *out);
  121. void InitHanning (float *win, int len);
  122. void InitMelFilterBanks (float startingFrequency, float samplingRate, int fftLength, int numChannels);
  123. int InitMelIDCTMatrix (float *idctMatrix, int numChannels);
  124. void MelFilterBank(float *h2, float *h2mel);
  125. void MelIDCT(float *h2mel, float *hWFmirr);
  126. void ApplyWiener(float *s, float *hWFmirr, float *hWFw, float *out);
  127. };
  128. #endif