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

语音合成与识别

开发平台:

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_feature.h"
  10. static const long A=16807L; static const long M=2147483647L; static long g_noise_In[16] = { 0L, 1973272912L, 747177549L, 20464843L, 640830765L, 1098742207L, 78126602L, 84743774L, 831312807L, 124667236L, 1172177002L, 1124933064L, 1223960546L, 1878892440L, 1449793615L, 553303732L }; static int g_noise_strm = 2; static double RandomLE();
  11. static double RandomBE();
  12. double Fe::Random()
  13. {
  14. if(m_byteOrder==MY_LITTLE_ENDIAN) return RandomLE();
  15. else return RandomBE();
  16. }
  17. double RandomLE() { short  *p,*q,k; long  Hi,Lo; p = (short *)&g_noise_In[g_noise_strm]; Hi = *(p+1) * A; *(p+1) = 0; Lo = g_noise_In[g_noise_strm]*A; p = (short *)&Lo; Hi += *(p+1); q = (short *)&Hi; *(p+1) = *q&0x7fff; k = *(q+1)<<1; if(*q&0x8000) k++; Lo -= M; Lo += k; if(Lo<0) Lo+=M; g_noise_In[g_noise_strm] = Lo; return((double)Lo*4.656612875E-10); }
  18. double  RandomBE() { short  *p,*q,k; long  Hi,Lo; p = (short *)&g_noise_In[g_noise_strm]; Hi = *(p)*A; *(p) = 0; Lo = g_noise_In[g_noise_strm]*A; p = (short *)&Lo; Hi += *(p); q = (short *)&Hi; *(p) = *(q+1)&0x7fff; k = *(q)<<1; if(*(q+1)&0x8000) k++; Lo -= M; Lo += k; if(Lo<0) Lo += M; g_noise_In[g_noise_strm] = Lo; return((double)Lo*4.656612875E-10); }
  19. double Fe::GaussianNoise(double x, double s) { double  v1,v2,w,z1; static  double  z2=0.0; if (z2 != 0.0) { z1=z2; z2=0.0; } else { do { v1 = 2.0*Random()-1.0; v2 = 2.0*Random()-1.0; w = v1*v1 + v2*v2; } while (w >= 1.0); w = sqrt((-2.0*log(w))/w); z1 = v1*w; z2 = v2*w; } return(x+z1*s); }
  20. /********************************************************************** 
  21.  * add additive white Gaussian noise(AWGN) into speech signal
  22.  **********************************************************************/
  23. int Fe::AddNoise(float *sample, int num_of_samples, float *waveform, int insert_noise, float SNR)
  24. {
  25. int j;
  26. float Ps, Pn;
  27. if (insert_noise) {
  28. Ps = 0.0;
  29. for (j=0; j<num_of_samples; j++)
  30. Ps += sample[j]*sample[j];
  31. Ps /= (float) num_of_samples;
  32. Pn = Ps / EXP10( 0.1 * SNR );
  33. for (j=0; j<num_of_samples; j++)
  34. waveform[j] = sample[j] + (float) GaussianNoise( 0.0, sqrt((double) Pn) );
  35. }
  36. return(1);
  37. }
  38. /* ------------------------------------------------------------------ 
  39. When using ulaw data, often entire frames will contain only zeros.
  40. This is bad for spectral calculation, so we should add a dither
  41. signal to make sure the signal is always at least some quantization noise.
  42.  12-Oct-94
  43.  Now using rand48 routines instead for hpux compatibility
  44. ------------------------------------------------------------------ */
  45. /* add 1-bit dither to signal */
  46. int Fe::Dither(float *buf, int n)
  47. {
  48. int  i;
  49. srand(1);
  50. for (i=0;i<n;i++) buf[i] += ((rand()%2)?1:0);
  51. return(1);
  52. }