【Matlab】基于A律13折线的PCM语音编解码系统(GUI设计、simulink、附完整代码)

【Matlab】PCM语音编解码


一.绪论

1.1 研究背景

   随着信息技术的高速发展,现代通信技术,尤其是语音信号处理技术已经在日常生活中得到十分广泛的运用,如无线通信,军事通信,蓝牙通信等一系列专用通信系统等。而在语音信号处理的过程中十分重要的一环便是压缩编码技术,可分为三类:波形编码,参数编码及混合编码等。其中以脉冲编码调制(即PCM,Pluse Code Modulation)为代表的波形编码在语音信号处理的过程中应用最为广泛,是数字通信系统发展的一次飞跃。

1.2 PCM技术的研究现状

  脉冲编码调制的概念是1937年由法国工程师AlecReeres最早提出来的。随着集成电路技术的飞速发展,超大规模集成电路的PCM编、解码器出现,使它在光纤通信、数字微波通信、卫星通信、信号处理、军事及民用电子技术领域发挥着越来越重要的作用。PCM是一种将模拟语音信号进行数字化的技术,同时也是语音波形编码的一种。目前广泛应用于通信、计算机、数字仪表、遥控遥测等领域,其应用广度和深度也在不断地扩展和深化。随着全球数字化、信息化的不断推进,脉冲编码调制会有更加良好的发展、应用前景。

  在语音通信中,通常采用8位的PCM编码就能够保证满意的通信质量。典型电话信号的抽样频率是8000Hz。故在采用这类非均匀量化编码器时,典型的数字电话传输比特率为64 kb/s。

  在计算机应用中,能够达到最高保真水平的就是PCM编码,被广泛用于素材保存及音乐欣赏,CD、DVD以及我们常见的 WAV文件中均有应用。因此,PCM约定俗成了无损编码,因为PCM代表了数字音频中最佳的保真水准,并不意味着PCM就能够确保信号绝对保真,PCM也只能做到最大程度的无限接近。要算一个PCM音频流的码率是一件很轻松的事情,采样率值×采样大小值×声道数 bps。一个采样率为44.1KHz,采样大小为16bit,双声道的PCM编码的WAV文件,它的数据速率则为 44.1K×16×2 =1411.2 Kbps。我们常见的Audio CD就采用了PCM编码,一张光盘的容量只能容纳72分钟的音乐信息。

1.3 研究内容

  本次设计针对PCM的编解码及其特点进行探究,并基于MATLAB对PCM通信系统进行仿真,其研究内容主要有以下几个部分:
①利用Matlab编写PCM编解码相关函数程序,并调用PCM编解码函数,分别以一个正弦波和鸟的语音信号作为输入信号,实现仿真,验证PCM编解码的正确性。
②采用Matlab中的Simulink进行PCM编解码仿真,噪声影响与性能分析。
③采用GUI界面操作完成语音输入,PCM编码,PCM解码,语音还原输出等一系列操作。此处调用①中的程序进行上述功能的实现。


二. PCM编解码的基本原理

2.1 PCM语音编码原理

  通常我们把从模拟信号抽样、量化,直到变换成为二进制符号的基本过程,称为脉冲编码调制,简称脉码调制。PCM编码的过程,实际上就是将一个语音信号进行“抽样-量化-编码”的一个过程。它是将模拟信号变换成二进制信号的一种常用方法。PCM编码的具体步骤如下:
  ①对模拟信号按信号自身的频率特点(如正弦信号依据采样定理以其信号带宽2倍以上的频率提取抽样值,语音信号依据其自身的频率Fs,为精确表示信号,一般要保留10kHz以下的频谱成分,G.711标准中规定PCM的抽样频率为8kHz)进行抽样
  ②对该模拟信号的各个抽样值进行量化,其实质是能够用数字量来表示在时域上离散的各个抽样值。在该过程中,会因为量化精度而产生量化误差,量化精度越高自然量化误差也就越小。而常用的量化方式有均匀量化和非均匀量化两种。
  由于在均匀量化时,由量化器信噪比公式(S/N)=M可得量化器的信噪比随着量化电平数M的增加而显著提高,当小信号输入时,量化间隔也会变小,其量化噪声的平均功率也会变小,此时小信号量噪比便难以达到要求;而由于语音信号中小电压出现的概率较大,并且非均匀量化噪声对大小信号的影响大致相同,因此采用非均匀量化来改善语音信号中小信号的量噪比。
  在PCM语音编码中,主要是对抽样值先进行压缩再进行均匀量化来实现非均匀量化,并通常采用8位PCM编码来保证PCM编解码系统的通信质量。
  ③在PCM编码中,一般采用A压缩律进行对抽样值的压缩,即具有如下式特性的压缩律:
在这里插入图片描述

  其中y表示归一化压缩器的输出电压,x表示归一化压缩器的输入电压,A为压扩系数,在不同国家的标准值A的取值也不尽相同,我国和欧洲地区普遍采用A=87.56的A压缩律(即13折线律),它使得曲线在原点附近的斜率等于16,使16段折线简化成只有13段,且每一段转折点前后A律曲线的斜率比值为1/2,而PCM的8位量化编码中就便用到了这一特性,其特性曲线如下图2-1所示:
在这里插入图片描述

图2-1 A律13折线律的特性曲线

  在13折线律中采用的折叠码有8位。其中第一位c1表示量化值的极性正负。后面的7位分为段落码和段内码两部分,用于表示量化值的绝对值。其中第2至4位(c2 c3 c4)是段落码,共计3位,可以表示8种斜率的段落;其他4位(c5 ~ c8)为段内码,可以表示每一段落内的16种量化电平。段内码代表的16个量化电平是均匀划分的。所以,这7位码总共能表示27 = 128种量化值。在下面的表2-1中给出了段落码和段内码的编码规则。

表2-1 段落码和段内码的编码规则

在这里插入图片描述
  在上述编码方法中,虽然段内码是按量化间隔均匀编码的,但是因为各个段落的斜率不等,长度不等,故不同段落的量化间隔是不同的。其中第1和2段最短,斜率最大,其横坐标x的归一化动态范围只有1/128。再将其等分为16小段后,每一小段的动态范围只有(1/128)  (1/16) = 1/2048。这就是最小量化间隔,后面将此最小量化间隔(1/2048)称为1个量化单位。第8段最长,其横坐标x的动态范围为1/2。将其16等分后,每段长度为1/32。假若采用均匀量化而仍希望对于小电压保持有同样的动态范围1/2048,则需要用11位的码组才行。现在采用非均匀量化,只需要7位就够了。

  如下图所示为PCM编码的原理框图,它首先在编码器中由冲激脉冲对模拟信号抽样,得到在抽样时刻上的信号抽样值。这个抽样值仍然是模拟量。在它量化之前,通常用保持电路将其作短暂保存,以便电路有时间对其进行量化。
  在实际电路中,常把抽样和保持电路作在一起,称为抽样保持电路。图2-2中的量化器把模拟抽样信号变成离散的数字量,然后在编码器中进行二进制编码。这样,每个二进制码组就代表一个量化后的信号抽样值。常用的编码方法有逐次比较法等等。常用的二进制码有自然二进制码及折叠二进制码等。

在这里插入图片描述

图2-2 PCM编码的原理框图

2.2 PCM语音解码原理

  接收端实现PCM解码的原理框图如图2-3所示,其主要原理为逐次比较A/D转换。
decode

图2-3 PCM解码原理框图

  在此图中,本地译码器的记忆电路得到输入c7值后,使恒流源产生为下次比较所需要的权值电流Iw。在编码器输出c8值后,对此抽样值的编码已经完成,所以比较器要等待下一个抽样值到达,暂不需要恒流源产生新的权值电流。
  在接收端的译码器中,仍保留本地译码器部分。由记忆电路接收发送来的码组。当记忆电路接收到码组的最后一位c8后,使恒流源再产生一个权值电流,它等于最后一个间隔的中间值。由于编码器中的比较器只是比较抽样的绝对值,本地译码器也只是产生正值权值电流,所以在接收端的译码器中,最后一步要根据接收码组的第一位c1值控制输出电流的正负极性。由此接收端可得到PCM的语音解码。


三.软件设计

3.1信号产生与采样

  信号产生与采样部分的代码如图3-1所示(正弦波)。由奈奎斯特采样定理结合所产生的信号的频率(2000Hz)确定信号的采样频率要大于4000Hz,此处选取的信号采样频率为8000Hz,代码和信号采样前后对比分别如图3-1和图3-2所示。此处选用max函数来计算信号采样后幅度的极值,为之后PCM编码过程中的量化做准备。
在这里插入图片描述

图3-1 正弦波信号产生与采样代码

在这里插入图片描述
图3-2 正弦波信号采样前后对比图

3.2 PCM编码

  PCM编码的程序设计采用调用PCM编码函数的方法来实现。该编码函数分为三个部分:采样信号的量化,段落码判断和段内码判断,分别如图图3-4,图3-5及图3-6所示。通过如图3-7所示程序调用,结果如图3-8所示。
在这里插入图片描述

图3-4 PCM编码函数中采样信号的量化部分


在这里插入图片描述
图3-5 PCM编码函数中段落码判断部分


在这里插入图片描述
图3-6 PCM编码函数中段内码判断部分


在这里插入图片描述

图3-7 PCM编码程序调用

在这里插入图片描述

图3-8 正弦信号PCM编码结果

3.3 PCM解码

  根据PCM解码的相关原理,可设计出PCM解码函数如图3-9所示,调用代码如图3-10所示,解码效果图如图3-11所示。
在这里插入图片描述

图3-9 PCM解码函数


在这里插入图片描述
图3-10 PCM解码程序调用

在这里插入图片描述
图3-11 PCM解码输出与原输入对比图

3.4 PCM编解码的Simulink实现

  由PCM编解码原理,可设计出如图3-12所示的PCM编解码系统。
在这里插入图片描述

图3-12 PCM编解码系统示意图

  在图3-12中,我们以一个幅值为1,频率为1Hz的正弦波为例,先通过量化模块将正弦波量化,然后将量化后的信号通过对其进行编码,译码和解码,并设置其采样8位2进制编码,3位2进制解码,随后将解码过后的信号通过一个低通滤波器,滤除其中的高频噪声,从而将原来量化过后的信号在[0,1]区间上进行进行还原。
在这里插入图片描述

图3-13 PCM编解码系统输入设置示意图

在这里插入图片描述

图3-14 PCM编码模块设置示意图

在这里插入图片描述

图3-15 PCM解码模块设置示意图

在这里插入图片描述

图3-16 PCM编解码输出示意图

3.5 PCM编解码的GUI实现

  此处采用GUI界面操作完成语音输入,PCM编码,PCM解码,语音还原输出,界面如图3-17所示,语音输入与语音还原输出后的对比图如图3-18所示。语音输入部分采用matlab内部自带的鸟叫声作为输入。
在这里插入图片描述

图3-17 PCM通信系统的GUI设计界面

在这里插入图片描述

图3-18 语音输入与PCM语音还原输出后的对比图


四.性能分析

4.1 具体信号分析

  此处主要对该信号进行失真度分析的测试,如图3-19所示。可得到失真度的大小为0.002321,说明对应具体信号而言,PCM编解码后的输出信号还原度较高。
分析

图3-19 信号失真度测试代码

4.2 语音信号分析

  根据图3-19所示程序,同样可以得到该语音信号的失真度为0.018,说明多频率混合信号的PCM编解码输出信号还原度比单频信号要略低。


附录代码

.m文件说明:
编解码函数:
pcmcoding,pcmdecoding
运行顺序:
xinhaocaiyang
pcmbianma
pcmjiema
analysis
推荐直接GUI操作
project3e100.m是设计GUI界面的,直接点project3e100.fig就好了

注:simulink.slk是2018版的matlab编写的,要运行的话需要用2018以上的matlab版本

编码函数(pcmcoding.m)
function code=PCMcoding(S)
    z=sign(S);                               
    MaxS=max(abs(S));                          
    S=abs(S/MaxS);                            %对采样信号S进行归一化
    Q=2048*S;                                 %对采样信号S进行量化,分为2048个区间,
                                              %采样13折线律作为压缩律进行非均匀量化
    code=zeros(length(S),8);                  %代码存储矩阵(全零)
    
    % 段落码判断程序
    for i=1:length(S)
        if (Q(i)>=128)&&(Q(i)<=2048)
            code(i,2)=1;            %对段位码的第一位进行判断
        end
        if (Q(i)>32)&&(Q(i)<128)||(Q(i)>=512)&&(Q(i)<=2048)
            code(i,3)=1;            %对段位码的第二位进行判断
        end
        if (Q(i)>=16)&&(Q(i)<32)||(Q(i)>=64)&&(Q(i)<128)||(Q(i)>=256)&&(Q(i)<512)||(Q(i)>=1024)&&(Q(i)<=2048)
            code(i,4)=1;            %对段位码的第三位进行判断
        end
    end
    
    %段内码判断程序
    N=zeros(length(S));                
    for i=1:length(S)
        N(i)=bin2dec(num2str(code(i,2:4)))+1;  %判断该量化值所在的段位
    end
    a=[0,16,32,64,128,256,512,1024];                 
    b=[1,1,2,4,8,16,32,64];                          
    for i=1:length(S)  
        q=ceil((Q(i)-a(N(i)))/b(N(i)));  %求段内码(10进制)
        if q==0
            code(i,(5:8))=[0,0,0,0];                 
        else k=num2str(dec2bin(q-1,4));  %进行段内码10进制与2进制之间的转换
            code(i,5)=str2num(k(1));
            code(i,6)=str2num(k(2));
            code(i,7)=str2num(k(3));
            code(i,8)=str2num(k(4));
        end
        if z(i)>0                         %判断编码的正负(8位码组的第1位)
            code(i,1)=1;
        elseif z(i)<0
            code(i,1)=0;
        end                                           
    end
    code = reshape(code', 1, []);
end

解码函数(pcmdecoding.m)
function s=PCMdecoding(encode, max)
    encode=(reshape(encode',8,length(encode)/8))'; %对码元进行重组,每8个为一组
    l=size(encode,1);
    a=[0,16,32,64,128,256,512,1024];   %量化区间
    b=[1 1 2 4 8 16 32 64];            %段落量化间隔
    c=[0 1.5:15.5];                    %段内量化间隔
    for i=1:l
        x=encode(i,1);
        T=bin2dec(num2str(encode(i,(2:4))))+1;   %2进制与10进制之间转换,求所在段(10进制)
        Y=bin2dec(num2str(encode(i,(5:8))));     %2进制与10进制之间转换,求段内所在位置(10进制)
        if Y==0
            k(i)=a(T)/2048;
        else
            k(i)=(a(T)+b(T)*c(Y))/2048;
        end
        if x==0
            s(i)=-k(i);
        else
            s(i)=k(i);
        end
    end
    s = s*max;
end
信号采样(xinhaocaiyang.m)
clear;clc;
T=0.0005;
t=-0.01:T:0.01;
fs=10000;    %取采样频率为10000Hz
sdt=1/fs;
t1=-0.01:sdt:0.01;
xt=sawtooth(2*pi*50*t)+sawtooth(2*pi*100*t);
st=sawtooth(2*pi*50*t1)+sawtooth(2*pi*100*t1);
maximum = max(abs(st));

% 原始信号
figure;
subplot(2,1,1);plot(t,xt);title('原始信号');grid on;
subplot(2,1,2);stem(t1,st,'.');title('抽样信号');grid on;

PCM编码(pcmbianma.m)
pcm_encode = PCMcoding(xt);
figure;
stairs(pcm_encode);
axis([0 200 -2 2]);
title('PCM 编码');
grid on;
PCM解码(pcmjiema.m)
pcm_decode = PCMdecoding(pcm_encode, maximum);

figure;
subplot(2,1,1);plot(t, pcm_decode);
title('PCM 译码');grid on;

subplot(2,1,2);plot(t,xt);
title('原始信号');grid on;

结果分析(analysis.m)
da=0; 
for i=1:length(t)
    dc=(xt(i)-pcm_decode(i))^2/length(t);
    da=da+dc;
end
fprintf('失真度是:%.6f\n',da);
GUI(project3e100.m)

GUI设计网上教程很多,这里贴1张效果图。
在这里插入图片描述
左侧的PCM只是完成解码过程,输出需点击“PCM正弦波输出”按钮。
完整工程文件已上传到博客资源当中。


已标记关键词 清除标记
张德丰 (2010). "MATLAB/Simulink建模与仿真." 书名:MATLAB/Simulink建模与仿真(MA 作者:张德丰 出版社:电子工业出版社 原价:42.00 出版日期:2009年06月 ISBN:9787121089862 字数: 页数:364页 印次: 版次:第1版 纸张:平装 开本:16 商品标识:asinb002g1y1ho 编辑推荐 《MATLAB/Simulink建模与仿真》是张德丰编著的,由电子工业出版社出版。 内容提要 《MATLAB/Simulink建模与仿真》系统介绍了MATLAB/Simulink的建模与仿真。结合MATLAB/Simulink的使用,通过典型示例,阐述了MATLAB/Simulink建模与仿真在通信和自动系统中的应用。共分8章,包括MATLAB介绍、MATLAB界面设计Simulink仿真环境、MATLAB/Simulink建模与仿真、时/频域分析法、模拟及数字通信系统的建模与仿真、经典/现代/智能控制系统设计与仿真、MATLAB/Simulink仿真与建模在实际中的应用等。 目录 第1章 MATLAB介绍 1.1 MATLAB相关简介 1.1.1 MATLAB发展历程 1.1.2 MATLAB软件的特点 1.1.3 MATLAB组成 1.2 MATLAB操作界面 1.2.1 MATLAB主窗口 1.2.2 MATLAB命令窗口 1.2.3 MATLAB工作窗口 1.2.4 当前目录窗口和搜索路径 1.2.5 命令历史窗口 1.2.6 Start菜单 1.3 MATLAB的示例 1.3.1 命令行程序 1.3.2 MATLAB绘图 1.3.3 M文件 1.3.4 GUI举例 1.3.5 Simulink系统仿真 1.4 MATLAB数值计算 1.4.1 MATLAB的数值类型 1.4.2 MATLAB的矩阵运算 1.5 关系运算及逻辑运算 1.5.1 关系运算符与逻辑运算符 1.5.2 运算符优先级 1.5.3 关系和逻辑函数 1.5.4 关系与逻辑运算示例 1.6 符号运算 1.7 MATLAB常用绘图命令 1.8 MATLAB程序设计 1.8.1 程序类型 1.8.2 程序流程控制 1.8.3 程序设计原则 第2章 MATLAB界面设计 2.1 MATLAB图形用户界面设计 2.1.1 图形用户界面简介 2.1.2 图形用户界面对象的结构 2.1.3 启动图形用户界面 2.1.4 布局编辑器 2.1.5 GUIDE模板介绍 2.2 创建图形用户界面 2.2.1 图形用户界面的设计原则 2.2.2 图形用户界面创建 2.3 GUI编程 2.3.1 GUI的M文件 2.3.2 GUI的控制响应编程 2.3.3 使用GUI句柄结构 2.4 GUI示例 第3章 Simulink仿真环境 3.1 简介 3.2 Simulink的应用 3.2.1 Simulink运行方法及其编辑窗口 3.2.2 Simulink功能 3.2.3 Simulink仿真设置 3.3 Simulink模块库 3.3.1 连续(Continuous)模块库 3.3.2 非连续(Discontinuous)模块库 3.3.3 离散(Discrete)模块库 3.3.4 数学运算(Math Operations)模块库 3.3.5 接收器(Sinks)模块库 3.3.6 输入源(Sources)模块库 3.4 Simulink功能模块的处理 3.4.1 Simulink模块参数设置 3.4.2 Simulink模块基本操作 3.4.3 Simulink模块间连线处理 3.5 Simulink模型示例 3.5.1 模型操作 3.5.2 模型创建 3.6 Simulink模型调试 3.6.1 图形调试器基础 3.6.2 使用图形调试器调试模型 3.6.3 使用命令行方式调试模型 3.7 子系统与模块封装技术 3.7.1 子系统 3.7.2 封装模块 3.7.3 自定义模块库 3.8 S函数 3.8.1 S函数基本概念 3.8.2 S函数工作原理 3.8.3 用M文件编写S函数 3.8.4 用C MEX文件编写S函数 3.8.5 S函数创建器的使用 3.9 Simulink模型的实时代码生成 3.9.1 Real-Time Workshop介绍 3.9.2 Simulink模型的一般实时程序生成方法与示例 3.9.3 Simulink模型实时代码生成方法与示例 第4章 MATLAB/Simulink建模与仿真 4.1 MATLAB编程仿真的方法 4.1.1 简介 4.1.2 静态系统MATLAB仿真 4.1.3 连续动态系统MATLAB仿
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 猿与汪的秘密 设计师:白松林 返回首页