QPSK系统的Monte Carlo 仿真
一、实验目的
1、提高独立学习的能力;
2、培养发现问题、解决问题和分析问题的能力; 3、学习Matlab 的使用;
4、掌握4PSK通信系统的Monte Carlo仿真方法; 5、掌握4PSK通信系统的的组成原理;
6、比较编码信号和为编码信号在随机信道中的传输,加深对纠错编码的理解;
二、实验原理
1. Qpsk基本原理 1)调制原理
在数字相位调制中,M个信号波形可表示为
j2p(m-1)/Mj2pfctùsmt=Reégteeëû()()(éù2pm-1ú =g(t)cosê2pfct+Mëû()
=g(t)cos2p2pm-1cos2pfct-g(t)sinm-1sin2pfctMM)()(m=1,2,…,M,0£t£T)可以表示为 2) QPSK相位解调与检测
从AWGN信道中,在一个信号区间内接收到的带宽信号可以表示为
rtum(t)n(t)um(t)nc(t)cos(2fct)ns(t)sin(2fct)
这里nc(t)和ns(t)是加性噪声的两个正交分量。接收到的信号可以表示为:
r=sm+n=(xscos2pm2pm+ncxssin+ns)E(nc)E(ns)0和E(ncns)0。nc和MMN0 2ns的方差是E(nc2)E(ns2)本实验中在QPSK和8PSK时,有一个45°的初相。并且采用的是格雷码,为了和理论上的计算结果相比较。 2.判决方法
1)最小欧式距离判决
若采用最小欧式判决准则,则需要计算接收到的向量r到M个可能的传输信号向量{sm}的距离,并选取距离最小的对应点。 2)理论误码率
在AWGN信道中,因为二相相位调制与二进制PAM是相同的,所以差错概率为
2bP2QN0,式中b是每比特的能量。本实验中我们将其归一化为1。 3.(7,4)汉明码编码原理
1)监督码的确定
我们用a6,a5……a0表示这7个码 元 ,a6-a3是信息位,a2-a0是监督位。
a2=a6Åa5Åa4a1=a6Åa5Åa3 (2) a0=a6Åa4Åa3已知信息码后,直接按上式可算出监督码,计算结果得出16个码组列于表2中。
表1 信息码 监督码 信息码 监督码 a6a5a4a3 0000 0001 0010 0011 0100 0101 0110 0111 a1a2a3 000 011 101 110 110 101 011 000 a6a5a4a3 1000 1001 1010 1011 1100 1101 1110 1111 a1a2a3 111 100 010 001 001 010 100 111 2)校正因子
校正因子s1,s2,s3分别为:
s1=a6Åa5Åa4Åa2s2=a6Åa5Åa3Åa1 (2) s3=a6Åa4Åa3Åa0下表为校正因子与误码位置的关系表:
表2
S1 S2 S3 001 010 100 错码位置 a0 a1 a2 S1 S2 S3 101 110 111 错码位置 a4 a5 a6 011 a3 000 无错 3)解码过程 接收端收到每个码组后,先利用式2求出s2,s1,s0,再利用表2确定错误的码位并且改正。然后进行译码,也就是取7位中的后四位。
二.实验系统框图
未加信道纠错编码的QPSK调制通信系统
信道纠错编码(7,4)汉明码+QPSK调制通信系统
三、实验内容
(一)QPSK和8PSK系统
实验主程序:
clc;clear all; M=20;
A=linspace(-5,10,M);%用于产生-5,10之间的20点行矢量
sgma=sqrt(1/2*10.^(-A/10)); for i=1:M
N=100000; %产生均匀随机序列a a=rand(1,N); for n=1:N if a(n)>=0.5 a(n)=1; else a(n)=0; end End
%按格雷码映射为QPSK调制
[b,c,xc,xs]=yingshe(N,a);
%产生两路正交的高斯噪声分量nc,ns for n=1:N/2 u=rand;
z=sgma(i)*sqrt(2*log10(1./(1-u))); u=rand;
nc(n)=z.*cos(2*pi*u); ns(n)=z.*sin(2*pi*u); End
%产生信道输出信号rc,rs
rc=xc+nc; rs=xs+ns;
%用最小欧氏距离法恢复原序列
[b1,c1]=zuixiaojuli(rc,rs,N);
%求误符号率和误码率
[bitpercent,sympercent]=error_percent(N,b,c,b1,c1); bp(i)=bitpercent; sp(i)=sympercent; End
%求理论差错概率
theosp=erfc(sqrt(10.^(A/10)));
%显示4psk的误比特率和误符号率 semilogy (A,bp,'*'); hold;
semilogy (A,sp,'o');
semilogy (A,theosp,'-'); grid
xlabel('Eb/No in dB')
ylabel('error probability') title('4PSK通信系统的蒙特卡洛仿真') gtext('理论误码率 -') gtext('误比特率 *') gtext('误符号率 o')
子程序:
function [b,c,xc,xs]=yingshe(N,a); for n=1:N/2
b(n)=a(2*n-1); c(n)=a(2*n);
if (b(n)==0&&c(n)==0) xc(n)=1; xs(n)=1;
else if (b(n)==0&&c(n)==1) xc(n)=-1; xs(n)=1;
else if(b(n)==1&&c(n)==1) xc(n)=-1; xs(n)=-1; else xc(n)=1; xs(n)=-1; end end end end
function [b1,c1]=zuixiaojuli(rc,rs,N); for n=1:N/2
d0=sqrt((rc(n)-1)^2+(rs(n)-1)^2); d1=sqrt((rc(n)+1)^2+(rs(n)-1)^2); d2=sqrt((rc(n)+1)^2+(rs(n)+1)^2); d3=sqrt((rc(n)-1)^2+(rs(n)+1)^2); d=min([d0 d1 d2 d3]); if d==d0 b1(n)=0; c1(n)=0; else if d==d1 b1(n)=0; c1(n)=1; else if d==d2
b1(n)=1; c1(n)=1; else b1(n)=1; c1(n)=0; end end end end end
function [bitpercent,sympercent]=error_percent(N,b,c,b1,c1); biterror=0; symtrue=0; for n=1:N/2
if (b(n)~=b1(n))
biterror=biterror+1; end
if (c(n)~=c1(n))
biterror=biterror+1; end
if ((b(n)==b1(n))&&(c(n)==c1(n))) symtrue=symtrue+1; end end
symerror=N/2-symtrue; bitpercent=biterror/N;
sympercent=symerror/(N/2); end
1004PSK通信系统的蒙特卡洛仿真10-110-2error probability10-3理论误码率 -10-4误比特率 *误符号率 o10-510-6-50Eb/No in dB510
8PSK实验主程序:
clc;clear all; M=20;
A=linspace(0,10,M);
sgma=sqrt(10.^(-A/10)/2); for i=1:M
N=100000; a=rand(1,N); for n=1:N
if (a(n)>=0.5) a(n)=1; else a(n)=0; end end
[b,c,d,xc,xs]=yingshe(N,a); %产生两路正交的高斯噪声分量nc,ns for n=1:N/3 u=rand;
z=sgma(i)*sqrt(2*log10(1./(1-u))); u=rand;
nc(n)=z.*cos(2*pi*u); ns(n)=z.*sin(2*pi*u); end
rc=xc+nc; rs=xs+ns;
%用最小欧氏距离法恢复原序列
[b1,c1,d1]=zuixiaojuli(rc,rs,N);
%求误符号率和误码率
[bitpercent,sympercent]=error_percent(N,b,c,d,b1,c1,d1);
for p=1:M
theosp(p)=erfc(sqrt(3*10.^(A(p)/10))*sin(pi/8)); end
semilogy (A,bp,'*'); hold;
semilogy (A,sp,'o');
semilogy (A,theosp,'-'); grid
xlabel('Eb/No in dB')
ylabel('error probability') title('8PSK通信系统的蒙特卡洛仿真') gtext('理论误码率 -') gtext('误比特率 *') gtext('误符号率 o')
子程序:
function [b,c,d,xc,xs]=yingshe(N,a); for n=1:N/3
b(n)=a(3*n-2); c(n)=a(3*n-1); d(n)=a(3*n);
if ((b(n)==0)&(c(n)==0)&(d(n)==0)) xc(n)=sqrt(6)/2; xs(n)=sqrt(6)/2;
elseif ((b(n)==0)&(c(n)==0)&(d(n)==1)) xc(n)=0;
xs(n)=sqrt(3);
elseif((b(n)==0)&(c(n)==1)&(d(n)==1)) xc(n)=-sqrt(6)/2; xs(n)=sqrt(6)/2;
elseif((b(n)==0)&(c(n)==1)&(d(n)==0)) xc(n)=-sqrt(3); xs(n)=0;
elseif((b(n)==1)&(c(n)==1)&(d(n)==0))
xc(n)=-sqrt(6)/2; xs(n)=-sqrt(6)/2;
elseif((b(n)==1)&(c(n)==1)&(d(n)==1)) xc(n)=0;
xs(n)=-sqrt(3);
elseif((b(n)==1)&(c(n)==0)&(d(n)==1)) xc(n)=sqrt(6)/2; xs(n)=-sqrt(6)/2; else
xc(n)=sqrt(3); xs(n)=0; end
end end
function [b1,c1,d1]=zuixiaojuli(rc,rs,N); for n=1:N/3
d00=sqrt((rc(n)-sqrt(6)/2)^2+(rs(n)-sqrt(6)/2)^2); d01=sqrt((rc(n))^2+(rs(n)-sqrt(3))^2);
d02=sqrt((rc(n)+sqrt(6)/2)^2+(rs(n)-sqrt(6)/2)^2); d03=sqrt((rc(n)+sqrt(3))^2+(rs(n))^2);
d04=sqrt((rc(n)+sqrt(6)/2)^2+(rs(n)+sqrt(6)/2)^2); d05=sqrt((rc(n))^2+(rs(n)+sqrt(3))^2);
d06=sqrt((rc(n)-sqrt(6)/2)^2+(rs(n)+sqrt(6)/2)^2); d07=sqrt((rc(n)-sqrt(3))^2+(rs(n))^2); e=min([d00 d01 d02 d03 d04 d05 d06 d07]); if e==d00 b1(n)=0; c1(n)=0; d1(n)=0; elseif e==d01 b1(n)=0; c1(n)=0; d1(n)=1; elseif e==d02 b1(n)=0; c1(n)=1; d1(n)=1; elseif e==d03 b1(n)=0; c1(n)=1; d1(n)=0; elseif e==d04
b1(n)=1; c1(n)=1; d1(n)=0; elseif e==d05 b1(n)=1; c1(n)=1; d1(n)=1; elseif e==d06 b1(n)=1; c1(n)=0; d1(n)=1; else
b1(n)=1; c1(n)=0; d1(n)=0;
end end end
Function [bitpercent,sympercent]=error_percent(N,b,c,b1,c1); biterror=0; symtrue=0; for n=1:N/3
if (b(n)~=b1(n))
biterror=biterror+1; end
if (c(n)~=c1(n))
biterror=biterror+1; end
if (d(n)~=d1(n))
biterror=biterror+1; end
if ((b(n)==b1(n))&&(c(n)==c1(n))&&(d(n)==d1(n))) symtrue=symtrue+1; end end
symerror=N/3-symtrue; bitpercent=biterror/N;
sympercent=symerror/(N/3); bp(i)=bitpercent; sp(i)=sympercent; end end
1008PSK通信系统的蒙特卡洛仿真10-1error probability10-210-310-4理论误码率 -误比特率 *误符号率 o10-50123456Eb/No in dB78910
结论:同一Eb/N0下,QPSK的误码率比8PSK的误码率小。误码率要比误比特率大。
(二)汉明编码
实验主程序:
clc;close all ;clear; J=30;
SNR=linspace(-5,5,J);%用于产生-5,10之间的20点行矢量 sgma=sqrt(1/2*10.^(-SNR/10)); N=input('信源序列长度 N='); for k=1:J
%产生两路二进制均匀随机序列a,b [a,b]=bi_ab(N);
%并串序列转换 M=2*N;
[x]=seri_x(N,M,a,b);
%汉明编码
[p]=encode(M,x);
%p序列串并转换为a1,b1两个并联序列 L=1/2*length(p);
[a1,b1]=paral_a1b1(L,p);
%将两路二进制序列a,b,a1,b1转换为四进制序列m,m1 [m]=quart_m(N,a,b); [m1]=quart_m(L,a1,b1);
%将四进制信号m,m1按格雷码映射为QPSK调制sm,sm1 [sm]=four_psk(N,m); [sm1]=four_psk(L,m1);
%产生两路正交的高斯噪声分量n,n1 nc=zeros(1,N); ns=zeros(1,N); for i=1:N u=rand;
z=sgma(k)*sqrt(2*log10(1/(1-u))); u=rand;
nc(i)=z.*cos(2*pi*u); ns(i)=z.*sin(2*pi*u); end;
n=zeros(2,N); n(1,:)=nc; n(2,:)=ns;
nc1=zeros(1,L); ns1=zeros(1,L); for i=1:L u=rand;
z=sgma(k)*sqrt(2*log10(1/(1-u))); u=rand;
nc1(i)=z.*cos(2*pi*u); ns1(i)=z.*sin(2*pi*u); end;
n1=zeros(2,L); n1(1,:)=nc1; n1(2,:)=ns1;
%产生信道输出信号r,r1 r=zeros(2,N); r=sm+n;
r1=zeros(2,L); r1=sm1+n1;
%求最小欧氏距离恢复四进制序列c,c1 [c]=recover_quart(N,r); [c1]=recover_quart(L,r1);
%四进制信号c,c1转换为二进制信号y,y1 [y]=recover_bi(N,c); [y1]=recover_bi(L,c1);
%纠错
[y1]=correct(y1);
%汉明解码
[q]=decode(M,y1);
%求误符号率和误码率
[smbpercent,bitpercent]=error_percent(N,x,y,a,b); ps(k)=smbpercent;pb(k)=bitpercent;
[smbpercent1,bitpercent1]=error_percent(N,x,q,a,b); ps1(k)=smbpercent1;pb1(k)=bitpercent1; end;
%显示4psk的误比特率和误符号率
semilogy (SNR,pb,'-*',SNR,ps,':s',SNR,pb1,'-o',SNR,ps1,'-+'); legend('未编码误比特率','未编码误符号率','编码后误比特率','编码后误符号率');
xlabel('Eb/No(dB)'); ylabel('BER');
title('4PSK通信系统的蒙特卡洛仿真');
显示图像: (N=100000)
1004PSK通信系统的蒙特卡洛仿真 未编码误比特率未编码误符号率编码后误比特率编码后误符号率10-110-2BER10-310-410-510 -5-6-4-3-2-101Eb/No(dB)2345
因篇幅问题不能全部显示,请点此查看更多更全内容