语音特征参数分析平台(六) 矢量量化

四、矢量量化:
这里讨论的是K-means聚类,取码本的容量为4。

1、CVQ类的功能:
1)进行K-means聚类
2)计算两个码本的欧式距离

2、CVQ类的设计

 1 //////////////////////////////////////////////////////////////////////////
 2 // 采用改进LBG算法,实现输入序列的矢量量化
 3 // 
 4 // 创建人:        陈文凯
 5 // 创建日期:    2005-06-07
 6 // 修改人:
 7 // 修改日期:
 8 
 9 // 默认的最大迭代次数
10 #define CVQ_MAX_REPEAT
11 // 无穷大
12 #define CVQ_MAXIMUN    50000
13 
14 class CVQ
15 {
16 public:
17     CVQ(void);
18     ~CVQ(void);
19 
20 public:
21     // 对输入样本进行简单聚类
22     static void EasyCluster(
23         const double* pInVector,        // 输入样本序列
24         unsigned int nInLen,            // 输入样本序列长度
25         double* pCodeBook,                // 输入/出码本
26         unsigned int nCodeNums            // 码本长度
27         );
28 
29     // 实现K均值聚类
30     static void KMeansCluster(
31         const double* pInVector,        // 输入样本序列
32         unsigned int nInLen,            // 输入样本序列长度
33         double* pCodeBook,                // 输出码本
34         unsigned int nCodeNums            // 码本长度
35         );
36 
37     // 对输入码本,按照标准码本进行分类
38     static void Classify(
39         const double* pInCodeBook,    // 输入码本
40         unsigned int nInNums,        // 输入码本中码字数量
41         const double* pCodeBook,    // 模板码本
42         unsigned int nCodeNums,        // 模板码本中码字数量
43         unsigned int* pKinds        // 输入码本中的码字对应的模板码本中码字的下标
44         );
45 
46     // 计算码本欧式距离
47     static double GetDistance(
48         const double* pCode1,
49         const double* pCode2, 
50         unsigned int nCodeNums
51         );
52 private:
53     // 实现K均值聚类迭代, 输出总畸变
54     static double KMeansClusterRepeat(
55         const double* pInVector,        // 输入样本序列
56         unsigned int nInLen,            // 输入样本序列长度
57         double* pCodeBook,                // 输入码本
58         unsigned int nCodeNums,            // 码本长度
59         unsigned int* pFlag,            // 用于分类的数组,再KMeansCluster中分配
60         double* pNewCodeBook            // 输出新码本
61         );
62 };

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