您的当前位置:首页正文

基于MATLAB的语音信号PCM编译码实现

2024-06-29 来源:步旅网
基于MATLAB的语音信号PCM编译码实现

论文编码:

(小四号楷体居右)

首都师范大学

本科生毕业论文(设计)

基于MATLAB的语音信号PCM编译码实现 The implementation of PCM Coding and Encoding of Speech Signal Based on MATLAB

院 系 物理系 专 业 光电信息 年 级 2010级 学 号 1100600113 指导教师 何敬锁 论文作者 童 刚 完成日期

- 1 -

基于MATLAB的语音信号PCM编译码实现

首都师范大学本科生毕业论文(设计)原创性承诺书

论文(设计)题目 基于MATLAB的语音信号PCM编译码实现 学生姓名 童刚 专业 光电信息 学号 1100600113 完成时间 年 月 日~ 年 月 日 指导教师姓名 何敬锁 职 称 副教授 承诺内容: 1、本毕业论文(设计)是学生 在导师 的指导下独立完成,凡涉及其他作者的观点和材料,均作了注释,如出现抄袭及侵犯他人知识产权的情况,愿按学校有关规定接受处理,并承担相应责任。 2、学校有权保留并向上级有关部门送交本毕业论文(设计)的复印件和磁盘。 备注: 学生签名: 时间: 说明:学生毕业论文(设计)如有保密等要求,请在备注中明确,承诺内容第条即以备注为准.

- 0 -

2基于MATLAB的语音信号PCM编译码实现

中文提要

本设计主要内容是使用MATLAB模拟仿真语音信号的PCM编译码。

本设计使用的工具是MATLAB,因为MATLAB是流行于科学计算的软件工具,在数学类科技应用软件中首屈一指,在信号处理方面功能强大。现在的数字传输系统都是采用脉冲编码调制(PCM)体系,是一种对连续变化的模拟信号进行抽样、量化和编码产生数字信号.

首先介绍了MATLAB与PCM,模拟信号的抽样、量化、编码和译码原理,然后完成这四个过程的系统设计,最后使用MATLAB进行模拟仿真,并对其结果进行分析总结.在本设计中,采用A率13折线法对已抽样在时间上离散的模拟信号进行量化,然后使用自定义的编码函数和译码函数对量化电平进行编译码,后经过滤波器得到还原的模拟信号,完成语音信号PCM编译码系统。

关键词:MATLAB;A率;PCM;编译码

- 1 -

基于MATLAB的语音信号PCM编译码实现

Abstract

The main content of this design is implementation the PCM codec of speech signal based on The tool used in this design is MATLAB. MATLAB is a popular software for scientific computing。

MATLAB.

It is a great tool in Math and a powerful tool in signal processing. The signal in digital transmission systems are mostly coding by pulse code modulation (PCM) at this time. PCM is a way to convert the analog signal into digital signal by three steps: sampling, quantization, and coding。

Firstly in this paper, it will introduce the MATLAB and Pulse Code Modulation。 The principle of Sampling, Quantization, Coding, and Decoding will be shown. Then it will design the whole system. Finally, accomplish the simulation of the system in MATLAB.

And, quantify by A law of 13 lines method, coding and encoding by user-defined functions,

recover the signal with filter.

Key words: MATLAB; A law; PCM, Codec

- 2 -

基于MATLAB的语音信号PCM编译码实现

目 录

第1章 MATLAB及PCM简介……………………………………… 1

1。1 MATLAB介绍……………………………………………… 1 1.2 PCM介绍 ………………………………………………… 1

第2章 设计原理………………………………………………… 2

2.1 抽样……………………………………………………… 2 2.2 量化……………………………………………………… 2

2。2。1 均匀量化…………………………………………… 2 2.2.2 非均匀量化………………………………………… 2

2。3 编码……………………………………………………… 3 2.4 译码……………………………………………………… 4

第3章 MATLAB程序设计………………………………………… 5

3。1 流程图设计 …………………………………………… 5 3.1.1 系统主程序流程设计………………………… 5 3.1。2 PCM编码程序流程设计………………………… 5 3。1。3 PCM译码程序流程设计………………………… 5 3.2 Simulink仿真设计……………………………………… 6 3.2.1 系统主程序设计………………………………… 6 3。2。2 PCM编码模块设计……………………………… 8 3.2.3 PCM译码模块设计……………………………… 10

第4章 系统仿真的结果及其分析……………………………… 12

4。1 正弦信号的仿真及结果分析 ………………………… 12 4.1。1 仿真…………………………………………… 12 4。1。2 结果分析……………………………………… 14 4。2 Uniform Random Number信号的仿真及结果分析…… 14

参考文献 ……………………………………………………… 18

- 3 -

基于MATLAB的语音信号PCM编译码实现

致谢 …………………………………………………………… 18

第1章 MATLAB及PCM简介

1.1 MATLAB介绍

MATLAB是 MATrix LABoratory的缩写,是一款由美国MathWorks公司出品的商业数学软件。MATLAB是一种用于算法开发,数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境。除了矩阵运算、绘制函数/数据图像等常用功能外,MATLAB还可以用来创建用户界面及与调用其他语言(包括C、C++和FORTRAN)编写的程序。

MATLAB还有为数众多的附加工具箱,以使MATLAB适合不同领域的应用,例如图像处理、信号处理与通信等。此外,还有一个配套软件包Simulink,提供一个可视化开发环境,常用与系统模拟、动态、嵌入式系统开发等方面。

在本设计中,主要是应用Simulink搭建系统,用MATLAB编写编码函数和译码函数。

1.2 PCM介绍

PCM全称为:Pulse Code Modulation,中文名为脉冲编码调制。是一种模拟信号的数字化方法。PCM信号是模拟信号经过抽样、量化、编码三个步骤而产生的。

抽样,就是按照一定的规律从模拟信号中获取一定数量的取样信号.通常按照抽样定理确定抽样频率 ,即抽样频率应不小于信号最大频率

的2倍。

量化,就是把抽取出来的取样信号按一定规律使之在信号幅值上离散。一般分为两种方法:均匀量化和非均匀量化。本设计中采用非均匀量化中的A率13折线法进行量化。

编码,就是把经量化的量化电平通过一定的方法转化为二进制码。此二进制码有两种形式:自然二进制码,折叠二进制码.由于折叠二进制码可用于双极性电压编码,而且较前者在小电压处误码影响更小。而在语音传输中,语音信号出现小电压的概率大,故本设计中使用折叠二进制码进行编码。

- 4 -

基于MATLAB的语音信号PCM编译码实现

第2章 设计原理

2。1 抽样(Sampling)

所谓抽样,是指对在时间上连续的模拟信号按照一定的方法取得一部分模拟信号的数据。通常是等间隔地抽取信号瞬时幅度值,获得在时间上离散的模拟信号。理论上,抽样的过程可以看作是周期性单位冲激脉冲与模拟信号相乘,得到与脉冲信号等周期,幅值为该时刻模拟信号的幅值与脉冲信号幅值的乘积.但实际上,使用周期性窄脉冲代替冲激脉冲与模拟信号相乘。

用获得的在时间上离散的模拟信号,在一定的条件只下,我们可以恢复原始的模拟信号。该条件就是满足抽样定理。即若一个连续的模拟信号

的周期性冲激脉冲对它抽样时,

也就是说恢复原信号的条件是:

中的最高频率小于

则以间隔时间

将被这些抽样值所完全确定。

即抽样频率应不小于的2倍。这一最低抽样速率称为奈奎斯特(Nyquist)速率。与此

相对应的最大抽样间隔称为奈奎斯特间隔。

2。2 量化(Quantization)

经过抽样后信号成为在时间上离散的信号,但由于在幅值上是非离散的,故该信号仍称为模拟信号。为了将该模拟信号变为数字信号,需要通过一定的处理,使其在幅值上离散。此过程称为量化。

在不同的需求下,量化的方法不同。一般分为两大类:均匀量化和非均匀量化。

2.2。1 均匀量化

均匀量化是指,将模拟信号取样值的取值范围等间隔地划分为若干个区间,每个区间对应一个量化电平。如:信号幅值范围为

,若划分为两个区间,则为

每个区间取不同的量化电平值。一般为区间中点所对应的电平值。

- 5 -

基于MATLAB的语音信号PCM编译码实现

2。2。2 非均匀量化

在非均匀量化时,量化间隔随信号取样值得不同而变化的。通常先对信号取样值进行压缩处理,再进行均匀量化

为了让不同的信号强度保持信号量噪比恒定,在理论上要求压缩特性满足:

但是由于此公式在公式进行修正,使之当

时,时,

。因此应当对该。

国际电信联盟(International Telecommunication Union, ITU)制订了两种建议:A压缩率和μ压缩率,以及相应的近似算法:13折线法和15折线法.我国则采用A率13折线法。

A压缩率是指符合下式的对数压缩规律:

式中:x为压缩器归一化输入电压,y为压缩器归一化输出电压,A为常数,它决定压缩程度。一般A取87.6.下面表格是A率(其中A=87。6)与13折线法的比较:

表 1:A压缩率(A=87。6)与13折线法的比较

8 0 0 7 1/128 6 1/64 5 1/32 4 1/16 3 1/8 2 1/4 1 1/2 0 1 1 A率的x值 13折线法的1/128 1/60。6 1/30.6 1/15.4 1/7.79 1.3.93 1/1.98 由上表可知,13折线法与A=87.6时的A率十分接近.

2。3 编码(Coding)

经过量化后信号变成了离散的数字信号,接下来就是对该信号进行编码。最常用的编码是对于PCM编码来说,有两种编码方法:自然二进制码和折叠二进制码。后者可用于双极性

将其转化为二进制信号,也就是所谓的脉冲编码调制(Pulse Code Modulation, PCM). 电压编码,而且较前者在小电压处误码影响更小。而在语音传输中,语音信号出现小电压的

- 6 -

基于MATLAB的语音信号PCM编译码实现

概率大,故使用折叠二进制码进行编码。

在这里,将采用十三折线法、折叠二进制码。首先将电平范围按十三折线法分成13段.然

用于表示所在段落号(即段落码),

后每段都均匀量化,且每段16个量化间隔。在十三折线法中的折叠码共有8位.第一位表示量化值的极性正负(即符号位),第二位至第四位即后面四位

表示所在段落的16个量化电平(即段内码):

表 2:段落码、段内码的确定

段落码 段落序号 8 7 6 5 4 3 2 1 111 110 101 100 011 010 001 000 段落码 段内码 量化间隔 15 14 13 12 11 10 9 8 1111 1110 1101 1100 1011 1010 1001 1000 段内码 量化间7 6 5 4 3 2 1 0 段内码 隔 段落范围 0111 0110 0101 0100 0011 0010 0001 0000

2。4 译码(Decoding)

经过以上步骤,原模拟信号已经处理成二进制信号,每个量化电压都转换为8位二进制码。译码就是将这些8为二进制码还原成十进制的量化电压。其步骤正好与编码相反.

- 7 -

基于MATLAB的语音信号PCM编译码实现

第3章 MATLAB程序设计

3。1 流程图设计

3。1。1 系统主程序流程设计

开始 信号源 抽样 量化 PCM编码 PCM译码 结束

3.1。2 PCM编码程序流程设计

输入 判断正负,确定符号位c1 确定段落号、段落码 确定段内号、段内码 输出

3。1。3 PCM译码程序流程设计

输入 判断符号位c1,确定电平正负 根据段落码,确定所在段落及其初始电平值 根据段内码,确定该电平与该段初始电平的差值 根据上面得到的数据确定电平值 输出 - 8 -

基于MATLAB的语音信号PCM编译码实现

3.2 Simulink仿真设计

3.2.1 系统主程序设计

图 错误!未定义书签。:系统结构图

对于这个系统,主要包含三大模块:信号源、信号处理模块、显示模块。其中信号处理模块分为四个小模块:抽样、量化、编码、译码。

信号源:

图 错误!未定义书签。:信号源

抽样模块:

图 1:抽样模块

- 9 -

基于MATLAB的语音信号PCM编译码实现

量化模块及编码模块:

图 2:量化及编码模块

译码模块:

图 3:译码模块

显示模块由两部分组成。第一部分是输出图,包含原始信号、滤波器输出信号。第二部分

是抽样过程图,包含原始信号、抽样信号,及抽样图。

图 4:显示模块

- 10 -

基于MATLAB的语音信号PCM编译码实现

3.2.1 PCM编码模块设计

此模块是由自定义的函数构成。本着简化代码的原则,减少了比较的次数。下面介绍具体根据电平的正负确定符号位signCode:

表 3:PCM码的确定

区间 方法。

[0,16) - 1 000 1 0 0 0000 8 1000 [16,[32,[64,32) 4 2 001 1 0 1 0001 9 1001 64) 5 3 010 2 1 2 0010 10 1010 128) 6 4 011 4 2 3 0011 11 1011 :段落号、[128,256) 7 5 100 8 3 4 0100 12 1100 [256,512) 8 6 101 16 4 5 0101 13 1101 [512,1024) [0124,2048) 9 7 110 32 5 6 0110 14 1110 10 8 111 64 6 7 0111 15 1111 (间隔、

:段落起始值、:段落码、:段内码)

:该段最小量化:段内量化间隔号、、段落码

分析表格可以得到: ⑴、段落号

:

⑵、段落起始值

⑶、每段的最小量化间隔

:

⑷、段内量化间隔号

、段内码

:

- 11 -

基于MATLAB的语音信号PCM编译码实现

利用以上公式即可获得PCM码的符号位、段落码、段内码.那么就可以得到量化电压u所对应的PCM码。需要注意的是在量化电平为2048时,上表中没有相应的信息,且不符合满足上述公式,故将其的PCM码修正为

下面就是实现这一过程的MATLAB程序。 %%

输入u为量化后的电压,y为量化电压u所对应的PCM码

function y = PCMCode(u) %%

获取符号位signCode

if u〈0

signCode = 1; else

signCode = 0; end

u = abs(u); %% 获取段落码paraCode

% 确定段落号

if u〈16 paragraphIndex = 1;

else

paragraphIndex = ceil ( log2(u) – 3); end

% 确定段落码

paraCode = bitget ( int8(paragraphIndex – 1), 3: -1: 1);

%% 获取段内码inParaCode

% 该段最小量化间隔interval ( 其可取值[1, 1, 2, 4, 8, 16, 32,% 该段段落起始值beginValue ( 其可取值[0 , 16, 32 ,64 ,128, 256,2048] )

if paragraphIndex ==1 interval = 1;

beginValue = 0;

- 12 -

] ) , 1024, 64 512基于MATLAB的语音信号PCM编译码实现

else

interval = pow2(paragraphIndex – 2);

beginValue = pow2(paragraphIndex +2); %beginValue = interval* 16

end

% 确定段内量化间隔号

inParagraphIndex = floor ( ( u – beginValue) / interval ); % 确定段内码

inParaCode = bitget ( int 8(inParagraphIndex), 4: -1: 1); %%

获得PCM码

y = zeros( 8, 1); y(1,1) = signCode; y(2:4,1) = paraCode; y(5:8,1) = inParaCode; if u==2048

y(2:8,1)=[1,1,1,1,1,1,1]; end

3.2.2 PCM译码模块设计

%% 输入u为PCM码,是一个有8个二进制码的数组;输出y是还原的量化电压

function y = PCMDecode(u)

for n=1:8 % 确定量化电压的正负sign if u(1)==0 sign = 1; else

sign = -1; end

% 确定所在段落号

paragraphIndex = u(2)*4 + u(3)*2 + u(4) +1; %段落序号是从1开始的 % 确定所在段落的起始值beginValue、所在段落的最小量化间隔interval

if paragraphIndex ==1 beginValue = 0;

interval = 1;

- 13 -

基于MATLAB的语音信号PCM编译码实现

else

beginValue = pow2(paragraphIndex+2); interval = pow2(paragraphIndex—2);

% beginValue = interval* 16

end

% 确定所在段内量化间隔号inParagraphIndex:

inParagraphIndex = u(5)*8 + u(6)*4 + u(7)*2 + u(8); % 确定该量化电平值与所在段落起始值的差值 toBeginValue: toBeginValue = interval * inParagraphIndex; % 确定该量化电平值value

value = sign * (beginValue + toBeginValue); % 获得归一化电压 y = value/2048;

end end

- 14 -

基于MATLAB的语音信号PCM编译码实现

第4章 系统仿真的结果及其分析

4。1 正弦信号的仿真及结果分析

4。1。1 仿真

参数设置1:

信号源 脉冲产生器 量化器 低通滤波器 幅频率周期抽样间相移量增益(Gain) 带宽值 (rad/sec) (s) 隔(s) (s) (rad/sec) 1 1*pi 2 1 0。3 2048 1*pi

信号图:

图 5:抽样过程图

- 15 -

基于MATLAB的语音信号PCM编译码实现

图 6:输出图

参数设置2:

信号源 幅频率周期(s) 2 脉冲产生器 抽样间隔(s) 1.5 相移量(s) 0。3 2048 量化器 增益(Gain) 低通滤波器 带宽(rad/sec) 1*pi 值 (rad/sec) 1

1*pi 信号图:

图 7:抽样过程图

- 16 -

基于MATLAB的语音信号PCM编译码实现

图 8:输出图

参数设置3:

信号源 脉冲产生器 量化器 低通滤波器 幅频率周期抽样间相移量增益(Gain) 带宽值 (rad/sec) (s) 隔(s) (s) (rad/sec) 1 1*pi 2 0.5 0。3 2048 1*pi 信号图:

图 错误!未定义书签。:抽样过程图

- 17 -

基于MATLAB的语音信号PCM编译码实现

图 9:输出图

4。1.2 结果分析

根据图7至图12可知,抽样频率不得低于信号最高频率的2倍,即满足抽样定理。只要

参数设置正确,可以还原出原始信号。

4。1 Uniform Random Number信号的仿真及结果分析

在这里需要将原信号源Signal Generator模块换成Uniform Random Number模块,URN模

块产生的是模拟信号,该模拟信号在一定时间间隔内电平保持不变。接下来进行参数设置:

信号源 Minimum /Maximum -1/1

脉冲产生器 Sample 抽样间time 隔(s) d 相移量(s) 0 量化器 增益(Gain) 2048 低通滤波器 带宽(rad/sec) 100 seed 0 0.1 - 18 -

基于MATLAB的语音信号PCM编译码实现

图 10:输出图(d=0。1)

图 错误!未定义书签。:输出图(d=0.01)

图 11:输出图(d=0.001)

由图13至图15可知,抽样频率小于信号最高频率的2倍,还原的信号会失去原有信息.当满足抽样定理后,抽样频率越高,信号还原程度越高,误差越小.

4。1 混合信号的仿真及结果分析

在这里,把正弦信号为基带信号,URN信号为调制信号的信号加到系统中。此时信号源为:

- 19 -

基于MATLAB的语音信号PCM编译码实现

相关参数设置 Signal Generator Amplitude Frequency (rad/sec) 1 1*pi 0 1 0 3 0。1 0 2048 2*pi URN Minimum Maximum seed Sample time Pulse Generator 量化器 低通滤波器 Period(secs) Phase(secs) Gain Passband edge frequency(rad/s) 原信号图与滤波器输出信号:

- 20 -

基于MATLAB的语音信号PCM编译码实现

根据上图可知,存在着一定的时间延迟,经过多次实验,发现适当增大滤波器的带宽可以

减小此延迟量,在这里不进行深究。但是可以看出信号已基本能够还原。

- 21 -

基于MATLAB的语音信号PCM编译码实现

参考文献

[1] 樊昌信,曹丽娜.通信原理(第六版)[M].北京:国防工业出版社,2007。

[2] 李探员,任宏,刘小宝。基于Simulink的脉冲编码调制系统设计[J].膜科学与技术,2011(4):59-64。 [3] 周春梅.语音压缩编码PCM[J].硅谷,2012(4):37.

[4] 程菊花。基于MATLAB的PCM调制系统的仿真和分析[J]。浙江传媒学院学报,2005(3):25-27。 [5] 吴四清,熊钢。基于Simulink的采样定理建模与仿真[J].信息通信,2008(6):31-32.

[6] 王安红,孙志毅,李志宏.PCM编解码器的软件实现[J]。太原重型机械学院学报,2004(12):290—293.

致谢

行文至此,我的这篇论文已接近尾声.在论文的写作过程中遇到了不少艰难险阻,都在同学和老师的帮助下度过了.首先向我的指导老师何敬锁表示衷心的感谢,感谢何老师在很多方面都给予了很大的帮助。同时本文参考了数位学者的研究文献,如果没有各位学者的研究成果的帮助和启发,我将很难完成这边论文的写作.最后,向互联网上的各位无私学者们提供的各种资料,给我的论文增添了许多色彩。

由于本人学术水平有限,所写论文难免有不足之处,恳请各位老师和同学批评指正!

- 22 -

因篇幅问题不能全部显示,请点此查看更多更全内容