MATLAB——PCM编译码实验

这篇具有很好参考价值的文章主要介绍了MATLAB——PCM编译码实验。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MATLAB——PCM编译码

一、实验原理

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

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

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

二、实验原理

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

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

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

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

pcm编码matlab,通信原理,matlab,pcm,开发语言

编码,就是用一组二进制码组来表示每一个有固定电平的量化值。然而,实际上量化是在编码过程中同时完成的,故编码过程也称为模/数变换,可记作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)的时域波形');

pcm编码matlab,通信原理,matlab,pcm,开发语言

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;

pcm编码matlab,通信原理,matlab,pcm,开发语言

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

pcm编码matlab,通信原理,matlab,pcm,开发语言
pcm编码matlab,通信原理,matlab,pcm,开发语言
pcm编码matlab,通信原理,matlab,pcm,开发语言
我们选取观察的点是模拟信号中负值最大的点,同时也是抽样信号的第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编码matlab,通信原理,matlab,pcm,开发语言
通过原始信号与PCM编码译码后的对比可以看到能够比较好地重建出原始信号。通过下图能够更好得出对比的效果。
pcm编码matlab,通信原理,matlab,pcm,开发语言

4.5失真度分析

pcm编码matlab,通信原理,matlab,pcm,开发语言

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编码matlab,通信原理,matlab,pcm,开发语言
pcm编码matlab,通信原理,matlab,pcm,开发语言
接下来我将之前编写的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八进制编码的形式,必须要进行解码,同时和原信号进行对比,验证传输的正确性。

pcm编码matlab,通信原理,matlab,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('语音信号对比');

pcm编码matlab,通信原理,matlab,pcm,开发语言
pcm编码matlab,通信原理,matlab,pcm,开发语言
pcm编码matlab,通信原理,matlab,pcm,开发语言

五、引用

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

到了这里,关于MATLAB——PCM编译码实验的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 线性分组码编码与译码(MATLAB实现)

    分组码是对信息序列分段编码。若对包含 k 个信息元的信息组 M : 按照一定的编码规则产生包括 n 个码元的码组 C : 编码规则定义为: 如果 f i (·),i = 0,1,…,n-1 均为线性函数,则称 C 为线性分组码。线性分组码一般用 (n,k,d)码表示,其中 n 为码长, k 为信息组长度,

    2024年01月15日
    浏览(25)
  • 音视频编码实战-------pcm+yuv数据转成MP4

    avcodec_find_encoder: 根据编码器ID查找编码器 avcodec_alloc_context3:创建编码器上下文 avcodec_open2:打开编码器 avformat_alloc_output_context2:为输出格式创建复用器上下文 avformat_new_stream:创建音视频流 avcodec_parameters_from_context:将编码器上下文中的参数拷贝到音视频流中的编码器参数中AVCodec

    2024年02月15日
    浏览(47)
  • 【通信原理(含matlab程序)】实验二:FM的调制和解调

    💥💥💞💞欢迎来到本博客❤️❤️💥💥 本人持续分享更多关于电子通信专业内容以及嵌入式和单片机的知识,如果大家喜欢,别忘点个赞加个关注哦,让我们一起共同进步~ 理解FM基本原理、FM信号时域和频域主要特点; 理解FM信号调制和解调的实现方法; 掌握matlab程序

    2024年02月08日
    浏览(29)
  • 【HarmonyOS】实现将pcm音频文件进行编码并写入文件(API6 Java)

     【】 音频编码、管道模式、createEncoder 【写在前面】 在使用API6开发HarmonyOS应用时,如何将pcm源文件进行编码并写入文件,最后生成aac文件,本文直接附上主要代码开发步骤供大家参考。 【主要功能代码】 【说明和注意事项】 1、AAC文件有两种添加头文件方式:ADIF与

    2024年02月11日
    浏览(25)
  • 单载波频域均衡matlab仿真,包括卷积编码维特比译码,矩阵交织,QPSK调制解调,导频插入,MMSE-FDE频域均衡

    目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB         频域均衡是从校正系统的频率特性出发,利用一个可调滤波器的频率的频率特性去补偿信道或系统的频率特性,使包括可调滤波器在内的基带系统的总特性接近无失真传输条件。频域均衡是在频域上进行的,

    2023年04月08日
    浏览(39)
  • 信道编码---RS编码与译码原理

    本文介绍了RS编码以及译码的原理。 本文的内容基本上都来自刘梦欣的《基于FPGA的RS编译码研究与设计》,大家可以通过知网找到这篇文章,链接在下面。对RS码的原理讲解非常清楚,如果要看的话可以结合第2和第3部分一起看更好懂。我的整理也是比较粗略,因此没看懂的话

    2024年02月11日
    浏览(30)
  • 【音视频|PCM】PCM格式详解

    😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀 🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭 🤣本文内容🤣:🍭介绍数字音频的PCM格式🍭 😎金句分享😎:🍭子曰:君子不器。 ——《论语·为政篇》。意思是,君子不应像器具那样,只有一种用

    2024年02月08日
    浏览(28)
  • 【MATLAB源码-第65期】基于matlab的OFDM/OTFS通信系统性能对比,输处误码率曲线;对比是否采用LDPC编码。

      OTFS(Orthogonal Time Frequency Space)是一种无线通信调制技术,它利用时间、频率和空间的正交性来传输数据,目的是提高无线通信系统的性能,尤其是在多径和高移动性环境中。 1. 时间-频率资源块:OTFS调制将整个时间-频率平面划分为一个个小的资源块,每个资源块都代表

    2024年02月06日
    浏览(29)
  • 【FFmpeg】ffmpeg 命令行参数 ⑦ ( 使用 FFmpeg 提取 PCM 音频数据 | PCM 音频格式 | 提取 PCM 音频格式常用参数 | 查询文档方法 )

    PCM 全称 \\\" Pulse Code Modulation \\\" , 脉冲编码调制 , 该 音频数据 是未经压缩的 采样裸数据 , 只有 知道该数据的 采样率 / 采样位数 / 通道数 才能将该音频数据播放出来 ; PCM 数据是 最原始的音频数据 , 音频内容完全无损 , 但是 PCM 数据体积庞大 , 对 PCM 音频数据压缩 分为 无损压缩

    2024年04月11日
    浏览(41)
  • 通信原理与MATLAB(十二):MSK的调制解调

    MSK调制原理如下图所示,基带码元先差分编码,然后经过串并转换分成I、Q两路,再与对应的载波相乘,然后再相加完成MSK的调制。 其中注意:I、Q两路码元分别是差分编码后的相对码的奇数和偶数位置上的码元,I路对应于奇数,Q路对应于偶数。而pk是I路码元,但是其码元宽

    2024年02月12日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包