西电通信技术基础实验

实验一 基带传输常用编码

实验内容

数字编码技术:AMI码、曼彻斯特编码、HDB3码

实验目的

掌握几种基带传输常用码型的编码规则,如AMI码、HDB3码、曼彻斯特码。然后利用MATLAB设计并实现它们的编码。

实验环境

MATLAB程序设计、MATLAB Simulink仿真

原理简述

AMI码

定义:AMI码是传号交替反转码。其编码规则是将二进制消息代码“1”交替地变换为传输码的“+1”和“-1”,而“0”保持不变。

优点:无直流分量

缺点:当原信码出现连“0”串时,信号的电平长时间不跳变,造成提取定时信号的困难。

HDB3码

定义:HDB3码全称是高密度双极性码,是AMI码的一种改进型,其目的是为了保持AMI码的优点而克服其缺点,使连“0”个数不超过3个。

编码规则:

1) 先将消息代码变换成AMI码,若AMI码中连0的个数小于4,此时的AMI码就是HDB3码 ;
2) 若AMI码中连0的个数大于3,则将每4个连0小段的第4个0变换成与前一个非0符号(+1或-1)同极性的符号,表示(+V,-V);
3) 为了不破坏极性交替反转,当相邻V码之间有偶数个非0符号时,再将该小段的第1个0变换成+B或 -B,符号的极性与前一非零符号的相反,并让后面的非零符号从符号开始再交替变化。

例如:

消息代码: 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1

AMI码: -1 0 0 0 0 +1 0 0 0 0 -1 +1 0 0 0 0 -1 +1

HDB3码:-1 0 0 0 –V +1 0 0 0 +V -1 +1 -B 0 0 -V +1 -1

数字双相码(Manchester码)

定义:它用一个周期的正负对称方波表示“0”,而用其反相波形表示“1”。编码是:“0”码用“1 -1”两位码表示,“1”码用“-1 1”两位码表示。

例如:

消息代码 1 1 0 0 1 0 1

曼彻斯特编码:-1 1 -1 1 1 -1 1 -1 -1 1 1 -1 -1 1

仿真程序与实验结果及其分析:

AMI码

设计思路:

1、输入消息码;2、计算“1”的位置;3、偶数个1时输出1”,奇数时为“-1”。

关键步骤:统计“1”的个数,对奇偶不同的“1”进行区分。

matlab代码:

xn=[1 0 1 1 0 0 0 0 1 1 1 0 0 0 1 0];
tn=xn;
num=0;

%AMI部分
for k=1:length(xn)            %只对1进行变化
    if xn(k)==1
        num=num+1;          
    if num/2==fix(num/2)      %偶数位输出为1
        tn(k)=1;
    else
        tn(k)=-1;             %奇数位输出为-1
    end
    end
end
figure(1);                    %图一为原码,图二为AMI码
subplot(3,1,1);stairs([0:length(xn)-1],xn);axis([0 length(xn) -2 2]);grid;
subplot(3,1,2);stairs([0:length(xn)-1],tn);axis([0 length(xn) -2 2]);grid;

实验结果及分析

对于输入的序列1 0 1 1 0 0 0 0 1 1 1 0 0 0 1 0经过AMI编码之后结果应是-1 0 1 -1 0 0 0 0 1 -1 1 0 0 0 -1 0,结果图像可知结果正确。

HDB3码

设计思路:

1、输入消息码,并将它转换为AMI码;

2、统计连零情况,如果4连0,让0000的最后一个0改变为与前一个非零符号相同极性的符号;

3、如果当前V符号与前一个V符号的极性相同,则让当前V符号极性反转,以满足V符号间相互极性反转要求,并且添加B符号,与V符号同极性,然后让后面的非零符号从V符号开始再交替变化。

matlab代码:

xn=[1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1];
tn=xn;
num=0;
 
%AMI部分
for k=1:length(xn)            %只对1进行变化
    if xn(k)==1
        num=num+1;          
    if num/2==fix(num/2)      %偶数位输出为1
        tn(k)=1;
    else
        tn(k)=-1;             %奇数位输出为-1
    end
    end
end

%HDB3部分
HDB3=tn;
num1=0;
l1=0;
lv=0;
for i=1:length(xn)
    if HDB3(i)==0
        num1=num1+1;
        if num1==4
            if lv==l1
                HDB3(i)=-l1;
                HDB3(i-3)=-l1;
            else
                HDB3(i)=l1;
            end
            lv=HDB3(i);
            l1=lv;
            num1=0;
        end
    else
        if HDB3(i)==l1
            HDB3(i)=-l1;
        end
        l1=HDB3(i);
        num1=0;
    end
end

figure(1);
subplot(3,1,1);stairs([0:length(xn)-1],xn);axis([0 length(xn) -2 2]);grid;
subplot(3,1,2);stairs([0:length(xn)-1],HDB3);axis([0 length(xn) -2 2]);grid;

实验结果及分析

对于输入的序列1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1经过AMI编码之后结果应是-1 0 0 0 -1 +1 0 0 0 +1 -1 +1 -1 0 0 -1 +1 -1,结果图像可知结果正确。

Manchester码

设计思路:

1、输入消息码;2、计算消息码中“1”、“0”的位置;3、将消息码中的“1”输出为“-1 1”;将消息码中的“0”输出为“1 -1”。

关键步骤:将每个码元用两位码表示。

matlab代码:

xn=[1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1];
yn=zeros(1,2*length(xn));

for i=1:length(xn)
    if xn(i)==0
        yn(2*i-1)=1;
        yn(2*i)=-1;
    else
        yn(2*i-1)=-1;
        yn(2*i)=1;
    end
end

figure(1);
subplot(2,1,1);stairs([0:length(xn)-1],xn);axis([0 length(xn) -2 2]);grid;
subplot(2,1,2);stairs([0:0.5:length(xn)-0.5],yn);axis([0 length(xn) -2 2]);grid;

实验结果及分析

对于输入的序列1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1经过AMI编码之后结果应是-1 1 1 -1 1 -1 1 -1 1 -1 -1 1 1 -1 1 -1 1 -1 1 -1 -1 1 -1 1 1 -1 1 -1 1 -1 1 -1 -1 1 -1 1 ,结果图像可知结果正确。

in

实验二 数字调制截调技术

实验内容

一、Simulink简介
二、2ASK系统的仿真设计与分析
三、2FSK系统的仿真设计与分析
四、2PSK系统的仿真设计与分析
五、2DPSK系统的仿真设计与分析

实验目的

在学习了几种数字调制的基础上,通过simulink仿真软件,实现对2ASK、2FSK、2PSK等数字调制系统的仿真,然后对以上系统有更深入的了解。

实验环境

Simulink是MATLAB最重要的组件之一,它提供一个动态系统建模、仿真和综合分析的集成环境。在该环境中,无需大量书写程序,而只需要通过简单直观的鼠标操作,就可构造出复杂的系统。Simulink具有适应面广、结构和流程清晰及仿真精细、贴近实际、效率高、灵活等优点,并基于以上优点Simulink已被广泛应用于控制理论和数字信号处理的复杂仿真和设计。

Simulink是MATLAB中的一种可视化仿真工具, 是一种基于MATLAB的框图设计环境,是实现动态系统建模、仿真和分析的一个软件包,被广泛应用于线性系统、非线性系统、数字控制及数字信号处理的建模和仿真中。Simulink可以用连续采样时间、离散采样时间或两种混合的采样时间进行建模,它也支持多速率系统,也就是系统中的不同部分具有不同的采样速率。

为了创建动态系统模型,Simulink提供了一个建立模型方块图的图形用户接口(GUI) ,这个创建过程只需单击和拖动鼠标操作就能完成,它提供了一种更快捷、直接明了的方式,而且用户可以立即看到系统的仿真结果。

2ASK系统的仿真设计与分析

2ASK系统的原理

ASK即“幅移键控”又称为“振幅键控”,2ASK是二进制振幅键控。发送为二进制符号“0”时,2ASK信号取值为0;发送为二进制符号“1”时,2ASK信号取值为载波对应的值。

解调算法:

上式中的第二项的频率远大于基带信号的频率,可以用低通滤波器滤掉。

具体如下图所示:

2ASK系统的仿真设计

2ASK系统仿真结果

2FSK系统的仿真设计与分析

2FSK系统的原理

数字键控法实现二进制移频键控信号的原理图:

2fsk非相干解调:

2fsk相干解调:

2FSK系统的仿真设计

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sFq3L9aT-1669267493001)(C:\Users\拽叉叉\AppData\Roaming\Typora\typora-user-images\image-20221030121154411.png)]

2FSK系统仿真结果

2PSK系统的仿真设计与分析

2PSK系统的原理

2PSK称为二进制相移键控,是相移键控的最简单的一种形式,它用两个初相相隔为180的载波来传递二进制信息。2PSK即发送为二进制符号“1”时,取0相位;发送为二进制符号“0”时,取pi相位。或者也可以反过来。

相干解调法:

整个2PSK的调制与解调仿真,流程如下图:

2PSK系统的仿真设计

2PSK系统的仿真结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uf6eZJji-1669267493002)(通信技术基础第二次实验/image-20221121211159611.png)]

2DPSK系统的仿真设计与分析

2DPSK系统的原理

2DPSK信号的解调方法:差分相干解调(相位比较)法

2DPSK系统的仿真设计

2DPSK系统仿真结果


在这里插入图片描述

实验三 模拟信号的数字传输

实验内容

一、PCM系统及matlab的实现
二、增量调制系统及matlab的实现

实验目的

通过此次课程的学习我们能加深理解和巩固理论课上所学的有关PCM\DM编码和解码的基本概念、基本理论和基本方法,并且更加熟练的掌握和操作MATLAB。

实验环境

MATLAB程序设计

原理简述

脉冲编码调制

脉冲编码调制(PCM)简称脉码调制,它是一种用一组二进制数字代码来代替连续信号的抽样值,从而实现数字通信方式。由于这种通信方式刚干扰能力强,他在很多领域获得了极为广泛的应用。

PCM信号的形成是模拟信号经过“抽样、量化、编码”三个步骤实现的。

  • 抽样是对模拟信号进行周期性的扫描,把时间上连续的信号变成时间上离散的信号。我们要求经过抽样的信号应包含原信号的所有信息,既能无失真地恢复出原模拟信号,抽样速率的下限有抽样定理确定。
  • 量化是把经抽样得到的瞬间值进行幅度离散,即指定规定的电平,把抽样值用最接近的电平表示。
  • 编码是用二进制码组表示有固定电平的量化值。实际上量化是在编码过程中同时完成的。

增量调制

预测误差 e k = m k – m k ′ ek = mk – mk' ek=mkmk 被量化成两个电平 + σ +\sigma +σ − σ -\sigma σ σ \sigma σ值称为量化台阶。这就是说,量化器输出信号 r k rk rk 只取两个值 + σ +\sigma +σ − σ -\sigma σ 。因此, r k rk rk 可以用一个二进制符号表示。例如,用“1”表示“ + σ +\sigma +σ”,及用“0”表示“ − σ -\sigma σ ”。

当前抽样值和前一个抽样重构值比较,若大于前一个抽样重构值,则编为1,若小于,则编为0

增量调制的采样间隔为 T s T_s Ts ,量化阶距 δ δ δ ,前一个抽样量化值初始值为0。输入信号,求出20个采样点。

编码端:

  1. 先取差值;
  2. 量化器输出:差值大于0输出δ,差值小于0输出-δ ;
  3. 前一个抽样量化值状态更新:差值加上前一个抽样量化值
  4. 编码输出,差值大于0输出为1,小于等于0输出为0。

解码端:

  1. 前一个抽样量化值初始值为0
  2. 根据编码端的输出得到量化值,若编码值为1,则量化值= δ δ δ,否则为 − δ -δ δ
  3. 更新抽样量化值:前一个抽样量化值 + δ +δ +δ
  4. 输出图像

仿真程序与实验结果:

脉冲编码调制

%sympref('FloatingPointOutput',true);

signLen=4

%产生原始信号
syms x
originalFunction(x)=sin(2*pi*x)+sin(2*pi*5*x)
ts=0.01;
t=0:ts:signLen;
original=originalFunction(t)
subplot(4,1,1);
plot(original);
title('原始信号');


%用离散的周期序列对信号进行抽样
sampleNum=81
ts=signLen/(sampleNum-1);
t=0:ts:signLen;
sample=originalFunction(t)
subplot(4,1,2);
stem(sample);
title('抽样信号');


%均匀量化
maxY=2
minY=-maxY;
M=19 
delta=(maxY-minY)/M
dx=1:1:M;
q=dx*delta + (minY-delta/2)*ones(1,M)
index=zeros(1,sampleNum);
for i=1:sampleNum
    sp=sample(i);
    tempi=find((q-delta/2 <= sp) & (sp <= q+delta/2));
    index(i)=(tempi(1)-1-(M-1)/2)*2/(M-1)*maxY; 
end
subplot(4,1,3);
stem(index);
title('均匀量化信号');

oneSample = sample/maxY; 
ys=[];
A= 3;
lnA = log(A);

for j = 1:length(oneSample)
    ori = oneSample(j);
    if(abs(ori)<1/A)
        ys(end+1) = ori*A/(1+lnA);
    else
        ys(end+1) = sign(ori)*(1+log(A*abs(ori)))/(1+ lnA);
    end
end
ys

ys_max = max(ys);
ys_min = min(ys);
delta = (ys_max-ys_min)/M;
q2=dx*delta + (ys_min-delta/2)*ones(1,M)
index2=zeros(1,sampleNum);
for i=1:sampleNum
    sp=ys(i);
    tempi=find((q2-delta/2 <= sp) & (sp <= q2+delta/2));
    index2(i)=(tempi(1)-1-(M-1)/2)*2/(M-1); 
end

ans =[];
for j=1:length(index2)
    tempy = index2(j);
    if(abs(tempy)<1/(1+lnA))
        ans(end+1) = tempy*(1+lnA)/A;
    else
        ans(end+1) = sign(tempy)*(exp(abs(tempy)*(1+lnA)-1))/A;
    end
end
ans = ans*maxY; 
subplot(4,1,4);
stem(ans);
title('A律量化信号');

增量调制

syms x
originalFunction(x)=sin(2*pi*x);

signLen=1

delta=0.35;                          % 量化阶距

ts=0.01;                             % 采样间隔
t=0:ts:signLen;                      % 仿真时间序列
original=originalFunction(t)
subplot(3,1,1);
plot(t,originalFunction(t));

sampleLen=0.05
sampleNum=signLen/sampleLen+1;
t=0:sampleLen:signLen;
sample=originalFunction(t)
hold on;
stem(t,originalFunction(t));

tz=[];
base=0; 
for i=1:sampleNum-1
    flag=sample(i+1)-base
    if flag>0
        tz(end+1)=1;
        base=base+delta
    else
        tz(end+1)=0;
        base=base-delta
    end
end
tz(end+1)=tz(end);
tz
subplot(3,1,2);
stairs(t,tz);
ylim([-1 2]);

%解码端
jt=[];
jtBase=0;                           % 解码端预测器初始状态
for i=1:length(tz)-1
    if tz(i)==0
        jtBase=jtBase-delta;
    else
        jtBase=jtBase+delta;
    end
    jt(end+1)=jtBase;
end
jt(end+1)=jt(end);                  % 延迟器状态更新
jt
subplot(3,1,3);
stairs(t,jt);
ylim([-1.5 1.5]);
hold on;
plot(t,originalFunction(t));

猜你喜欢

转载自blog.csdn.net/lbwnbnbnbnbnbnbn/article/details/128016626