语音报告

语音报告

语音信号处理专题报告 (

语音报告

题 目:最佳矢量量化器码本设计 学 院

语音报告

:信息工程学院 专 业:电子信息工程 学生姓名 学 号 班 级:电子09-2班

二 〇 一 二 年 六 月

一、摘要

矢量量化技术是一种极其重要的信号压缩方法。本报告主要介绍适量量化的一些基本概念,以及最佳矢量量化器码本的设计方法。

二、关键词

矢量量化 矢量量化器 最佳矢量量化器 最佳矢量量化器码本设计

三、概述

(1)矢量量化

矢量量化是70年代后期发展起来的一种数据压缩技术

1、基本思想:将若干个标量数据组构成一个矢量,然后在矢量空间给以整体量化,从而压缩了数据而不损失多少信息。矢量量化技术是七十年代后期发展起来的一种数据压缩和编码技术 ,广泛应用于语音编码、 语音合成、 语音识别和说话人识别、 图像压缩等领域。矢量量化的基本原理是:将若干个标量数据组成一个矢量 (或者是从一帧语音数据中提取的特征矢量 )在多维空间给予整体量化 ,从而可以在信息量损失较少的情况下压缩数据量。矢量量化有效地应用了矢量中各元素间的相关性 ,因此可以有比标量量更好的压缩效果。一般来说矢量维数越大量化越优越。

2、矢量量化原理:若干个标量数据组成一个矢量,矢量量化是对矢量进行量化,和标量量化一样,它把矢量空间分成若干个小区域,每个小区域寻找一个代表矢量,量化时落入小区域的矢量就用这个代表矢量代替,或者叫被量化为这个代表矢量。

1

3、矢量量化的关键之处:首先设计一个好码本。关键在于如何划分J个区域边界。这需要大量的输入信号矢量,经过统计实验才能确定,这个过程称为“训练”或“学习”。

应用聚类算法,按照一定的失真度准则(失真测度),对训练的数据进行分类,从而把训练数据在多维空间中划分成一个以码字为中心的胞腔,常用的是LBG算法来实现。

未知矢量的量化。按照选定的失真度准则(失真测度),把未知矢量,量化为失真度最小的码字。

4、矢量量化的失真测度:失真测度 (距离测度 )是将输入矢量用码本重构矢量来表征时所产生的误差或失真的度量方法它可以描述两个或多个模型矢量间的相似程度。失真测度的选择好坏将直接影响到聚类效果和量化精度 ,进而影响到语音信号矢量量化处理系统的性能。,最常用的失真测度是欧氏距离测度.

欧式距离测度

K维特征矢量:

Xi={xi1 , xi2 , ?? , xiK}

Yj={yj1 , yj2 , ?? , yjK}

均方误差欧式距离

语音报告

2

(2)矢量量化器

1、矢量量化器的定义

维数为k,码本长度为J的矢量量化器Q定义为:从k维欧几里德空间Rk到一包含J个输出(重构)点的有限集合C的映射, Q:Rk→C,其中C={y1 ,y2 ,? ,yJ}

Yi 属于 Rk,i=1,?,J

集合C称作码本或码书,码本长度为J 。

码本的J个元素称作码字或码矢量,它们均为Rk中的K维矢量。

2、根据VQ定义及给定的失真测度,定义VQ量化器为

语音报告

(3)最佳矢量量化器 最佳矢量量化器的概念

语音报告

根据最佳矢量量化器速率的两种定义,分别引出两种最佳矢量量化器的概念。也就是在两个不同的条件下,分别得到最小失真的矢量量化器。

(1) 给定矢量量化器的码书大小N,求最小是真

3

式中Qx

语音报告

为所有码书大小为N的K维矢量量化器的集合。

(2) 给定矢量量化器的输出熵限制R,求最小是真

语音报告

(4)最佳矢量量化器码本设计

所谓最佳设计,就是从大量信号样本中训练出好的码本;从实际效果出发寻找到好的失真测度定义公式;用最少的搜索及计算失真的运算量。

最佳码本的设计,就是在一定条件下,使得d(X,Y)的统计平均最小。 最佳码本设计原则

4

最佳码本设计原则需满足以下两个必要条件:

1 、最佳划分:对给定的码书,根据最邻近准则,找出所有码书矢量的最佳区域边界,对信号空间进行最佳划分:对于任意一个矢量X如果它与矢量Yi的失真小于它和其它码字之间的失真,则X应属于某区域边界Si。

2 、最佳码书:对给定的区域边界Si ,寻找出最佳码书Yi ,使码书的平均失真最小,码字Yi是Si中所有矢量的质心(形心)。

LBG算法是一种递推算法,从一个事先选定的初始码本开始迭代。 1 、把训练序列按照码本中的元素根据最邻近准则分组.

2 、对每一分组找质心,得到新的码本 ,又作为初始码本. 3 、再进行分组,重复上述过程,直到系统性能(总失真D)满足要求和不再有明显的改进为止。

语音报告

5

下面给出基于平方误差测度和训练矢量集的LBG 算法具体步骤: 步骤1: 给定初始码书

代次数m = 0,平均失

语音报告

步骤2:用码书 C (m)中的各码字作为质心,根据最佳划分原则把训练矢量集X 划分为M

语音报告

个子集

下式应成立

语音报告

:

步骤3:计算总畸变

语音报告

: 。 即当X ? 时,,令 ,给定的相对门

语音报告

判断相对误差是否满足

语音报告

:

若满足, 则停止算法, 码书C (m)就是所求的码书;否则,转步骤4 步骤 4: 根据最佳码书条件,计算新码字, 即

语音报告

:

由这个新质心

语音报告

,

置 m = m + 1, 转步骤2。

初始码书的选择影响码书训练的收敛速度和最终码书的性能. 传统的初始码书生产方法有两种:一种为分裂法,一种是随机选择法。 6 形成新码书C( m+ 1),

 

第二篇:语音信号实验三报告

实验三 电话拨号音的合成与识别

班级: 学号:

一、实验目的

本实验基于对电话拨号音合成与识别的仿真实现,主要涉及到电话拨号音合成的基本原理及识别的主要方法,利用 MATLAB 软件以及 FFT 算法实现对电话拨号音的合成与识别。并进一步利用 MATLAB 中的图形用户界面 GUI 制作简单直观的模拟界面。使其对电话拨号音的合成与识别有个基本的了解。能够利用矩阵不同的基频合成 0 - 9 不同按键的拨号音,并能够对不同的拨号音加以正确的识别,实现由拨号音解析出电话号码的过程。进一步利用 GUI 做出简单的图形操作界面。要求界面清楚,画面简洁,易于理解,操作简单。从而实现对电话拨号音系统的简单的实验。

二、基本要求

1.掌握数字信号处理的基本概念、基本理论和基本方法;

2.学会MATLAB的使用,掌握MATLAB的程序设计方法;

3.掌握在Windows环境下对语音信号采集的方法;

4.掌握用MATLAB实现电话拨号音的合成与识别的方法;

三、实验内容

双音多频 DTMF( Dual Tone Multi-Frequency )信号,是用两个特定的单音频率信号的组合来代表数字或功能。在 DTMF 电话机中有 16 个按键,其中 10 个数字键 0 — 9 , 6 个功能键 * 、 # 、 A 、 B 、 C 、 D 。其中 12 个按键是我们比较熟悉的按键,另外由第 4 列确定的按键作为保留,作为功能键留为今后他用。 根据 CCITT 建议,国际上采用 697Hz 、 770Hz 、 852Hz 、 94lHz 低频群及 1209Hz 、 1336Hz 、 1477Hz 、 1633Hz 高频群。从低频群和高频群任意各抽出一种频率进行组合,共有 16 种组合,代表 16 种不同的数字键或功能,每个按键唯一地由一组行频和列频组成,如下表所示。

语音信号实验三报告

利用 MATLAB 软件能够利用矩阵不同的基频合成 0 - 9 不同按键的拨号音,并能够对不同的拨号音加以正确的识别,实现由拨号音解析出电话号码的过程。进一步利用MATLAB 中的图形用户界面GUI 做出简单的图形操作界面。从而实现对电话拨号音系统的简单的实验仿真。

四、实验步骤

(1)图形电话拨号面板的制作

利用 GUI 图形用户界面设计工具制作电话拨号面板,把 DTMF 信号和电话机的键盘矩阵对应起来。其中选用我们熟悉的 10 个数字键 0 — 9 , 2 个功能键“ * ”、“#”,另外为了仿真方便,添加信号识别键和复位键。每个按键可用

语音信号实验三报告

( Push Button )添加。

最终利用 GUI 图形用户界面设计工具生成的图形电话拨号面板用于拨号音的合成产生部分,

如下图所示。这里将其保存为Untitle.fig文件。

语音信号实验三报告

(2)DTMF 信号的产生合成

现在将对上节制作的图形电话拨号面板上的各控件单位的动作和变化进行设置,即对Untitle.m 文件进行编辑。其主要的功能是使对应的按键,按照表中的对应关系产生相应的拨号音,完成对应行频及列频的叠加输出。此外,对于图形界面的需要,还要使按键的号码数字显示在拨号显示窗口中。

鉴于 CCITT 对 DTMF 信号规定的指标,这里每个数字信号取 1000 个采样点模拟按键信号,并且每两个数字之间用 100 个 0 来表示间隔来模拟静音。以便区别连续的两个按键信号。间隔的静音信号也是在按键时产生的。

以按键 0 为例,简单介绍拨号音产生的过程:

按键 0 的响应函数

function varargout = pushbutton0_Callback(h, eventdata, handles, varargin)

n=[1:1000]; % 每个数字 1000 个采样点表示

d0=sin(0.7217*n)+sin(1.0247*n); % 对应行频列频叠加

n0=strcat(get(handles.edit1,'string'),'0'); % 获取数字号码

set(handles.edit1,'string',n0); % 显示号码

space=zeros(1,100); %100 个 0 模拟静音信号

global NUM

phone=[NUM,d0];

NUM=[phone,space]; % 存储连续的拨号音信号

wavplay(d0,8192); % 产生拨号音

程序解释:

NUM 为定义的全局变量,用于存储连续的拨号音( DTMF )信号,包括数字信号音以及静音信号。

d0=sin(0.7217*n)+sin(1.0247*n)

中的行频与列频是由表 1 中 0 键对应的

fL?941Hz,fH?1336Hz

计算得出,已知声音取样频率

fs?8192Hz

则取样后

?L?2?fL/fs?0.7217,?H?2?fH/fs?1.0247

语音信号实验三报告

按公式

大值与最小值:

语音信号实验三报告

对于保留的两个功能键“ * ”、“#”,按照现行键盘式拨号电话的习惯,将“ * ”作为删除键,“#”作为确认键。“ * ”删除键的作用是将前面拨错的号码删除退回,表现为将显示窗口已经显示的错误号码退回一位数字,并且将连续拨号音信号的存储单元 NUM 中退回一位拨号音信号和静音信号。删除可以进行连续的操作。“#”确认键的作用是将前面拨过的号码进行确认保留,意味着此时连续拨号音信号的存储单元 NUM 中的信号即为最后用于识别的连续拨号音 DTMF 信号,并在显示窗口中显示“#”号作为标记。

删除键的响应函数

function varargout = pushbuttonback_Callback(h, eventdata, handles, varargin) n=[1:1000];

num=get(handles.edit1,'string'); l=length(num);

n11=strrep(num,num,num(1:l-1)); %去掉末尾号码在面板上的显示 d11=sin(0.7217*n)+sin(0.9273*n); set(handles.edit1,'string',n11); global NUM L=length(NUM);

NUM=NUM(1:L-1100); %删除末尾号码在拨号音信号中的存储 wavplay(d11,8192);

语音信号实验三报告

fs?8192Hz可以计算数字键相应的角频率最

(3)DTMF 信号的检测识别

要实现电话拨号音( DTMF )信号的检测识别,可以通过直接计算付里叶变换得到输入信号的组成频率。这里采用 FFT 算法对信号进行解码分析。首先对接收到的数字信号作 FFT 分析,计算出其幅频谱,进而得到功率谱,组成输入信号的频率必定对应功率谱的峰值。对于连续的双音多频( DTMF )信号,需要把有效的数字拨号信号从静音间隔信号中分割提取出来,然后再用 FFT 算法对信号进行解码分析。

DTFM信号的最小周期为40ms,取采样周期为8KHz,每个周期至少采样0.04*8000=320点。DTMF解码器计算采样序列的DFT,从给定的8个基本频中找出与结果最接近的频率。DFT的长度N决定了DFT样本的位置和计算该样本所用时间直接的间隔。对8KHz的采样率,人们发现检测八个基本DTMF音调的DFT长度N的最佳值为205,表中给出N=205是最接近的音调频率的DFT指标k。

语音信号实验三报告

MATLAB实现信号音识别的与程序如下:

varargout = pushbuttonNUM_Callback(h, eventdata, handles, varargin) global NUM

wavplay(NUM,8192);

L=length(NUM);

n=L/1100;

number='';

for i=1:n

j=(i-1)*1100+1;

d=NUM(j:j+999); % 截取出每个数字

f=fft(d,2048); % 以 N=2048 作 FFT 变换

a=abs(f);

p=a.*a/10000; % 计算功率谱

num(1)=find(p(1:250)==max(p(1:250))); % 找行频

num(2)=300+find(p(300:380)==max(p(300:380))); % 找列频

if (num(1) < 180) row=1; % 确定行数

elseif (num(1) < 200) row=2;

elseif (num(1) < 220) row=3;

else row=4;

end

if (num(2) < 320) column=1; % 确定列数

elseif (num(2) < 340) column=2;

else column=3;

end

z=[row,column]; % 确定数字

if z==[4,2] tel=0;

elseif z==[1,1] tel=1;

elseif z==[1,2] tel=2;

elseif z==[1,3] tel=3;

elseif z==[2,1] tel=4;

elseif z==[2,2] tel=5;

elseif z==[2,3] tel=6;

elseif z==[3,1] tel=7;

elseif z==[3,2] tel=8;

elseif z==[3,3] tel=9;

end

t(i)=tel;

c=strcat(number,int2str(tel));

number=c;

i=i+1;

end

set(handles.edit3,'string',number);

程序解释:

确定行频和列频的数值范围是通过计算得出的:已知输入信号的取样频率fs=8192Hz,而做FFT的N=2048,则频谱分辨率为F=fs/N=8192/2048=4Hz,由此可算出频谱图上任意点对应的频率K=f/F。例如,数字8的高、低端频率为fl=852Hz,fh=1336Hz,则在谱图上对应的点Kl=fl/F=213,Kh=fh/F=334。

相关推荐