格状编码调制TCM.docx
《格状编码调制TCM.docx》由会员分享,可在线阅读,更多相关《格状编码调制TCM.docx(15页珍藏版)》请在冰豆网上搜索。
格状编码调制TCM
格状编码调制——TCM
格状编码调制是为解决卫星通信中信道噪声对接收的影响及带宽的限制而产生的,其将信道编码与调制很好的结合起来,并且能发挥各自的优点,这种方法在不增加带宽和相同的信息速率下可获得3~6dB的功率增益。
其中信道编码主要使用卷积码,为了适应卷积码则应用了多进制移相键控调制(亦可用多进制QAM),并且根据Ungerboack提出的规律:
对经过编码的调制系统来说,其信道信号数目只要是未经编码的调制系统的两倍,便可得到足够的编码增益,对于每符号传送k比特的系统,应选择有m=2k+1点的扩张信号星座形式传送信息,对于信号集合划分规则等不作太多的阐述,本实验选择k=2,则m=8,即使用8φPSK调制器,为此,TCM结构图如下:
其中为了得到足够大的编码增益,未编码比特为k’=1,对这样的系统卷积码编码器的结构为:
对于卷积码的编码可用以下程序实现:
k=1;
g=[101;001];
int=input('xulie')
m=size(int,1);
y=zeros(1,m)
forn=1:
m
y(:
n)=int(n,1)
end;
z=cnv_encd(g,k,y);
并且在卷积码编码过程中,添零数为k1*(L-1)=2,(注:
L=3),再对序列进行图示的映射,可通过以下程序实现:
tyu=length(z)/2;
s=zeros(1,3*tyu);
fori=1:
m
s(:
3*i-2)=int(i,2)
end
s(:
3*m+1)=0;
s(:
3*(m+1)+1)=0;
forj=1:
tyu
s(:
3*j-1)=z(2*j-1)
end;
fork2=1:
tyu
s(:
3*k2)=z(2*k2)
end;
uu=reshape(s,3,tyu);
kk=uu';
(注意:
对添零后卷积编码的处理),将编码处理后的信号进行调制,相位调制实现比较容易,对于通过信道后的解调,有两种实现途径:
①接收信号通过相关器后,将接收到的信号矢量映射到M个可能发送的信号矢量上去,并且选出对应于最大映射的矢量;②亦可计算接收信号矢量的相位,并从M个可能发送的信号矢量中选出相位最接近的信号。
本实验就是通过第二个途径实现的。
其具体程序如下:
n1=gngauss(sgma);
n2=gngauss(sgma);
fori=1:
tyu
f(i)=bin2deci(kk(i,:
));
u=cos(2*pi*fc*t+2*pi*f(i)/8);
if((f(i)>=3)&(f(i)<7))
R(i)=sqrt(Es)*cos(2*pi*f(i)/8)+n1;
H(i)=sqrt(Es)*sin(2*pi*f(i)/8)+n2;
T(i)=pi+atan(H(i)/R(i))
elseiff(i)<3
R(i)=sqrt(Es)*cos(2*pi*f(i)/8)+n1;
H(i)=sqrt(Es)*sin(2*pi*f(i)/8)+n2;
T(i)=atan(H(i)/R(i))
else
R(i)=sqrt(Es)*cos(2*pi*f(i)/8)+n1;
H(i)=sqrt(Es)*sin(2*pi*f(i)/8)+n2;
T(i)=2*pi+atan(H(i)/R(i))
end;
end;
cc=zeros(tyu,8);
dd=zeros(tyu,8);
fori=1:
tyu
forj=0:
7
cc(i,j+1)=2*pi*j/8-T(i)
dd=abs(cc)
end;
ifdd(i,1)==min(dd(i,:
))
mm(i)=0;
elseifdd(i,2)==min(dd(i,:
))
mm(i)=1;
elseifdd(i,3)==min(dd(i,:
))
mm(i)=2;
elseifdd(i,4)==min(dd(i,:
))
mm(i)=3;
elseifdd(i,5)==min(dd(i,:
))
mm(i)=4;
elseifdd(i,6)==min(dd(i,:
))
mm(i)=5;
elseifdd(i,7)==min(dd(i,:
))
mm(i)=6;
elsedd(i,8)==min(dd(i,:
))
mm(i)=7;
end;
end;
out=reshape(mm,tyu,1)
对于解码则是编码的逆过程,在此将解调后的信号经反映射,变换为卷积码的码序列,应用viterbi实现解码:
k1=size(out,1);
z=zeros(3,k1)
fori=1:
k1
m1=deci2bin(out(i,1),3)
z(:
i)=m1'
end;
hh=reshape(z,1,3*k1)
ty=zeros(k1-2,2);
fori=1:
k1-2
ty(i,2)=hh(:
3*i-2);
end;
forj=1:
k1
hh(:
2*j-1)=[];
end;
[ww,tt,ee]=viterbi(g,k,hh)
fori=1:
k1-2
ty(i,1)=ww(i);
end;
ip=reshape(int,1,2*m);
op=reshape(ty,1,2*m);
当然在此基础上可进行误码率的分析,最简单的方法是将以上ip,op对应元素比较,若不相等,计数器加‘1’,可以使用以下程序如下:
numoferr=0;
forw=1:
2*m
ifip(w)~=op(w)
numoferr=numoferr+1;
end;
end;
对此程序的一点说明:
此程序可实现误码的估计,为了从真正意义上对其优点的认识,可仿真8φPSK的误码性能,可调用以下程序:
function[pb]=smld(snr_in_dB)
N=input(‘number’);
Eb=1;
snr=10^(snr_in_dB/10);
sgma=sqrt(1/(2*snr));
s000=[10];
s001=[sqrt
(2)/2sqrt
(2)/2];
s011=[01];
s010=[-sqrt
(2)/2sqrt
(2)/2];
s110=[-10];
s111=[-sqrt
(2)/2-sqrt
(2)/2];
s101=[0-1];
s100=[sqrt
(2)/2-sqrt
(2)/2];
fori=1:
N,
temp=rand;
if(temp<0.125),
dsource1(i)=0;
dsource2(i)=0;
dsource3(i)=0;
elseif(temp<0.25),
dsource1(i)=0;
dsource2(i)=0;
dsource3(i)=1
elseif(temp<0.375),
dsource1(i)=0;
dsource2(i)=1;
dsource3(i)=0;
elseif(temp<0.5),
dsource1(i)=0;
dsource2(i)=1;
dsource3(i)=1;
elseif(temp<0.625),
dsource1(i)=1;
dsource2(i)=0;
dsource3(i)=0;
elseif(temp<0.75),
dsource1(i)=1;
dsource2(i)=0;
dsource3(i)=1;
elseif(temp<0.875),
dsource1(i)=1;
dsource2(i)=1;
dsource3(i)=0;
else
dsource1(i)=1;
dsource2(i)=1;
dsource3(i)=1;
end;
end;
numoferr=0;
fori=1:
N,
n
(1)=gngauss(sgma);
n
(2)=gngauss(sgma);
if((dsource1(i)==0)&(dsource2(i)==0)&dsource3(i)==0),
r=s000+n;
elseif((dsource1(i)==0)&(dsource2(i)==0)&(dsource3(i)==1)),
r=s001+n;
elseif((dsource1(i)==0)&(dsource2(i)==1)&(dsource3(i)==0)),
r=s010+n;
elseif((dsource1(i)==0)&(dsource2(i)==1)&(dsource3(i)==1)),
r=s011+n;
elseif((dsource1(i)==1)&(dsource2(i)==0)&(dsource3(i)==0)),
r=s100+n;
elseif((dsource1(i)==1)&(dsource2(i)==0)&(dsource3(i)==1)),
r=s101+n;
elseif((dsource1(i)==1)&(dsource2(i)==1)&(dsource3(i)==0)),
r=s110+n;
else((dsource1(i)==1)&(dsource2(i)==1)&(dsource3(i)==1)),
r=s111+n;
end;
c000=dot(r,s000);
c001=dot(r,s001);
c010=dot(r,s010);
c011=dot(r,s011);
c100=dot(r,s100);
c101=dot(r,s101);
c110=dot(r,s110);
c111=dot(r,s111);
c_max=max([c000c001c010c011c100c101c110c111]);
if(c000==c_max),
decis1=0;decis2=0;decis3=0;
elseif(c001==c_max),
decis1=0;decis2=0;decis3=1;
elseif(c010==c_max),
decis1=0;decis2=1;decis3=0;
elseif(c011==c_max)
decis1=0;decis2=1;decis3=1;
elseif(c100==c_max)
decis1=1;decis2=0;decis3=0;
elseif(c101==c_max)
decis1=1;decis2=0;decis3=1;
elseif(c110==c_max)
decis1=1;decis2=1;decis3=0;
else
decis1=1;decis2=1;decis3=1;
end;
if(decis1~=dsource1(i)),
numoferr=numoferr+1;
end;
if(decis2~=dsource2(i)),
numoferr=numoferr+1;
end;
if(decis3~=dsource3(i)),
numoferr=numoferr+1;
end;
end;
pb=numoferr/(3*N);
对TCM的仿真调用程序:
function[p]=smld2(snr_in_dB)
N=input('number');
Es=3;
snr=10^(snr_in_dB/10);
sgma=sqrt(1/(2*snr));
k=1;
g=[101;001];
fori=1:
N,
temp=rand;
if(temp<0.25),
dsource1(i)=0;
dsource2(i)=0;
elseif(temp<0.5)
dsource1(i)=0;
dsource2(i)=1;
elseif(temp<0.75)
dsource1(i)=1;
dsource2(i)=0;
else
dsource1(i)=1;
dsource2(i)=1;
end;
end;
int=zeros(1,2*N);
foro=1:
N,
int(1,2*o-1)=dsource2(o);
end;
forb=1:
N,
int(1,2*b)=dsource1(b);
end;
rrr=reshape(int,2,N);
eee=rrr';
m=size(eee,1);
y=zeros(1,m)
forn=1:
m
y(:
n)=eee(n,1)
end;
z=cnv_encd(g,k,y);
tyu=length(z)/2;
s=zeros(1,3*tyu);
fori=1:
m
s(:
3*i-2)=eee(i,2)
end
s(:
3*N+1)=0;
s(:
3*(N+1)+1)=0;
forj=1:
tyu
s(:
3*j-1)=z(2*j-1);
end;
fork2=1:
tyu
s(:
3*k2)=z(2*k2);
end;
uu=reshape(s,3,tyu);
kk=uu';
n1=gngauss(sgma);
n2=gngauss(sgma)
fori=1:
tyu
f(i)=bin2deci(kk(i,:
));
if((f(i)>=3)&(f(i)<7))
R(i)=sqrt(Es)*cos(2*pi*f(i)/8)+n1;
H(i)=sqrt(Es)*sin(2*pi*f(i)/8)+n2;
T(i)=pi+atan(H(i)/R(i));
elseiff(i)<3
R(i)=sqrt(Es)*cos(2*pi*f(i)/8)+n1;
H(i)=sqrt(Es)*sin(2*pi*f(i)/8)+n2;
T(i)=atan(H(i)/R(i));
else
R(i)=sqrt(Es)*cos(2*pi*f(i)/8)+n1;
H(i)=sqrt(Es)*sin(2*pi*f(i)/8)+n2;
T(i)=2*pi+atan(H(i)/R(i));
end;
end;
cc=zeros(tyu,8);
dd=zeros(tyu,8);
fori=1:
tyu
forj=0:
7
cc(i,j+1)=2*pi*j/8-T(i);
dd=abs(cc);
end;
ifdd(i,1)==min(dd(i,:
))
mm(i)=0;
elseifdd(i,2)==min(dd(i,:
))
mm(i)=1;
elseifdd(i,3)==min(dd(i,:
))
mm(i)=2;
elseifdd(i,4)==min(dd(i,:
))
mm(i)=3;
elseifdd(i,5)==min(dd(i,:
))
mm(i)=4;
elseifdd(i,6)==min(dd(i,:
))
mm(i)=5;
elseifdd(i,7)==min(dd(i,:
))
mm(i)=6;
elsedd(i,8)==min(dd(i,:
))
mm(i)=7;
end;
end;
out=reshape(mm,tyu,1);
k1=size(out,1);
z=zeros(3,k1);
fori=1:
k1
m1=deci2bin(out(i,1),3);
z(:
i)=m1';
end;
hh=reshape(z,1,3*k1);
ty=zeros(k1-2,2);
fori=1:
k1-2
ty(i,2)=hh(:
3*i-2);
end;
forj=1:
k1
hh(:
2*j-1)=[];
end;
[ww,tt,ee]=viterbi(g,k,hh);
fori=1:
k1-2
ty(i,1)=ww(i)
end;
ip=reshape(eee,1,2*N)
op=reshape(ty,1,2*N)
numoferr=0;
forw=1:
2*N,
ifip(w)~=op(w)
numoferr=numoferr+1;
end;
end;
p=numoferr/(2*N)
对误码率图的一点说明,其中‘0’代表不经过信道编码,直接将信号送入8φPSK调制器,解调后对其误码率的仿真,‘*’则代表使用TCM方式后对误码率的仿真,两者对比后与理论之间的差别所产生的原因有以下几点:
①仿真时所取的样点是有局限的,以上两图分别是样点数为200、420点的仿真图,它们的差别就说明了样点数的选择对系统性能的仿真是很重要的;②解调后的判决途径是不一样的,仅用8φPSK方式是采用以上所提到的途径Ⅰ,而TCM方式是途径Ⅱ,虽说两者是等价的,但对于仿真系统还是稍有区别,不过从以上两图可看出TCM对性能的改善。
对于相同的误码率,其的确有所改善。
(注:
对1000点的仿真)