WaveConvertor.h
上传用户:goak128
上传日期:2013-07-17
资源大小:155k
文件大小:5k
源码类别:

控制台编程

开发平台:

C/C++

  1. #ifndef _CWAVE_CONVERTOR_H_
  2. #define _CWAVE_CONVERTOR_H_
  3. //////////////////////////////////////////////////////////////////////////
  4. // class CWaveConvertor
  5. //
  6. // 功能: 实现裸音频数据的FFT变换
  7. // 创建人: 陈文凯 (chwkai@gmail.com)
  8. // 创建日期:2005年5月19日
  9. // 修改人:
  10. // 修改日期:
  11. // 版本
  12. #ifndef _AFLIBFFT_H
  13. #define _AFLIBFFT_H
  14. typedef struct {
  15. double re, im;
  16. } COMPLEX;
  17. /*! class aflibFFT
  18. brief Performs a forward or reverse FFT.
  19. This class provides a FFT for other classes in this library to use. There is
  20. only one API for this class and it is fft_double. It will perform both a
  21. forward and reverse FFT. It operates on doubles.
  22. */
  23. //////////////////////////////////////////////////////////////////////////
  24. // 实现Forward和Reverse Fourier变换
  25. //
  26. // 此类为Open Source Audio Library Project的部分代码
  27. // 详细介绍见:http://osalp.sourceforge.net
  28. class aflibFFT {
  29. public:
  30. aflibFFT();
  31. ~aflibFFT();
  32. void
  33. fft_double (
  34. unsigned  NumSamples,
  35. int       InverseTransform,
  36. const double   *RealIn,
  37. const double   *ImagIn,
  38. double   *RealOut,
  39. double   *ImagOut );
  40. private:
  41. unsigned int Nfactors;
  42. COMPLEX      *W_factors;
  43. int
  44. fft (
  45. COMPLEX *in,
  46. unsigned  n,
  47. COMPLEX *out);
  48. int
  49. rft (
  50. COMPLEX *in,
  51. unsigned  n,
  52. COMPLEX *out);
  53. void
  54. Fourier (
  55. COMPLEX *in,
  56. unsigned  n,
  57. COMPLEX *out);
  58. unsigned
  59. radix (unsigned n);
  60. void
  61. split (
  62. register COMPLEX *in,
  63. register unsigned r,
  64. register unsigned m,
  65. register COMPLEX *out);
  66. void
  67. join (
  68. register COMPLEX *in,
  69. register unsigned m,
  70. register unsigned n,
  71. register COMPLEX *out);
  72. int
  73. W_init(unsigned n);
  74. };
  75. #endif
  76. //////////////////////////////////////////////////////////////////////////
  77. // 负责实现音频裸数据的各种转换
  78. class CWaveConvertor
  79. {
  80. public:
  81. CWaveConvertor(void);
  82. ~CWaveConvertor(void);
  83. public:
  84. // 实现信号的前向Fourier变换
  85. static void ConverToFFT(
  86. unsigned int nSamples, // 样本数量
  87. unsigned int nShorts, // 短时点数
  88. const double* pRealIn, // 输入信号的实部
  89. double* pRealOut, // 输出的实部
  90. double* pImageOut); // 输出的虚部
  91. // 实现信号的逆向Fourier变换
  92. static void ConvertToRFT(
  93. unsigned int nSamples, // 样本数量
  94. unsigned int nShorts, // 短时点数
  95. const double* pRealIn, // 输入信号
  96. double* pRealOut, // 输出信号的实部
  97. double* pImageOut); // 输出信号的虚部
  98. // 获取输入信号的功率谱
  99. static void ConvertToPowerSpectral(
  100. unsigned int nSamples, // 样本数量
  101. unsigned int nShorts, // 短时点数
  102. const double* pRealIn, // 输入信号
  103. double* pDataOut // 输出的功率谱
  104. );
  105. // 获取输入信号的对数功率谱
  106. static void ConvertToLogPowerSpectral(
  107. unsigned int nSamples, // 样本数量
  108. unsigned int nShorts, // 短时点数
  109. const double* pRealIn, // 输入信号
  110. double* pDataOut // 输出的对数功率谱
  111. );
  112. // 获取输入信号的倒谱
  113. static void ConvertToCepStrum(
  114. unsigned int nSamples, // 样本数量
  115. unsigned int nShorts, // 短时点数
  116. const double* pRealIn, // 输入信号的
  117. double* pDataOut // 输出的倒谱
  118. );
  119. // 对输入的8位信号,转化为double类型序列
  120. static void ConvertToDoubleMono(
  121. const byte* pDataIn, // 输入样本序列
  122. unsigned int nCount, // 样本数量
  123. double* pDataOut // 输出double类型序列
  124. );
  125. // 对输入的16位信号,转化为double类型序列
  126. static void ConvertToDoubleMono(
  127. const int* pDataIn, // 输入样本序列
  128. unsigned int nCount, // 样本数量
  129. double* pDataOut // 输出double类型序列
  130. );
  131. // 对输入的8位信号,转化为双声道double序列
  132. static void ConvertToDoubleStereo(
  133. const byte* pDataIn, // 输入样本序列
  134. unsigned int nCount, // 样本数量
  135. double* pDataOutLeft, // 输出左声道double类型序列
  136. double* pDataOutRight // 输出右声道double类型序列
  137. );
  138. // 对输入的16位信号,转化为双声道double序列
  139. static void ConvertToDoubleStereo(
  140. const int* pDataIn, // 输入样本序列
  141. unsigned int nCount, // 样本数量
  142. double* pDataOutLeft, // 输出左声道double类型序列
  143. double* pDataOutRight // 输出右声道double类型序列
  144. );
  145. // 对输入信号进行抽样
  146. static void ConvertToSample(
  147. const double* pDataIn, /*输入样本序列*/
  148. unsigned int nCount, /*输入样本数量*/
  149. double* pDataOut, /*输出抽样样本*/
  150. unsigned int nWinSize /*抽样窗口宽度*/
  151. );
  152. // 对输入信号进行截取
  153. static void GetData(
  154. const double* pDataIn, // 输入样本序列
  155. unsigned int nCount, // 输入样本数量
  156. unsigned int nStart, // 起始下标
  157. unsigned int nLen, // 截取长度
  158. double* pDataOut // 截取后的序列
  159. );
  160. };
  161. #endif /*_CWAVE_CONVERTOR_H_*/