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_*/