语音特征参数分析平台(四) 语音信号的数字信号转换和频域特征参数获取

二、数字信号转换:
在语音处理中,往往需要对输入的原始语音信号进行信号处理。包括对输入语音信号的8~16位转换,截取,抽样以及相关的FFT变换。

在进行FFT变换部分,采用了osalp的开源fft库,在其基础上实现了短时FFT。osalp的源代码和说明可以从http://osalp.sourceforge.net 得到。

本文中所涉及的德数字信号变换由CWaveConvertor类负责,
1、CWaveConvertor类的功能:
1)实现输入裸音频数据的短时FFT变换和逆变换:默认情况下取基数为2,256点
2)获取输入裸音频数据的功率谱
3)获取输入裸音频数据的对数功率谱
4)获取输入裸音频数据的LPC倒谱
5)对输入8bit单声道裸音频数据,转化为double型:便于通用的音频分析
6)对输入的16bit单声道裸音频数据,转化为double:同上
7)对输入8bit双声道裸音频数据,转化为double型:同上
8)对输入16bit双声道裸音频数据,转化为double型:同上
9)对输入裸音频数据进行抽样
10)对输入裸音频数据进行截取

2、CWaveConvertor类的设计。

 1 //////////////////////////////////////////////////////////////////////////
 2 // 负责实现音频裸数据的各种转换
 3 class CWaveConvertor
 4 {
 5 public:
 6     CWaveConvertor(void);
 7     ~CWaveConvertor(void);
 8 
 9 public:
10     // 实现信号的前向Fourier变换
11     static void ConverToFFT(
12         unsigned int nSamples,        // 样本数量
13         unsigned int nShorts,        // 短时点数
14         const double* pRealIn,        // 输入信号的实部
15         double* pRealOut,            // 输出的实部
16         double* pImageOut);            // 输出的虚部
17     
18     // 实现信号的逆向Fourier变换
19     static void ConvertToRFT(
20         unsigned int nSamples,        // 样本数量
21         unsigned int nShorts,        // 短时点数
22         const double* pRealIn,        // 输入信号
23         double* pRealOut,            // 输出信号的实部
24         double* pImageOut);            // 输出信号的虚部
25 
26     // 获取输入信号的功率谱
27     static void ConvertToPowerSpectral(
28         unsigned int nSamples,        // 样本数量
29         unsigned int nShorts,        // 短时点数
30         const double* pRealIn,        // 输入信号
31         double* pDataOut            // 输出的功率谱
32         );
33 
34     // 获取输入信号的对数功率谱
35     static void ConvertToLogPowerSpectral(
36         unsigned int nSamples,        // 样本数量
37         unsigned int nShorts,        // 短时点数
38         const double* pRealIn,        // 输入信号
39         double* pDataOut            // 输出的对数功率谱
40         );
41 
42     // 获取输入信号的倒谱
43     static void ConvertToCepStrum(
44         unsigned int nSamples,        // 样本数量
45         unsigned int nShorts,        // 短时点数
46         const double* pRealIn,        // 输入信号的
47         double* pDataOut            // 输出的倒谱
48         );
49 
50     // 对输入的8位信号,转化为double类型序列
51     static void ConvertToDoubleMono(
52         const byte* pDataIn,        // 输入样本序列
53         unsigned int nCount,        // 样本数量
54         double* pDataOut            // 输出double类型序列
55         );
56 
57     // 对输入的16位信号,转化为double类型序列
58     static void ConvertToDoubleMono(
59         const int* pDataIn,                // 输入样本序列
60         unsigned int nCount,        // 样本数量
61         double* pDataOut            // 输出double类型序列
62         );
63 
64     // 对输入的8位信号,转化为双声道double序列
65     static void ConvertToDoubleStereo(
66         const byte* pDataIn,                // 输入样本序列
67         unsigned int nCount,        // 样本数量
68         double* pDataOutLeft,        // 输出左声道double类型序列
69         double* pDataOutRight        // 输出右声道double类型序列
70         );
71 
72     // 对输入的16位信号,转化为双声道double序列
73     static void ConvertToDoubleStereo(
74         const int* pDataIn,                // 输入样本序列
75         unsigned int nCount,        // 样本数量
76         double* pDataOutLeft,        // 输出左声道double类型序列
77         double* pDataOutRight        // 输出右声道double类型序列
78         );
79 
80     // 对输入信号进行抽样
81     static void ConvertToSample(
82         const double* pDataIn,            /*输入样本序列*/
83         unsigned int nCount,        /*输入样本数量*/
84         double* pDataOut,            /*输出抽样样本*/
85         unsigned int nWinSize        /*抽样窗口宽度*/
86         );
87 
88     // 对输入信号进行截取
89     static void GetData(
90         const double* pDataIn,        // 输入样本序列
91         unsigned int nCount,        // 输入样本数量
92         unsigned int nStart,        // 起始下标
93         unsigned int nLen,            // 截取长度
94         double* pDataOut            // 截取后的序列
95         );
96 };

posted @ 2005-08-01 21:02  海南K.K  阅读(2291)  评论(0)    收藏  举报