tcm - 网格编码(MATLAB程序) 联系客服

发布时间 : 星期五 文章tcm - 网格编码(MATLAB程序)更新完毕开始阅读48642603eff9aef8941e065d

TCM——格状编码调制

格状编码调制是为解决卫星通信中信道噪声对接收的影响及带宽的限制而产生的,其将信道编码与调制很好的结合起来,并且能发挥各自的优点,这种方法在不增加带宽和相同的信息速率下可获得3~6dB的功率增益。其中信道编码主要使用卷积码,为了适应卷积码则应用了多进制移相键控调制(亦可用多进制QAM),并且根据Ungerboack提出的规律:对经过编码的调制系统来说,其信道信号数目只要是未经编码的调制系统的两倍,便可得到足够的编码增益,对于每符号传送k比特的系统,应选择有m=2k+1点的扩张信号星座形式传送信息,对于信号集合划分规则等不作太多的阐述,本实验选择k=2,则m=8,即使用8QPSK调制器,为此,TCM结构图如下:

最大似然输入卷积码编码器8φPSK调制器信道噪声8φPSK解调器维特比译码器输出

其中为了得到足够大的编码增益,未编码比特为k’=1,对这样的系统卷积码编码器的结构为:

x2R1R2+y2y100110011y00101010101234567去8φPSK 调制器000 0 1111x1

对于卷积码的编码可用以下程序实现:

k=1;

g=[1 0 1;0 0 1]; int=input('xulie') m=size(int,1); y=zeros(1,m) for n=1:m

y(:,n)=int(n,1) end;

z=cnv_encd(g,k,y);

并且在卷积码编码过程中,添零数为k1*(L-1)=2,(注:L=3),再对序列进行图示的映射,可通过以下程序实现:

1

tyu=length(z)/2; s=zeros(1,3*tyu); for i=1:m

s(:,3*i-2)=int(i,2) end

s(:,3*m+1)=0;

s(:,3*(m+1)+1)=0; for j=1:tyu

s(:,3*j-1)=z(2*j-1) end;

for k2=1:tyu

s(:,3*k2)=z(2*k2) end;

uu=reshape(s,3,tyu);

kk=uu';

(注意:对添零后卷积编码的处理),将编码处理后的信号进行调制,相位调制实现比较容易,对于通过信道后的解调,有两种实现途径:①接收信号通过相关器后,将接收到的信号矢量映射到M个可能发送的信号矢量上去,并且选出对应于最大映射的矢量;②亦可计算接收信号矢量的相位,并从M个可能发送的信号矢量中选出相位最接近的信号。本实验就是通过第二个途径实现的。其具体程序如下: n1=gngauss(sgma); n2=gngauss(sgma); for i=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)) elseif f(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;

2

end;

cc=zeros(tyu,8); dd=zeros(tyu,8); for i=1:tyu for j=0:7

cc(i,j+1)=2*pi*j/8-T(i) dd=abs(cc) end;

if dd(i,1)==min(dd(i,:)) mm(i)=0;

elseif dd(i,2)==min(dd(i,:)) mm(i)=1;

elseif dd(i,3)==min(dd(i,:)) mm(i)=2;

elseif dd(i,4)==min(dd(i,:)) mm(i)=3;

elseif dd(i,5)==min(dd(i,:)) mm(i)=4;

elseif dd(i,6)==min(dd(i,:)) mm(i)=5;

elseif dd(i,7)==min(dd(i,:)) mm(i)=6;

else dd(i,8)==min(dd(i,:)) mm(i)=7; end; end;

out=reshape(mm,tyu,1)

对于解码则是编码的逆过程,在此将解调后的信号经反映射,变换为卷积码的码序列,应用viterbi实现解码: k1=size(out,1);输出行数 z=zeros(3,k1) for i=1:k1

m1=deci2bin(out(i,1),3) z(:,i)=m1' end;

hh=reshape(z,1,3*k1) ty=zeros(k1-2,2); for i=1:k1-2

3

ty(i,2)=hh(:,3*i-2); end;

for j=1:k1

hh(:,2*j-1)=[]; end;

[ww,tt,ee]= VITERBI (g,k,hh) for i=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; for w=1:2*m

if ip(w)~=op(w)

numoferr=numoferr+1; end; end;

对此程序的一点说明:此程序可实现误码的估计,为了从真正意义上对其优点的认识,可仿真8QPSK的误码性能,可调用以下程序: function [pb]=smld(snr_in_dB) N=input(‘number’); Eb=1;

snr=10^(snr_in_dB/10); sgma=sqrt(1/(2*snr)); s000=[1 0];

s001=[sqrt(2)/2 sqrt(2)/2]; s011=[0 1];

s010=[-sqrt(2)/2 sqrt(2)/2]; s110=[-1 0];

s111=[-sqrt(2)/2 -sqrt(2)/2]; s101=[0 -1];

s100=[sqrt(2)/2 -sqrt(2)/2]; for i=1:N, temp=rand;

if (temp<0.125), dsource1(i)=0;

4