通信原理仿真实验讲义
通信原理MATLAB 仿真
实验讲义
单位:物理与信息工程系 编写:宋 庆 恒
2012.10
目 录
一、 实验目的.......................................................................................................... 3 二、 实验题目.......................................................................................................... 3 三、 实验项目.......................................................................................................... 3
实验一、单极性与双极性、归零码与不归零码 ................................................ 3
1. 单极性不归零码 .......................................................................................... 3 2. 双极性不归零码 .......................................................................................... 4 3. 单极性归零码 .............................................................................................. 5 4. 双极性归零码 .............................................................................................. 6 5. 实验内容 ...................................................................................................... 6 实验二、进制数字调制ASK 、PSK 、FSK . ............................................................ 7
1. 二进制数字幅度调制 .................................................................................. 7 2. 二进制数字频率调制 .................................................................................. 8 3. 二进制数字相位调制 ................................................................................ 11 4. 实验内容 .................................................................................................... 12 实验三 HDB3编码仿真 ...................................................................................... 13
1设计原理及设计思路 ................................................................................ 13 2程序流程图 ................................................................................................ 14 3参考程序源代码 ........................................................................................ 14 4. 实验内容 .................................................................................................... 16
一、 实验目的
⏹
学会MATLAB 软件的最基本运用。MATLAB 是一种很实用的数学软件,它易学易用。MATLAB 对于许多的通信仿真类问题来说是很合适的。
⏹ 了解计算机仿真的基本原理及方法,知道怎样通过仿真的方法去研究通信问题。 ⏹ 加深对通信原理课程有关内容的理解。
二、 实验题目
1) 单极性与双极性、归零码与不归零码 2) 2进制数字调制ASK 、PSK 、FSK 3) HDB3编码仿真
三、 实验项目
实验一、单极性与双极性、归零码与不归零码
1. 单极性不归零码
单极性不归零码是一种最简单、 最常用的基带信号形式。这种信号脉冲的零电平和正电平分别对应着二进制代码0和1,或者说,它在一个码元时间内用脉冲的有或无来对应表示0或1码。其特点是极性单一,有直流分量,脉冲之间无间隔。另外位同步信息包含在电平的转换之中,但是当出现连0或连1序列时没有位同步信息。
生成单极性不归零码的流程图如图7-1所示 。
图7-1 snrz程序流程图
MATLAB 实现程序如下: function y=snrz(x)
%本函数实现将输入的一段二进制代码编为相应的单极性 不归零码输出
%输入x 为二进制码,输出y 为编好的码 t0=200;
t=0:1/t0:length(x); %给出相应的时间序列 for i=1:length(x) %计算码元的值 if x(i)==1 %如果输入信息为1 for j=1:t0 %该码元对应的点值取1 y((i-1)*t0+j)=1; end else
for j=1:t0
%如果输入信息为0,码元对应的点值取0 y((i-1)*t0+j)=0; end
end end
y=[y,x(i)]; plot(t,y);
%采用title 命令来实现标记出各码元对应的二元信息 title('1 0 1 1 0 0 1 0'); grid on;
axis([0,i, -0.1,1.1]);
在命令窗口中键入x 的二进制代码和函数名,就可以得到所对应的单极性不归零码输出,如输入以下指令,将出现图7-2所示结果。 x=[1 0 1 1 0 0 1 0]; snrz(x)
图7-2 单极性不归零码
2. 双极性不归零码
在双极性不归零码中,脉冲的正、负电平分别对应于二进制代码1、0,由于它是幅度相等极性相反的双极性波形,故当0、 1符号等可能出现时无直流分量。 这样,恢复信号 的判决电平为 0,因而不受信道特性变化的影响,抗干扰能力也较强。故双极性码较单极性码更有利于在信道中传输。
双极性非归零码的实现同单极性基本一样,只需将snrz.m 中的判断得到0
信息后的语
句y((i-1)*t0+j)=0;中的0改为-1即可,所以就不再给出MATLAB 函数文件了,波形图如图7-3所示。
3. 单极性归零码
单极性归零码与单极性不归零码的区别是电脉冲宽度小于码元宽度,每个电脉冲在小于码元长度内总要回到零电平,即输入信息为1时给出的码元前半时间为1,后半时间为0,输入为0时与不归零码则完全相同。单极性归零码可以直接提取定时信息,是其他波形提取位定时信号时需要采用的一种过渡波形。 其MA TLAB 实现如下:(函数文件srz.m ) function y=srz(x)
%本函数实现将输入的一段二进制代码编为相应的单极性归零码输出 %输入x 为二进制码,输出y 为编好的码 t0=200;
t=0:1/t0:length(x); %给出相应的时间序列 for i=1:length(x) %计算码元的值
if x(i)==1 %如果输入信息为1 for j=1:t0/2
y((2*i-2)*t0/2+j)=1; %定义前半段时间值为1 y((2*i-1)*t0/2+j)=0; %定义后半段时间值为0 end else
for j=1:t0 %如果输入信息为0 y((i-1)*t0+j)=0; %定义所有时间值为0 end end end
y=[y,x(i)]; plot(t,y);
title('1 0 1 1 0 0 1 0'); grid on;
axis([0,i, -0.1,1.1]); 同理,在命令窗口中键入x 的二进制代码和函数名,就可以得到所对应的单极性归零码输出,如输入以下指令,将出现图7-4所示结果。 x=[1 0 1 1 0 0 1 0];
srz(x)
4. 双极性归零码
它是双极性不归零码的归零形式,每个码元内的脉冲都回到零点平,表示信息1时前半时间为1后半时间为0,表示信息0时前半时间为-1后半时间为0,相邻脉冲之间必定留有零电位的间隔。它除了具有双极性不归零码的特点外,还有利于同步脉冲的提取。
双极性归零码的MATLAB 实现同单极性也基本一样,只需将srz.m 中的判断得到0信息后的语句 for j=1:t0
y((i-1)*t0+j)=0; 改为for j=1:t0/2
y((2*i-2)*t0/2+j)=-1; y((2*i-1)*t0/2+j)=0;
即可,所以也就不再给出MATLAB 函数文件了,其波形图如图7-5所示。
图7-5 双极性归零码
5. 实验内容
求伪随机码x=[1 1 1 1 1 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 0 1 1 0 0 0]
的单极性不归零码、双极性不归零码、单极性归零码、双极性归零码。
实验二、进制数字调制ASK 、PSK 、FSK
1. 二进制数字幅度调制
一、一般原理与实现方法
数字幅度调制又称幅度键控(ASK ),二进制幅度键控记作2ASK 。2ASK 是利用代表数字信息“0”或“1”的基带矩形脉冲去键控一个连续的载波,使载波时断时续地输出。有载波输出时表示发送“1”,无载波输出时表示发送“0”。根据幅度调制的原理,2ASK 信号可表示为:
e 0(t ) =s (t ) cos ωc t
s (t ) =∑a n g (t -nT b )
n
2ASK 信号的产生方法(调制方法)有两种,如图所示。图(a )是一般的模拟幅度调制方法,这里的由式(8-2)规定;图(b )是一种键控方法,这里的开关电路受控制。图(c )给出了及的波形示例。二进制幅度键控信号,由于一个信号状态始终为0,相当于处于断开状态,故又常称为通断键控信号(OOK 信号)
二、MATLAB 实现
以数字信号序列10110010为例,给出产生2ASK 信号的MA TLAB 程序如下(函数文件askdigital.m ),流程图如图所示。
图8-2 2ASK流程图
%本函数实现将输入的一段二进制代码调制成相应的ask 信号输出 %s为输入二进制码,f 为载波频率,ask 为调制后输出信号 t=0:2*pi/99:2*pi;
m1=[]; c1=[];
s=[1 0 1 1 0 0 1 0]; f=2;
for n=1:length(s) if s(n)==0;
m=zeros(1,100); else s(n)==1;
m=ones(1,100); end
c=sin(f*t); m1=[m1 m]; c1=[c1 c] end
ask=c1.*m1; subplot(211); plot(m1)
title('原始信号');
axis([0 100*length(s) -0.1 1.1]); subplot(212); plot(ask)
title('ASK信号'); 如输入以下指令: Ask
2. 二进制数字频率调制
数字频率调制又称频移键控(FSK ),二进制频移键控记作2FSK 。数字频移键控是用载波的频率来传送数字消息,即用所传送的数字消息控制载波的频率。2FSK 信号便是符号“1”对应于载频f1,而符号“0”对应于载频f2(与f1不同的另一载频)的已调波形,而且f1与f2之间的改变是瞬间完成的。
从原理上讲,数字调频可用模拟调频法来实现,也可用键控法来实现。模拟调频法是利用一个矩形脉冲序列对一个载波进行调频,是频移键控通信方式早期采用的实现方法。2FSK 键控法则是利用受矩形脉冲序列控制的开关电路对两个不同的独立频率源进行选通。键控法的特点是转换速度快、波形好、稳定度高且易于实现,故应用广泛。
2FSK 信号的产生方法及波形示例如图8-7所示。图中s (t )为代表信息的二进制矩形脉冲序列, e0(t )即是2FSK 信号。
图8-8给出的是用键控法实现2FSK 信号的电路框图,两个独立的载波发生器的输出受控于输入的二进制信号,按“1”或“0”分别选择一个载波作为输出。 二、MATLAB 实现
以数字信号序列10110010为例,给出产生2FSK 信号的MATLAB 程序如下(函数文件fskdigital.m ):
function fskdigital(s,f1,f2)
%本函数实现将输入的一段二进制代码调制成相应的fsk 信号输出 %s为输入二进制码,f1、f2分别为代码0、1对应的载波频率, fsk 为调制后输出信号 t=0:2*pi/99:2*pi; m1=[]; c1=[]; b1=[];
s=[1 0 1 1 0 0 1 0]; f1=200; f2=100;
for n=1:length(s) if s(n)==0;
m=ones(1,100);
c=sin(f2*t); b=zeros(1,100) else s(n)==1;
m=ones(1,100); c=sin(f1*t); b=ones(1,100) end
m1=[m1 m]; c1=[c1 c]; b1=[b1 b]; end
fsk=c1.*m1; subplot(211); plot(b1,'r')
title('原始信号');
axis([0 100*length(s) -0.1 1.1]); grid on;
subplot(212); plot(fsk)
title('2FSK信号'); grid on;
如输入以下指令: fskdigital
输出波形如图8-9所示,其中0信号所对应的载波频率与码元速率相同,1信号所对应的载波频率为码元速率的两倍。
图8-9 2FSK信号波形
3. 二进制数字相位调制
一、一般原理及实现方法
绝对相移是利用载波的相位(指初相)直接表示数字信号的相移方式。二进制相移键控中,通常用相位0和180度来分别表示“0”或“1”。2PSK 已调信号的时域表达式为 s 2PSK (t ) =s (t ) cos ωc t
s (t ) =∑a n g (t -nT b )
n
⎧+1,概率为P a n =⎨ ⎩-1,概率为(1-P )
当码元宽度为载波周期的整数倍时,2PSK 信号的典型波形如图8-15所示。
1 0 1 1 0 0
1
s (t )
s 2PSK
(t
图8-15 2PSK信号的典型波形 (t)
图8-16 2PSK调制器框图
2PSK 信号的调制方框图如图8-16示。图(a )是产生2PSK 信号的模拟调制法框图;图(b )是产生2PSK 信号的键控法框图。
二、MATLAB 实现
以数字信号序列10110010为例,给出产生2PSK 信号的MA TLAB 程序如下(函数文件pskdigital.m ):
function pskdigital(s,f)
%本函数实现将输入的一段二进制代码调制成相应的psk 信号输出
%s为输入二进制码,f 为载波频率,psk 为调制后输出信号
t=0:2*pi/99:2*pi;
m1=[];
c1=[];
b1=[];
s=[1 0 1 1 0 0 1 0];
f=100;
for n=1:length(s)
if s(n)==0; (a )
m=-ones(1,100);
b=zeros(1,100)
else s(n)==1;
m=ones(1,100);
b=ones(1,100)
end
c=sin(f*t);
m1=[m1 m];
c1=[c1 c]
b1=[b1 b];
end
psk=c1.*m1;
subplot(211);
plot(b1)
title('原始信号');
axis([0 100*length(s) -0.2 1.1]);
subplot(212);
plot(psk);
title('PSK信号');
grid on;
如输入以下指令:
pskdigital
输出波形如图8-17所示,其中载波频率与码元速率相同。
图8-17 2PSK信号波形
4. 实验内容
分别求伪随机码x=[1 1 1 1 1 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 0 1 1 0 0 0]的ASK 、PSK 、FSK 调制。
实验三 HDB3编码仿真
1设计原理及设计思路
在实际的传输系统中,并不是所有的代码电气波形都可以信道中传输。含有直流分量和较丰富的单极性基带波形就不适宜在低频传输特性差的信道中传输,因为它有可能造成信号的严重的畸变。
在传输码(或称线路吗)的结构将取决于实际信道特性和系统的工作条件。通常,传输码的结构应具有以下的特性:
(1) 相应的基带信号无直流分理,且低频分量少:
(2) 便于从信号中提取定时信息:
(3) 信号中高频分应尽量少以节省传输频带并减少码间串扰。
(4) 不受信号源统计特性影响,即能适应于信息源变化:
(5) 具有内在的检错能力,传输的码型应具有一定的规律性,以便利用这一规律性进行宏观监测:
(6) 编译码设备要尽可能简单,等等。
满足以上特性的传输码型种类繁多,这里使用HDB3。
要了解HDB3码的编码规则,首先要知道AMI 码的构成规则,AMI 码就是把单极性脉冲序列中相邻的“1”码(即正脉冲) 变为极性交替的正、负脉冲。将“0”码保持不变,把“1”码变为+1、-1交替的脉冲。如:
AMI 码:-1 0 0 0 0 +1 0 0 0 0 -1 +1 0 0 0 0 -1 +1 HBD3码(3nd Order High Density Bipolar)的全称是三阶高密度双极性码,它是AMI 码的一种改进型,改进目的是为了保持AMI 码的优点而克服其缺点,使连“0”个数不超过3个。其编码规则:
(1)检查消息码中连“0”的个数。当连“0”数目小于等于3时,HBD3码与AMI 码一样(“1”交替的变换为“+1”和“-1”,“0”保持不变)。
(2)当连“0”数目超过3时,将每4个连“0”化作一小节,定义为“B00V" 称为破坏节,其中V 称为破坏脉冲,而B 称为调节脉冲;
(3)V 与前一个相邻的非“0”脉冲的极性相同(这破坏了极性交替的规则,所以V 称破坏脉冲),并且要求相邻的V 码之间极性必须交替。V 的取值为“+1”或“-1”;
(4)B 的取值可选0、+1或-1,,以使V 同时满足(3)中的两个要求;
(5)V 码后面的传号码极性也要交替。例如:
消息码: 1 000 0 1 000 0 1 1 000 0 000 0 1 1
AMI 码: -1 000 0 +1 000 0 -1+1 000 0 000 0 -1+1
HDB3码:-1 000-V +1 000+V -1+1-B00-V +B00+V -1+1
其中的±B 脉冲和±V 脉冲与±1脉冲波形相同,用V 或B 表示的目的是为了示意其中的该非“0”码是由原信码的“0”变换而来的。
当相邻两个V 码之间有奇数个“1”码时,能保证V 码满足(3)的要求,B 取“0”;当相邻两个V 码之间有偶数个“1”码时,不能保证V 码极性交替,B 取“+1”或“-1”,B 码的符号与前相邻“1”相反,而其后面的V 码与B 码极性相同。
2程序流程图
实验编码原理框图如下所示:
(1) 编码框图
译码规则:
在接收端,将接收到的HDB3码序列恢复为原输入二进制数字信息序列的过程称为译码。
对HDB3码而言,译码就是找到编码时插入的特殊序列并将它恢复为0000。根据编码原则,HDB3的译码可分为三个步骤:
(1)根据“V ”的极性特点,找出特殊序列。由于编码时,每个“V ”的极性都与其前一个“1”码的极性相同,所以,在接收序列中一旦出现连续两个同极性码时,两个同极性码的后一个即为“V ”,此“V ”与其前的三位码就是一个特殊序列;
(2)将所有的特殊序列都恢复为“0000”;
(3)将正、负脉冲都恢复为“1”码,零电平恢复为“0”码。
下图是译码的框图:
(4)译码框图
3参考程序源代码
xn=[ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1];% 输入单极性码
yn=xn;% 输出yn 初始化
num=0;% 计数器初始化
for k=1:length(xn)
if xn(k)==1
num=num+1; % "1"计数器
if num/2 == fix(num/2) % 奇数个1时输出-1, 进行极性交替
yn(k)=1;
else
yn(k)=-1;
end
end
end
% HDB3编码
num=0; % 连零计数器初始化
yh=yn; % 输出初始化
sign=0; % 极性标志初始化为0
V=zeros(1,length(yn));% V脉冲位置记录变量
B=zeros(1,length(yn));% B脉冲位置记录变量
for k=1:length(yn)
if yn(k)==0
num=num+1; % 连“0”个数计数
if num==4 % 如果4连“0”
num=0; % 计数器清零
yh(k)=1*yh(k-4);
% 让0000的最后一个0改变为与前一个非零符号相同极性的符号 V(k)=yh(k); % V脉冲位置记录
if yh(k)==sign % 如果当前V 符号与前一个V 符号的极性相同
yh(k)=-1*yh(k); % 则让当前V 符号极性反转, 以满足V 符号间相互极性反转要求 yh(k-3)=yh(k); % 添加B 符号, 与V 符号同极性
B(k-3)=yh(k); % B脉冲位置记录
V(k)=yh(k); % V脉冲位置记录
yh(k+1:length(yn))=-1*yh(k+1:length(yn));
% 并让后面的非零符号从V 符号开始再交替变化
end
sign=yh(k); % 记录前一个V 符号的极性
end
else
num=0; % 当前输入为“1”则连“0”计数器清零
end
end % 编码完成
re=[xn',yn',yh',V',B']; % 结果输出: xn AMI HDB3 V&B符号
% HDB3解码
input=yh; % HDB3码输入
decode=input; % 输出初始化
sign=0; % 极性标志初始化
for k=1:length(yh)
if input(k) ~= 0
if sign==yh(k) % 如果当前码与前一个非零码的极性相同
decode(k-3:k)=[0 0 0 0];% 则该码判为V 码并将*00V清零
end
sign=input(k); % 极性标志
end
end
decode=abs(decode); % 整流
error=sum([xn'-decode']); % 解码的正确性检验, 作图
subplot(3,1,1);stairs([0:length(xn)-1],xn);axis([0 length(xn) -2 2]); subplot(3,1,2);stairs([0:length(xn)-1],yh);axis([0 length(xn) -2 2]); subplot(3,1,3);stairs([0:length(xn)-1],decode);axis([0 length(xn) -2 2]);
4. 实验内容
求以下4种数据的HDB3码,前3种数据不少于20位。
1. 全1码
2. 全0码(全0码第一位数据为1,后面全为0)
3.1000码
4.31位伪随机码x=[1 1 1 1 1 0 0 1 1 0 1 0 0 1 0 0 0 0 1 0 1 0 1 1 1 0 1 1 0 0 0]