应用VQ的说话人识别系统|Matlab实现

VQ(矢量量化)

参考文献

  1. http://www.data-compression.com/vq.shtml
  2. 语音信号处理之(三)矢量量化(Vector Quantization)
  3. 《语音信号处理(C++版)》_赵力
  4. 《数字语音处理及MATLAB仿真》_张雪英

定义

VQ定义

失真测度

  • 定义
    将输入矢量X_i用码本重构矢量Y_j来表征时所产生的误差的度量方法。
    \begin{aligned} &D=E[d(X,Q(X))]\\ &Y=Q(x)\\ \end{aligned}

其中,E[\cdot]表示求期望。

欧氏距离测度

设未知模式的K维特征矢量为X,与码本中某个K维码矢Y进行比较,x_iy_i分别表示同一维分量(0\leq i\leq K-1),有几种常用欧氏距离测度:

  • 均方误差
    d_2(X,Y)=\frac1K\sum_\limits{i=1}^{K}(x_i-y_i)^2

  • r方平均误差
    d_r(X,Y)=\frac1K\sum_\limits{i=1}^{K}(x_i-y_i)^r

  • r平均误差
    d_r'(X,Y)=[\frac1K\sum_\limits{i=1}^{K}(x_i-y_i)^r]^{\frac1K}

  • 绝对值平均误差
    d_1(X,Y)=\frac1K\sum_\limits{i=1}^{K}|x_i-y_i|

  • 最大平均误差
    d_M(X,Y)=\max\limits_{1\leq i\leq K} [x_i-y_i]

  • 加权欧氏距离测度
    采用不加权的欧氏距离而对特征矢量的各个分量进行预加重
    d(X,Y)=\frac1K\sum_\limits{i=1}^{K}\omega(i)(x_i-y_i)^2

\omega(i)是加权系数,常用的值如下表示:
\left\{ \begin{aligned} \omega(i)& = i \\ \omega(i)& = i^{2s},\quad0\leq s\leq 1 \\ \omega(i)& = 1+(1+k)\sin[\pi i(k+4)/2] \end{aligned} \right.

线性预测失真测度

特别适用于线性预测模型,并用最大似然准则推导出来,所以特别适用于LPC参数描述语音信号的情况。


线性预测失真测度

相关的线性失真测度还包括以下两种:

  • 对数似然比失真测度
    d_LLR(f,f')=\ln(\frac{\sigma_P'^2}{\sigma^2})=\ln(\frac{a'^TRa'}{a^TRa})

  • 模型失真测度
    d_m(f,f')=\frac{\sigma_P'^2}{\sigma^2}-1=\frac{a'^TRa'}{a^TRa}-1

以上2种失真测度的局限性在于:只比较了两个矢量的功率谱,而没有考虑能量信息。

识别失真测度

在功率谱的基础上,考虑了能量信息
d(f,E)=d(f,f')+\alpha g(|E-E'|)

式中,EE'为输入信号及码矢的归一化能量,\alpha为加权因子,g(x)可以按下式选取:
g(x)=\left\{ \begin{aligned} & 0,\quad & x\leq x_d \\ & x,\quad & x_F\geq x>x_d \\ & x_F,\quad & x>x_F \end{aligned} \right.

g(x)的意义:当两个矢量的能量接近时,忽略能量引起的影响;当能量相差较大时,则进行线性加权;当能量超过门限x_F时,则为某一固定值。参数\alphax_Fx_d要经过实验来确定。

矢量量化器

  • 设计
    根据最小失真的方法设计
    \alpha(X)=i\Leftrightarrow d(X,Y_i)\leq d(X,Y_j)\quad\forall j\in I_N

式中,I_N=\{1,2,...,N \}

矢量量化原理
  • 传输速率
    每个样值(每维)平均编码所需的比特数。


    矢量量化器传输速率的定义

\bigstar核心算法

  • 问题设计
    给定T(训练集)和N(码矢数目),找到能使D_ave(平均失真度)最小的C(码书)和P(空间划分)。关键问题是如何划分量化空间和确定量化矢量。

    问题设计

  • 优化准则


    优化准则

下面是C(码书)和P(空间划分)相互迭代优化的过程:

最佳划分


最佳码书

递推算法——LBG

简介

LBG算法可以用于已知信源分布特性的场合,也可以用于未知信源分布特性,但要知道它的一列输出值(训练序列)。对于说话人识别来说,由于语音难以准确得到多维概率分布,所以通常使用训练序列来设计矢量量化器。

给定训练序列来设计量化器的步骤

已知训练序列的设计算法

流程图

流程图

初始码书的选定与空胞腔的处理

初始码书的选定与空胞腔的处理

根据上图中的分裂法得到的具体过程:

初始码书基于分裂法开始
  • 疑点
    为什么计算总失真度的时候,分母是Mk,即,不仅要对样本个数取均值,还要对样本维数取均值?

改进环节

对失真测度的探讨,码书的设计,各种矢量量化系统的研究及快速搜索算法的寻找。

Matlab实现

矢量量化编码器块将每个输入列向量与码本矩阵中的码字向量进行比较。这个码本矩阵的每一列都是一个码字。块查找最接近输入列向量的码字向量并返回其从零开始的索引。此块支持所有输入端口上的浮点和定点信号。

image.png

根据《数字语音处理及MATLAB仿真》_张雪英P121页内容做些改动,此程序完成对一段语音的码本求解,输入数据是原始波形,应该稍作改进,比如更改为MFCC或LPCC等参数;也许是过于简单,码本迭代次数niter始终是2;欢迎大家指正交流:
https://gitee.com/zhouwenjun2020/Speaker-Verification-Algorithm/tree/master/VQ/%E7%A0%81%E6%9C%AC%E7%94%9F%E6%88%90

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。