www.pudn.com > hmmPlatform.rar > WaveConvertor.h


#ifndef _CWAVE_CONVERTOR_H_ 
#define _CWAVE_CONVERTOR_H_ 
 
////////////////////////////////////////////////////////////////////////// 
// class CWaveConvertor 
// 
// 功能:	实现裸音频数据的FFT变换 
// 创建人:	陈文凯 (chwkai@gmail.com) 
// 创建日期:2005年5月19日 
// 修改人: 
// 修改日期: 
// 版本 
#ifndef _AFLIBFFT_H 
#define _AFLIBFFT_H 
 
typedef struct { 
	double re, im; 
} COMPLEX; 
 
/*! \class aflibFFT 
\brief Performs a forward or reverse FFT. 
 
This class provides a FFT for other classes in this library to use. There is 
only one API for this class and it is fft_double. It will perform both a 
forward and reverse FFT. It operates on doubles. 
*/ 
 
////////////////////////////////////////////////////////////////////////// 
// 实现Forward和Reverse Fourier变换 
// 
// 此类为Open Source Audio Library Project的部分代码 
// 详细介绍见:http://osalp.sourceforge.net 
class aflibFFT { 
 
public: 
 
	aflibFFT(); 
 
	~aflibFFT(); 
 
	void 
		fft_double ( 
		unsigned  NumSamples, 
		int       InverseTransform, 
		const double   *RealIn, 
		const double   *ImagIn, 
		double   *RealOut, 
		double   *ImagOut ); 
 
private: 
 
	unsigned int Nfactors; 
	COMPLEX      *W_factors; 
 
	int 
		fft ( 
		COMPLEX *in, 
		unsigned  n, 
		COMPLEX *out); 
 
	int 
		rft ( 
		COMPLEX *in, 
		unsigned  n, 
		COMPLEX *out); 
 
	void 
		Fourier ( 
		COMPLEX *in, 
		unsigned  n, 
		COMPLEX *out); 
 
	unsigned 
		radix (unsigned n); 
 
	void 
		split ( 
		register COMPLEX *in, 
		register unsigned r, 
		register unsigned m, 
		register COMPLEX *out); 
 
	void 
		join ( 
		register COMPLEX *in, 
		register unsigned m, 
		register unsigned n, 
		register COMPLEX *out); 
 
	int 
		W_init(unsigned n); 
 
}; 
 
#endif 
 
////////////////////////////////////////////////////////////////////////// 
// 负责实现音频裸数据的各种转换 
class CWaveConvertor 
{ 
public: 
	CWaveConvertor(void); 
	~CWaveConvertor(void); 
 
public: 
	// 实现信号的前向Fourier变换 
	static void ConverToFFT( 
		unsigned int nSamples,		// 样本数量 
		unsigned int nShorts,		// 短时点数 
		const double* pRealIn,		// 输入信号的实部 
		double* pRealOut,			// 输出的实部 
		double* pImageOut);			// 输出的虚部 
	 
	// 实现信号的逆向Fourier变换 
	static void ConvertToRFT( 
		unsigned int nSamples,		// 样本数量 
		unsigned int nShorts,		// 短时点数 
		const double* pRealIn,		// 输入信号 
		double* pRealOut,			// 输出信号的实部 
		double* pImageOut);			// 输出信号的虚部 
 
	// 获取输入信号的功率谱 
	static void ConvertToPowerSpectral( 
		unsigned int nSamples,		// 样本数量 
		unsigned int nShorts,		// 短时点数 
		const double* pRealIn,		// 输入信号 
		double* pDataOut			// 输出的功率谱 
		); 
 
	// 获取输入信号的对数功率谱 
	static void ConvertToLogPowerSpectral( 
		unsigned int nSamples,		// 样本数量 
		unsigned int nShorts,		// 短时点数 
		const double* pRealIn,		// 输入信号 
		double* pDataOut			// 输出的对数功率谱 
		); 
 
	// 获取输入信号的倒谱 
	static void ConvertToCepStrum( 
		unsigned int nSamples,		// 样本数量 
		unsigned int nShorts,		// 短时点数 
		const double* pRealIn,		// 输入信号的 
		double* pDataOut			// 输出的倒谱 
		); 
 
	// 对输入的8位信号,转化为double类型序列 
	static void ConvertToDoubleMono( 
		const byte* pDataIn,		// 输入样本序列 
		unsigned int nCount,		// 样本数量 
		double* pDataOut			// 输出double类型序列 
		); 
 
	// 对输入的16位信号,转化为double类型序列 
	static void ConvertToDoubleMono( 
		const int* pDataIn,				// 输入样本序列 
		unsigned int nCount,		// 样本数量 
		double* pDataOut			// 输出double类型序列 
		); 
 
	// 对输入的8位信号,转化为双声道double序列 
	static void ConvertToDoubleStereo( 
		const byte* pDataIn,				// 输入样本序列 
		unsigned int nCount,		// 样本数量 
		double* pDataOutLeft,		// 输出左声道double类型序列 
		double* pDataOutRight		// 输出右声道double类型序列 
		); 
 
	// 对输入的16位信号,转化为双声道double序列 
	static void ConvertToDoubleStereo( 
		const int* pDataIn,				// 输入样本序列 
		unsigned int nCount,		// 样本数量 
		double* pDataOutLeft,		// 输出左声道double类型序列 
		double* pDataOutRight		// 输出右声道double类型序列 
		); 
 
	// 对输入信号进行抽样 
	static void ConvertToSample( 
		const double* pDataIn,			/*输入样本序列*/ 
		unsigned int nCount,		/*输入样本数量*/ 
		double* pDataOut,			/*输出抽样样本*/ 
		unsigned int nWinSize		/*抽样窗口宽度*/ 
		); 
 
	// 对输入信号进行截取 
	static void GetData( 
		const double* pDataIn,		// 输入样本序列 
		unsigned int nCount,		// 输入样本数量 
		unsigned int nStart,		// 起始下标 
		unsigned int nLen,			// 截取长度 
		double* pDataOut			// 截取后的序列 
		); 
}; 
 
#endif /*_CWAVE_CONVERTOR_H_*/