MATLAB——PCM编译码实验

news2024/12/28 4:44:26

目录

  • MATLAB——PCM编译码
    • 一、实验原理
      • 1.掌握PCM编码原理和译码原理
      • 2. 练习使用Matlab编程实现PCM编码和译码
      • 3. 了解失真度的概念,能对译码结果进行失真度分析
    • 二、实验原理
    • 三、实验要求
      • 1、用Matlab产生一模拟信号,如: 或者自己编写一信号,或者找某一语音信号……。
      • 2、在满足抽样定理要求下,对该信号进行抽样,用Matlab编程实现,画出抽样信号,并与原信号进行对比。
      • 3、对抽样信号进行PCM编码,用Matlab编程实现,画出编码波形(矩形脉冲、单极性不归零),并标出某个抽样值的8位编码结果。
      • 4、对经信道传输得到的PCM编码进行PCM解码,用Matlab编程实现,并画出解码波形。
      • 5、对解码结果进行失真度分析。
      • 6、(扩展练习)采用PCM编码,2PSK结合simulink实现语音信号(可使用Matlab自带的语音信号)的传输仿真。
    • 四、实验内容
      • 4.1用Matlab产生一模拟信号
      • 4.2画出抽样信号,并与原信号进行对比
      • 4.3对抽样信号进行PCM编码
      • 4.4 PCM解码
      • 4.5失真度分析
      • 4.6 simulink实现语音信号的传输仿真
    • 五、引用

MATLAB——PCM编译码

一、实验原理

1.掌握PCM编码原理和译码原理

2. 练习使用Matlab编程实现PCM编码和译码

3. 了解失真度的概念,能对译码结果进行失真度分析

二、实验原理

脉冲编码调制就是把一个时间连续,取值连续的模拟信号变换成时间离散,取值离散的数字信号后在信道中传输。脉冲编码调制就是对模拟信号先抽样,再对样值幅度量化,编码的过程。

抽样,就是对模拟信号进行周期性扫描,把时间上连续的信号变成时间上离散的信号,抽样必须遵循奈奎斯特抽样定理。该模拟信号经过抽样后还应当包含原信号中所有信息,也就是说能无失真的恢复原模拟信号。它的抽样速率的下限是由抽样定理确定的。
在这里插入图片描述

量化,就是把经过抽样得到的瞬时值将其幅度离散,即用一组规定的电平,把瞬时抽样值用最接近的电平值来表示,通常是用二进制表示。

量化误差,量化后的信号和抽样信号的差值。量化误差在接收端表现为噪声,称为量化噪声。 量化级数越多误差越小,相应的二进制码位数越多,要求传输速率越高,频带越宽。 为使量化噪声尽可能小而所需码位数又不太多,通常采用非均匀量化的方法进行量化。 非均匀量化根据幅度的不同区间来确定量化间隔,幅度小的区间量化间隔取得小,幅度大的区间量化间隔取得大。一个模拟信号经过抽样量化后,得到已量化的脉冲幅度调制信号,它仅为有限个数值。
在这里插入图片描述

在这里插入图片描述

编码,就是用一组二进制码组来表示每一个有固定电平的量化值。然而,实际上量化是在编码过程中同时完成的,故编码过程也称为模/数变换,可记作A/D。
为解决均匀量化时小信号量化误差大,音质差的问题,在实际中采用不均匀选取量化间隔的非线性量化方法,即量化特性在小信号时分层密,量化间隔小,而在大信号时分层疏,量化间隔大。在实际中使用的是两种对数形式的压缩特性:A律和μ律。

三、实验要求

1、用Matlab产生一模拟信号,如: 或者自己编写一信号,或者找某一语音信号……。

2、在满足抽样定理要求下,对该信号进行抽样,用Matlab编程实现,画出抽样信号,并与原信号进行对比。

3、对抽样信号进行PCM编码,用Matlab编程实现,画出编码波形(矩形脉冲、单极性不归零),并标出某个抽样值的8位编码结果。

4、对经信道传输得到的PCM编码进行PCM解码,用Matlab编程实现,并画出解码波形。

5、对解码结果进行失真度分析。

6、(扩展练习)采用PCM编码,2PSK结合simulink实现语音信号(可使用Matlab自带的语音信号)的传输仿真。

四、实验内容

4.1用Matlab产生一模拟信号

t=0:1/2000:0.1;
f=cos(100*pi*t)+2*sin(200*pi*t)+3*cos(300*pi*t);

plot(t,f);
xlabel('t');
title('f(t)的时域波形');

在这里插入图片描述

4.2画出抽样信号,并与原信号进行对比

clear;
clc;
T=0.0005;
t=-0.05:T:0.05;
fs=2000;
sdt=1/fs;
t1=-0.05:sdt:0.05;

% 原始信号
f=cos(100*pi*t)+2*sin(200*pi*t)+3*cos(300*pi*t);
%抽样信号
fs=cos(100*pi*t1)+2*sin(200*pi*t1)+3*cos(300*pi*t1);

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

在这里插入图片描述

4.3对抽样信号进行PCM编码

% 原始信号
f=cos(100*pi*t)+2*sin(200*pi*t)+3*cos(300*pi*t);
%抽样信号
fs=cos(100*pi*t1)+2*sin(200*pi*t1)+3*cos(300*pi*t1);
max = max(abs(fs));
% 原始信号

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



pcm_encode = PCMcoding(fs);
figure;
stairs(pcm_encode);%绘制信号的阶梯图
axis([0 328 -0.1 1.1]);
title('PCM 编码');axis([0 168 -0.1 1.1]);
set(gca,'xtick',[ 1 9  17 25 33 41 49 57 168]);
xticklabels({'1','9','17','25','33','41','49','57','168'})
grid on;

function code=PCMcoding(S)
    z=sign(S);                                %判断S的正负
    MaxS=max(abs(S));                         %求S的最大值 
    S=abs(S/MaxS);                            %归一化
    Q=2048*S;                                 %量化
    code=zeros(length(S),8);                  %PCM编码存储矩阵
    %%
    % 段落码判断程序
    for i=1:length(S)
        if (Q(i)>128)&&(Q(i)<=2048)
        code(i,2)=1;            %在第五段与第八段之间,段位码第一位都为"1"
        end
        if (Q(i)>32)&&(Q(i)<=128)||(Q(i)>512)&&(Q(i)<=2048)
        code(i,3)=1;            %在第三四七八段内,段位码第二位为"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;            %在二四六八段内,段位码第三位为"1"
        end
    end

    %%
    % 段内码判断程序
    N=zeros(length(S));                              
    for i=1:length(S)
        N(i)=bin2dec(num2str(code(i,2:4)))+1;        %找到code位于第几段,bin2dec将二进制整数的文本表示转换为双精度值,
    end

    a=[0,16,32,64,128,256,512,1024];                 %13折线各段起始对应的量化单位数
    b=[1,1,2,4,8,16,32,64];                          %除以16,得到每段的最小量化间隔
    for i=1:length(S)  
        q=ceil((Q(i)-a(N(i)))/b(N(i)));              %求出在段内的位置,ceil将 X 的每个元素四舍五入到大于或等于该元素的最接近整数
        if q==0
            code(i,(5:8))=[0,0,0,0];                 %如果输入为零则输出"0"
        else k=dec2bin(q-1,4);                       %将字符数组或字符串转换为数值数组,编码段内码为二进制,dec2bin将十进制整数转换为其二进制表示字符向量
            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
            code(i,1)=1;
        elseif z(i)<0
            code(i,1)=0;
        end                                        
    end

    code = reshape(code', 1, []);
end

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们选取观察的点是模拟信号中负值最大的点,同时也是抽样信号的第5个点。它的PCM编码结果应该是0111 1111,我们打开Workbench中pcm_encode,观察第33~40位。发现编码结果确实是0111 1111,符合编码逻辑,证明代码编写无误。

4.4 PCM解码

function s=PCMdecoding(encode, max)
    encode=(reshape(encode',8,length(encode)/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;
        Y=bin2dec(num2str(encode(i,(5:8))));
        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

在这里插入图片描述
通过原始信号与PCM编码译码后的对比可以看到能够比较好地重建出原始信号。通过下图能够更好得出对比的效果。
在这里插入图片描述

4.5失真度分析

在这里插入图片描述

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

pcm_encode = PCMcoding(fs);

pcm_decode = PCMdecoding(pcm_encode, max);
figure;
plot(t, pcm_decode);hold on
title('PCM 译码');grid on;
plot(t,f);
title('原始信号');grid on;


% 计算失真度
da=0; 
for i=1:length(t)
    dc=(f(i)-pcm_decode(i))^2/length(t);
    da=da+dc;
end
fprintf('失真度是:%.6f\n',da);

失真度我们认为是前后信号之间的均方误差,经过计算得到为:
失真度是:0.010716

4.6 simulink实现语音信号的传输仿真

首先我设计了一个2psk的编码模块,可以将单极性基带二进制码转换为2PSK信号。从Scope模块中我们可以得到Bernoulli Binary模块生成的随机二进制基带信号生成的2PSK波形,验证模块的正确性。

在这里插入图片描述
在这里插入图片描述
接下来我将之前编写的PCM编码和解码模块和2PSK模块结合起来,模拟语音信号编码、传输和解码过程。我使用了MATLAB自带的语音包crisp,可以发出鸟鸣的声音。
接下来我将之前编写的PCM编码和解码模块和2PSK模块结合起来,模拟语音信号编码、传输和解码过程。语音信号的选择我使用了MATLAB自带的语音包crisp,可以发出鸟鸣的声音。

load chirp % matlab自带语音信号
y1=[y,y];
x=y1(1:20000); %取前20000个采样点
sound(x,Fs);

接下来就是将语音信号进行传输的Simulink仿真了,simout就是经过传输的语音信号,但注意这是pcm八进制编码的形式,必须要进行解码,同时和原信号进行对比,验证传输的正确性。

在这里插入图片描述

%% 译码
demodata=simout(2:160001);
zz=pcm_decode(demodata,0.8);
figure;
subplot(1,1,1);
plot(zz);
title('译码的语音信号');
sound(zz,Fs);
%x是初始的语音信号矩阵
figure;
plot(x,'b');
hold on
%zz是译码得到的语音信号
plot(zz,'r');
legend('原语音信号','恢复的语音信号');
title('语音信号对比');

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、引用

[1]邢巨伟.模拟信号的数字化传输-PCM编码[J].黑龙江科技信息,2014(33):116.
[2]陈奎.语音PCM编码通信系统的SIMULINK仿真[J].福建电脑,2012,28(10):115-117.
[3]赵守彬,李鸿刚.利用Matlab实现PCM编码的A律13折线法量化[J].科技信息,2009(36):547.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/150316.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

“微综艺+虚拟场景”,蓝海创意云利用元宇宙技术撬动流量杠杆

1月1日&#xff0c;抖音微综艺节目“友问必答”2023新年直播盛大开幕&#xff0c;蓝海创意云利用vLive虚拟直播系统为此档节目搭建了专属的“元宇宙问答直播间”&#xff0c;整场直播观看人次突破 30W 人次&#xff0c;最高同时在线人数达 3W 人次&#xff0c;独特的直播形式和…

基于Spring+Mybatis框架的人事管理系统源码+数据库,含视频部署教程

人事管理系统 下载地址&#xff1a;基于SpringMybatis框架的人事管理系统源码数据库 部署说明&#xff1a; 项目启动后&#xff0c;在浏览器中访问地址&#xff1a;http://127.0.0.1:8080/personnel/ 由于很多同学反映部署有问题&#xff0c;所以我录了一个视频来演示一下&…

【Python爬虫项目实战】Python爬虫采集某外包平台数据保存本地

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录前言一、开发工具二、环境搭建三、数据来源查询分析四、代码实现1. 发送请求2.数据获取3.解析数据4. 保存数据总结前言 今天给大家介绍的是Python爬虫某外包平台数据…

架构设计---搜索引擎的原理

前言&#xff1a; 搜索引擎的倒排索引&#xff0c;数据的搜索与查找技术是计算机软件的核心算法&#xff0c;这方面已有非常多的技术和实践经验。而对于搜索引擎来说&#xff0c;要面对海量的文档进行快速的内容检索、查询的话&#xff0c;最主要的技术是倒排索引技术。 像百…

从0.5到4.0,OceanBase单机分布式一体化的技术演进|DTCC 2022

2022 年 12 月 14 日~16 日&#xff0c;由 IT168 联合旗下 ITPUB、ChinaUnix 两大技术社区主办的第 13 届中国数据库技术大会&#xff08;DTCC 2022&#xff09;在线上隆重召开。大会以“数据智能 价值创新”为主题&#xff0c;上百位技术领袖齐聚云端&#xff0c;进行多维度、…

信道模型:卫星→地面

这里写目录标题比较C. Loo模型&#xff1a;直射阴影&#xff0c;多径不阴影Corazza模型&#xff1a;直射和多径都阴影Lutz模型&#xff1a;好坏2个状态Rayleigh and Rician 信道生成Shadowed-Rician 直射径 散射径[Secure Transmission in Cognitive Satellite Terrestrial Net…

异常流量发现与分析案例

异常现象 NetInside流量分析系统在某教育平台监测过程中&#xff0c;5月14日发现明显的4次流量高峰&#xff08;其中第1-2次产生时间距离较近&#xff09;&#xff0c;详细出现时间如下图。 由上图分析看到&#xff0c;引起流量高峰的IP地址是58.129.247.149&#xff0c;下图…

数字孪生关键技术及其在电力行业应用场景

近年来&#xff0c;我国高度重视数字经济的发展&#xff0c;产业数字化升级战略正在推进中&#xff0c;引导数字经济与实体经济深度融合&#xff0c;促进经济高质量发展。数字孪生作为一项关键技术和提高效能的重要工具&#xff0c;可以有效发挥其在建模、数据采集、分析预测、…

前端组件库自定义主题切换探索-01-方案借鉴与思路参考

探索原因背景 首先自然是项目有需求&#xff0c;这是必须去做的原因 其次&#xff0c;是我们项目没有直接使用市面上现成的基于element-ui或者ant-design的第三方UI框架&#xff0c;比如avue&#xff0c;而是有着自己的UI组件库 第三&#xff0c;我们的组件库基于ant-design-v…

C++ stack和queque

Stack 一.有关stack介绍 stack是一种容器适配器&#xff0c;专门用在具有后进先出操作的上下文环境中&#xff0c;其只能从容器的一端进行元素的插入、提取或者删除操作。stack是作为容器适配器被实现的&#xff0c;容器适配器即是对特定类封装作为其底层的容器&#xff0c;并…

u盘格式化后数据能恢复吗?当然可以,5步恢复U盘数据

很多人都知道格式化U盘会清空里面的数据&#xff0c;虽然可以进行备份&#xff0c;但是一般我们都不会轻易格式化自己的U盘。但是遇到一些特殊情况&#xff0c;我们必须格式化U盘。u盘格式化后数据能恢复吗&#xff1f;当然可以。 只要你的原始数据没有被覆盖&#xff0c;没有…

新C++(4):模板

"抱紧你的我,比国王富有" C可复用性高&#xff0c;C引入了模板的概念&#xff0c;后面在此基础上&#xff0c;实现了方便开发的标准模板库STL -----前言 一、初始模板 我们先来看看 下面的代码段; 如果此时又有需求&#xff1a; 交换一个char 类型的变量 &#x…

数据库,计算机网络、操作系统刷题笔记29

数据库&#xff0c;计算机网络、操作系统刷题笔记29 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;oracle…

联合证券|主力加仓电气设备、有色金属等行业

上证指数、深证成指早盘探底上升&#xff0c;午后震动回落&#xff0c;尾盘有所上升&#xff1b;创业板指早盘探底冲高&#xff0c;午后震动回落&#xff1b;科创50指数早盘高开高走&#xff0c;午后震动回落。到收盘&#xff0c;上证指数报3157.64点&#xff0c;涨0.08%&#…

如何在Windows中轻松扩大C盘?

因为C盘是系统盘&#xff0c;所以没有足够的空间会导致电脑变慢&#xff0c;影响程序或游戏的运行。新电脑C盘可能有足够的可用空间&#xff0c;但随着对电脑的使用&#xff0c;应用程序安装的越来越多。即便很多程序安装到D盘&#xff0c;但某些程序仍然会占用C盘的部分空间。…

Linux信号通信之信号

文章目录什么是信号生活中的信号进程的信号Linux信号种类前台进程和后台进程进程对信号的处理策略Linux产生信号的方式系统调用发送信号kill调用raise调用abortalarm通过终端按键产生信号通过软件条件产生信号信号的自定义处理signalsigactionCoredump函数重入可重入函数和不可…

Spire.Office 8.1.1 for .NET 是 Spire.Office 7.12.5吗

为何 Spire.Office for .net 8.1.1 悄悄而来&#xff1f;不得而知。官网没有更新信息&#xff0c;为何&#xff1f;我们都不清楚&#xff0c;但是都需要迎接它的到来&#xff0c;不管何种原因&#xff0c;接受吧 by Ω578867473 Spire.Office 7.12.5 is released Friday, 30 De…

持续交付-Jenkinsfile 语法

实现 Pipeline 功能的脚本语言叫做 Jenkinsfile&#xff0c;由 Groovy 语言实现。Jenkinsfile 一般是放在项目根目录&#xff0c;随项目一起受源代码管理软件控制&#xff0c;无需像创建"自由风格"项目一样&#xff0c;每次可能需要拷贝很多设置到新项目&#xff0c;…

openEuler委员会主席江大勇:激发原创力量,逐梦数智未来

12月29日&#xff0c;由欧拉开源社区发起并联合华为、麒麟软件、统信软件、麒麟信安、超聚变、英特尔、中科院软件所、软通动力、润和软件等伙伴&#xff0c;共同举办的openEuler Summit 2022于线上举行。 会上&#xff0c;openEuler委员会主席江大勇发表了《激发原创力量&…

PyQt学习笔记-基本窗体

记述PyQt的基本窗体信息和基本操作。一、主窗体类&#xff08;QMainWindow&#xff09;主窗体类是通用的主窗体&#xff0c;包含菜单栏&#xff08;QMenuBar&#xff09;&#xff0c;工具栏&#xff08;QToolBars&#xff09;&#xff0c;悬停部件&#xff08;QDockWidgets&…