音频信号处理——音频矢量化

音频信号处理——音频矢量化

标签(空格分隔): 音频处理


一、简介

矢量量化(VQ,Vector Quantization)是一种极其重要的基于块编码规则的有损数据压缩方法。广泛应用于语音编码、语音识别和语音合成等领域。事实上,在 JPEG 和 MPEG-4 等多媒体压缩格式里都有 VQ。它的基本思想是:将若干个标量数据组构成一个矢量,然后在矢量空间给以整体量化,从而压缩了数据而不损失太多信息。

在以前,VQ运用的一个难点在于它要要解决一个多维积分(multi-dimensional integration)的问题。后来,在1980年,Linde, Buzo和Gray(LBG,这个缩写也是LBG算法的命名)提出一种基于训练序列的VQ设计算法,对训练序列的运用绕开了多维积分的求解,使得世上又诞生了一种经典的被世人称为LBG-VQ的算法!

二、VQ

VQ 是一种近似逼近,类似于将 double 转化为二进制的 Int。举个例子,可以看我的地图,中国有很多的城市,如果一一列举会很长,但是我们有省啊。一提海淀肯定是北京,于是数据就被压缩了。

VQ问题可以这样描述:给定一个已知统计属性的矢量源(也就是训练样本集,每一个样本是一个矢量)和一个失真测度。还给定了码矢的数量(也就是我们要把这个矢量空间划分为多少部分,或者说量化为多少种值),然后寻找一个具有最小平均失真度(数据压缩,肯定是失真越小越好)的码书(所有码矢的集合,也就是上面的那些省的省会)和空间的划分(图中所有省的边境)。

设训练样本的训练序列(训练集)为 T=x1,x2,...,xM ,M 为训练样本(矢量源)的个数。

如果 M 足够大,那么训练集就会包含数据源的所有统计特性。设矢量是 K 维:

xm=xm,1,xm,2,...,xm,k,m1,2,...,M

假设码矢的数目是 N (有N个省),码书表示为 C=c1,c2,...,cN 。每个码矢是 k 维向量为cn=(cn,1,cn,2,...,cn,k),n1,2,...,N

与码矢 cn 对应的编码区域为 Sn ,然后将空间的划分为: P=S1,S2,...,SN (S 为省)。

如果源矢量 xm Sn 内,那么其近似 Q cn(省会),

Q(xm)=cn,ifxmSn

假设采用均分误差失真度量(也可以用其他),那么平均失真度表示如下:

D=1Mkm=1MxmQ(x_m)2
其中 e2

于是乎,VQ 问题就是:

给定T(训练集)和N(码矢数目),找到能使D(平均失真度)最小的C(码书)和P(空间划分)。

四、优化标准

如果 C P是上面最小化问题的最优解,则解的应满足以下两个条件:

4.1 最近邻条件(Nearest NeighboCondition):

Sn={x:xcn2xcn2,n=1,2,...,N}

即城市离哪个省会进,就属于哪个省(这和显示生活不大一样,大家明白这个意思就好了)。那如果到每个省会距离一样怎么办?在边界处怎么划分呢?就用决策方法(any tie-breaking procedure)。

4.2 质心条件(Centroid Condition):

cn=xmSnxmxm1,n=1,2,...,N

这个条件要求码矢 cn 是编码区域 Sn 内所有的训练样本向量的平均向量。在实现中,需要保证每个编码区域至少要有一个训练样本向量,这样上面这条式的分母才不为0。

五、LBG 算法

LBG 是一个迭代算法,对训练序列的运用绕开了多维积分的求解,他的迭代过程就是交替调整 P C,满足上面两个条件并使失真度不断地趋向于它的局部最小值。像其他的迭代算法一样,LBG需要一个初始的码书 C0 。这个初始码书可以通过分裂(splitting)方法得到。这个方法主要是把一个初始码矢设置为所有训练样本的平均值。然后把这个码矢分裂成两个(分裂的方式见下面的LBG算法的第3步的公式,只要是乘以一个扰乱系数)。把这两个码矢作为初始的码书,然后迭代算法就在这个初始的码书上面跑。它每一次都将每个码矢分裂为2个,重复这个过程,直到获得要求的码矢个数。1个分裂为2个,2个分裂为4个,4个分裂为8个……

算法流程

1、给出训练集 T ,并给出固定的失真阈值ε, ε 为一个极小的正数。

2、先让 N=1 (码矢数量),将这一个码矢设置为所有训练样本的平均值:

c1=1Mm=1Mxm

然后计算总失真度:
D=1Mkm=1Mxmc12

3、分裂:对 i=1,2,...,N ,码矢为:

c0i=(1+ε)cic0N+i=(1ε)ci

使 N=2N ,就是每个码矢分裂(乘以扰乱系数1+ɛ和1-ɛ)为两个,这种每一次分裂后的码矢数量就是前一次的两倍。

4、迭代
1)对于训练集 T 中的每一个训练样本m=1,2,,M。在所有码矢中寻找的 D 最小值,也就是看这个训练样本和哪个码矢距离最近。我们用n记录这个最小值的索引。然后用这个码矢来近似这个训练样本:

Q(xm)=cin

2)对于n=1,2,…,N,通过以下方式更新所有码矢:

ci+1n=Q(xm)=cinxmQ(xm)=cin1

也就是将所有属于 cn 所在的编码区域 Sn 的训练样本取平均作为这个编码区域的新的码矢。

3)迭代计数器加1:i=i+1.

4)计算在现阶段的C和P基础上的总失真度:

Di=1Mkm=1MxmQ(xm)2

5)如果前后两次失真度的差值与上次失真度的比值大于 ε ,则系统继续迭代。如果小于 ε ,则系统停止迭代。

Di1DiDi1>ε

6)得到当前 N 下的最优码矢:

5、重复步骤3和4至到码矢的数目达到要求的个数。

六、程序分析:

coming soon

七、参考资料:

[1]http://www.data-compression.com/vq.html

[2]漫谈Clustering (番外篇): Vector Quantization: http://blog.pluskid.org/?p=57

[3] lbgvq.c — C program forLBG VQ design

[4] http://blog.csdn.net/zouxy09/article/details/9153255

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值