实验报告
——QPSK 通信系统的Monte Carlo 仿真
马涛、米廷振
一、实验目的
1. 提高学习的能力
2. 培养发现问题,解决问题,分析问题的能力
3. 学习 Matlab 的使用
4. 掌握 4PSK 通信系统的Monte Carlo 仿真方法
5. 掌握 4PSK 通信系统的组成原理
6. 比较编码信号与未编码信号在随机信道中的传输,加深对纠错编码原理的理解。
二、实验原理
1、调制解调原理:
4PSK将四进制符号映射到四种相位,利用相位传递信息。
(1)调制
经变换后可发现一个相位调制信号可以看作两个正交载波Smc和Sms的矢量和,起幅度取决于在每个信号区间内的相位。数字相位调
制信号在几何上可用Smc和Sms的二维向量来表示。
在AWGN 信道中,在一个区间内接受到的带通信号可以表示为
r(t) = um (t)+ n(t) = um (t)+ nc (t)cos(2πfct)− ns (t)sin(2πfct)
=Smc cos(2πfct)-Sms sin(2πfct) + nc (t)cos(2πfct)− ns (t)sin(2πfct)
=rc cos(2πfct)-rs sin(2πfct)
r(t)可用二维向量[rc,rs]表示
(2)解调
有两种方法:
最大投影点准则进行判决:将接收到的信号向量r 投射到M 个可能的传输信号向量{ }
sm 之一上去,并选取对应与最大投影的向量;
最小距离法:分别计算信号到星座图上符号间的距离选取最小距离对应的符号。
2、 信道纠错编码
由发送端的信道编码器在信息码元序列中增加一些监督码元。这些监督码元和信码之间有一定的关系,使接收端可以利用这种关系由信道译码器来发现或纠正可能存在的错码。
汉明码:
发送端按照规定,计算出监督位S1 S2 S3的数值。S1 S2 S3 的值最终与错码位置的对应。
接收端收到每个码组后,先按式(8-2)~(8-4)计算出S1 、S2 和S3 ,再按表
8-2 判断错码情况。按上述方法构造的码称为汉明码。表8-2 中所列的(7,4)汉明码的
最小码距d0 =3,因此,这种码能纠正一个错码或检测两个错码。
三、系统框图
(一)未加信道纠错编码的4PSK 调制通信系统
(二)信道纠错编码(7,4)汉明码+4PSK 调制的通信系统
四、实验过程
(一)未加信道纠错编码的4PSK 调制通信系统
1.实验程序:
主程序(main)
clc
N=100;%码元长度
sigma2=1;
s=source(2*N);%产生信源bit序列,每个码元由2bit构成,故二进制序列长度为2*N
[nc,ns]=nr(sigma2,N);%nr(eb,snr_db,n)
subplot(2,2,1);stem(s,'.');axis([0,2*N,0,1.5]);
[mc,ms]=psk(s);%调制
rc=mc+nc;
rs=ms+ns;
subplot(2,2,2);stem(rc,rs,'.');
r=ipsk(rc,rs);%最大投影法解调
subplot(2,2,3);stem(r,'.');axis([0,2*N,0,1.5]);
[pb,pB]=pe(s,r)%pb,pB分别为误比特率和误码率
rdis=ipskdis(rc,rs);%最小距离法解调
subplot(2,2,4);stem(rdis,'.');axis([0,2*N,0,1.5]);
[pbdis,pBdis]=pe(s,rdis) %pbdis,pBdis分别为误比特率和误码率
子程序: (1)信源(source)
function s=source(N)
s=rand(1,N);%产生二进制序列
for i=1:N
if s(i)>=0.5
s(i)=1;
else
s(i)=0;
end
end
(2)噪声(nr)
function[nc,ns]=nr(sigma2,n) %噪声
sigma=sqrt(sigma2);
for i=1:n
u=rand;
z=sigma*sqrt(2*log10(1/(1-u)));
u=rand;
nc(i)=z*cos(2*pi*u);
ns(i)=z*sin(2*pi*u);
end
(3)调制(psk)
function [mc,ms]=psk(s)
%映射关系:由2bit二进制数转成四进制m=(0,1,2,3)带入映射公式
%mc=1,ms=0----00
%mc=0,ms=1----01
%mc=-1,ms=0----10
%mc=0,ms=-1----11
N=length(s);
for i=1:2:N-1
mc((i+1)/2)=cos(2*pi*(s(i)*2+s(i+1))/4);
ms((i+1)/2)=sin(2*pi*(s(i)*2+s(i+1))/4);
end
(4)最大投影法(ipsk)
function r=ipsk(rc,rs) %最大投影点准则判决
%判断依据:无噪声干扰时rc=mc,ms=rs
%mc=1,ms=0----00--靠近*c轴(abs(rc)>abs(rs))且在第一、四象限
%mc=0,ms=1----01--靠近*s轴(abs(rc)%mc=-1,ms=0----10--靠近*c轴(abs(rc)>abs(rs))且在第二、三象限%mc=0,ms=-1----11--靠近*c轴(abs(rc)j=1;for i=1:length(rc)
if (abs(rc(i))>abs(rs(i)))
if (rc(i)>0)
r(j:j+1)=[0,0];
else
r(j:j+1)=[1,0];
end
else
if(rs(i)>0)
r(j:j+1)=[0,1];
else
r(j:j+1)=[1,1];
end
end
j=j+2;
end
(5)最小距离法(ipskdis)
function r=ipskdis(rc,rs) %最小距离法判决
%判决方法:依次计算出每对rc,rs构成的坐标距离各码元对应坐标的距离
std=[0,0,0,1,1,0,1,1];
k=1;
for i=1:length(rc)
dis(1)=(rc(i)-1)^2+rs(i)^2;
dis(2)=rc(i)^2+(rs(i)-1)^2;
dis(3)=(rc(i)+1)^2+rs(i)^2;
dis(4)=rc(i)^2+(rs(i)+1)^2; %与std中码元的顺序对应求取距离
p=min(dis);% 求得最小距离
for j=1:4
if(dis(j)==p) %得到最小距离的序号,由于dis的标号是与std码元的顺序相对应 %的,因此可由下面的语句得到对应的码元
r(k:k+1)=std(2*j-1:2*j);
k=k+2;
end
end
end
end
(6)误比特率和误码率计算
function [b,B]=pe(s,r)
b=0%误bit率
B=0;%误码元率,每个码元由两个bit构成,>=1个bit错误均会引起1个码元错误
for i=1:length(s)
if(s(i)~=r(i))
b=b+1;
end
end
for i=1:2:length(s)-1
if (s(i)~=r(i))
B=B+1;
elseif((s(i+1)~=r(i+1)))
B=B+1;
end
end
b=b/length(s);
B=B*2/length(s);
2、实验结果:
(1)最大投影点准则、最小距离法进行判决
a, 计算噪声方差σ 2分别为0、0.1、0.5、1.0时的符号差错概率和比特差错概率;
N=100:
噪声方差为0:
pb =
0
pB =
0
pbdis =
0
pBdis =
0
噪声方差为0.1:
pb =
0
pB =
0
pbdis =
0
pBdis =
0
噪声方差为0.5:
pb =
0.0550
pB =
0.0900
pbdis =
0.0550
pBdis =
0.0900
噪声方差为1.0:
pb =
0.2700
pB =
0.3200
pbdis =
0.2700
pBdis =
0.3200
b, 画出在每种σ 2时,在检测器输入端1000 个接收到的信号加噪声的样本(星座图);
N=1000
噪声方差为0:
噪声方差为0.1:
噪声方差为0.5:
噪声方差为1.0:
c, 分别画出数据点为1000、5000、10000、100000 时的Monte Carlo 仿真误比特率曲
线和理论误比特率曲线,比较差别,分析数据点的数量对仿真结果的影响;
主程序:
subplot(2,1,1);
sigma2=[0,0.1,0.5,1];
for N=[1000,5000,10000,100000]
figure;
for i=1:length(sigma2)
s=source(2*N);%²úÉúÐÅÔ´bitÐòÁУ¬Ã¿¸öÂëÔªÓÉ2bit¹¹³É£¬¹Ê¶þ½øÖÆÐòÁ㤶ÈΪ2*N
[nc,ns]=nr(sigma2(i),N);%nr(eb,snr_db,n)
[mc,ms]=psk(s);
rc=mc+nc;
rs=ms+ns;
r=ipsk(rc,rs);
[pb,pB]=pe(s,r);
px(i)=pb;
pq(i)=qfunct(sigma2(i),s);
end
subplot(2,1,1);plot(sigma2,px);hold on;
subplot(2,1,2);plot(sigma2,pq);hold on;
end
子程序
function [y]=Qfunct(sigma2,s)
e=0;
for i=1:length(s)
e=e+s(i)^2;
end
eb=e/length(s);
x=eb/sigma2;
y=(1/2)*erfc(x/sqrt(2));
结果:
sigma2=0:均为0
sigma2=0.1:
sigma2=0.5:
sigma2=1:
(二)信道纠错编码(7,4)汉明码+4PSK 调制的通信系统
1.实验程序:
主程序(main)
clear;
N=100;
sigma2=1;
s=source(2*N); %产生信源bit序列subplot(2,2,1);stem(s,'.');axis([0,2*N,0,1.5]);
%(7,4)汉明码四个原始信息比特一组,若序列长度非4的整数倍,补齐
q=mod(N,4);
if q~=0
s(N+1:N+4-q)=zeros(1,N+4-q);
end
n=length(s);
%加入监督码sham(5:8)对应源信息序列的是s(1:4)和a3-a6,sham(5:8)对应a2-a0
%sham(0)插入一个0,使序列为2(8)的整数倍,以便于4psk调制
for i=(1:n/4)-1
sham(8*i+1)=0;
sham(8*i+5:8*i+8)=s(4*i+1:4*i+4);
[sham(8*i+2),sham(8*i+3),sham(8*i+4)]=watchout(sham(8*i+5),sham(8*i+6),sham(8*i+7),sham(8*i+8));
end
m=length(sham);
[nc,ns]=nr(sigma2,m/2);
[mc,ms]=psk(sham);
rc=mc+nc;
rs=ms+ns;
subplot(2,2,2);stem(rc,rs,'.');
rham=ipsk(rc,rs);
subplot(2,2,3);stem(rham,'.');
rham=checkerror(rham);
r=zeros(1,N*2);
for i=(1:n/4)-1
r(4*i+1:4*i+4)=rham(8*i+5:8*i+8);
end
subplot(2,2,4);stem(r,'.');
[pb,pB]=pe(s,r)
子程序:
(1)信源(source)
function s=source(N)
s=rand(1,N);%产生二进制序列
for i=1:N
if s(i)>=0.5
s(i)=1;
else
s(i)=0;
end
end
(2)噪声(nr)
function[nc,ns]=nr(sigma2,n) %噪声
sigma=sqrt(sigma2);
for i=1:n
u=rand;
z=sigma*sqrt(2*log10(1/(1-u)));
u=rand;
nc(i)=z*cos(2*pi*u);
ns(i)=z*sin(2*pi*u);
end
(3)调制(psk)
function [mc,ms]=psk(s)
%映射关系:由2bit二进制数转成四进制m=(0,1,2,3)带入映射公式
%mc=1,ms=0----00
%mc=0,ms=1----01
%mc=-1,ms=0----10
%mc=0,ms=-1----11
N=length(s);
for i=1:2:N-1
mc((i+1)/2)=cos(2*pi*(s(i)*2+s(i+1))/4);
ms((i+1)/2)=sin(2*pi*(s(i)*2+s(i+1))/4);
end
(4)最大投影法(ipsk)
function r=ipsk(rc,rs) %最大投影点准则判决
%判断依据:无噪声干扰时rc=mc,ms=rs
%mc=1,ms=0----00--靠近*c轴(abs(rc)>abs(rs))且在第一、四象限
%mc=0,ms=1----01--靠近*s轴(abs(rc)%mc=-1,ms=0----10--靠近*c轴(abs(rc)>abs(rs))且在第二、三象限%mc=0,ms=-1----11--靠近*c轴(abs(rc)j=1;for i=1:length(rc)
if (abs(rc(i))>abs(rs(i)))
if (rc(i)>0)
r(j:j+1)=[0,0];
else
r(j:j+1)=[1,0];
end
else
if(rs(i)>0)
r(j:j+1)=[0,1];
else
r(j:j+1)=[1,1];
end
end
j=j+2;
end
(5)误比特率和误码率计算
function [b,B]=pe(s,r)
b=0%误bit率
B=0;%误码元率,每个码元由两个bit构成,>=1个bit错误均会引起1个码元错误
for i=1:length(s)
if(s(i)~=r(i))
b=b+1;
end
end
for i=1:2:length(s)-1
if (s(i)~=r(i))
B=B+1;
elseif((s(i+1)~=r(i+1)))
B=B+1;
end
end
b=b/length(s);
B=B*2/length(s);
(6)加监督码
function [a,b,c]=watchout(d,e,f,g)
std=[0,0,0,0,1,1,1,0,1,1,1,0,1,1,0,1,0,1,0,1,1,0,0,0,1,1,1,1,0,0,0,1,0,0,0,1,0,0,1,0,1,0,1,0,0,1,1,1];
s=d+e*2+f*4+g*8;
a=std(3*s+1);
b=std(3*s+2);
c=std(3*s+3);
(7)纠错
function r=checkerror(rham)
r=rham;
std=[4,3,5,2,6,7,8,1];%001-a0-sham(4);010-a1-sham(3);011-a3-sham(5);
%100-a2-sham(2);101-a4-sham(6);110-a5-sham(7);
%111-a6-sham(8);000-sham(1)
%第一位为插入的无用的0,对最终结果没有影响
n=length(rham);
for i=(1:n/8)-1
s(1)=xor4(rham(i*8+8),rham(i*8+7),rham(i*8+6),rham(i*8+2));
s(2)=xor4(rham(i*8+8),rham(i*8+7),rham(i*8+5),rham(i*8+3));
s(3)=xor4(rham(i*8+8),rham(i*8+6),rham(i*8+5),rham(i*8+4));
s=s(3)+2*s(2)+4*s(1);
if s==0
s=s+8; %第一位为插入的无用的0,对最终结果没有影响
end
k=std(s);
r(i*8+k)=not(rham(i*8+k)); %错码取反进行纠错
end
(8)四输入异或
function s=xor4(a,b,c,d)% 四输入异或
s=xor(a,b);
s=xor(s,c);
s=xor(s,d);
2.实验结果
误码率和误比特率:N=100
星座图:N=1000
噪声方差为0:
pb =
0
pB =
0
噪声方差为0.1:
pb =
0
pB =
0
噪声方差为0.5:
pb =
0.0250
pB =
0.0300
噪声方差为1.0:
pb =
0.1250
pB = 0.2000
比较相同信道状态下的误码性能及星座图可发现:
编码信号的传输的可靠性明显高于无编码信号。这个结果可以看做是通过牺牲有效性来提高了可靠性。