关于信道编码中Turbo码的原理与实现Word文件下载.docx
《关于信道编码中Turbo码的原理与实现Word文件下载.docx》由会员分享,可在线阅读,更多相关《关于信道编码中Turbo码的原理与实现Word文件下载.docx(10页珍藏版)》请在冰豆网上搜索。
但是最大似然译码的复杂性随编码长度的增加而加大,当编码长度趋于无穷大时,最大似然译码是不可能实现的。
所以人们认为随机性编译码仅仅是为证明定理存在性而引人的一种数学方法和手段,在实际的编码构造中是不可能实现的。
直到Turbo的出现,人们才改变了这种看法。
1993年,ClaudBernou等人在国际通信会议(ICC'
93)上提出了并行级联卷积码(PCCC)即Turbo码,由于它很好地应用了Shannon信道编码定理中的随机性编译码条件,从而获得了几乎接近Shannon理论极限的译码性能。
Turbo码巧妙地将两个简单分量码通过伪随机交织器并行级联来构造具有伪随机特性的长码,并通过在两个软输入/软输出(SISO)译码器之间进行多次迭代实现了伪随机译码。
采用迭代译码的方法来提高通信系统的译码性能是Turbo码的最大特点。
Turbo码的编码器、译码器结构繁琐,是一种非常复杂的信道编码方案,这使得对Turbo码的理论分析十分困难,且只能对运算复杂度作宏观分析,对Turbo码的具体实现并没有一个清楚的度量。
因此,使用计算机对Turbo码进行仿真分析是十分必要的。
本文分析了Turbo码编码译码的原理,考虑到Turbo码系统编译码的数据处理量很大,利用生成矩阵对信息序列进行编码、译码时的迭代计算等等,都涉及了矩阵运算,故采用Matlab/Simulink来进行建模仿真。
1Turbo码编码原理
Turbo码的典型编码器如图1所示,Turbo码编码器主要由分量编码器、交织器复接器组成。
分量码一般选择为递归系统卷积(RSC,RecursiveSystematicConvolutional)码[2],当然也可以是分组码(BC,BlockCode)、非递归卷积(NRC,Non-RecursiveConvolutional)码以及非系统卷积(NSC,Non-SystematicConvolutional)码,但从后面的分析将看到,分量码的最佳选择是递归系统卷积码。
通常两个分量码采用相同的生成矩阵,当然分量码也可以是不同的。
以分量码为RSC为例,分量编码器为递归系统卷积码(RSC)编码器。
第一个RSC之前不使用交织器,后续的每个RSC之前都有一个交织器与之对应。
一个Turbo编码器中原则上可采用多个RSC,但通常只选用2个,因为过多的RSC分量编码器将使得译码非常复杂而难以实现。
通常的Turbo码编码器中,长度为N的信息序列
在送入第一个分量编码器的同时作为系统输出
直接送至复接器,同时
经过一个N位交织器,形成一个新序列
(长度与内容没变,但比特位置经过重新排列。
与
分别传送到两个分量码编器(RSC1与RSC2)。
一般情况下,两个分量码编码器的结构相同,生成分量码校验序列
和
。
与未编码的信息序列
经过复接后,生成Turbo码序列
,将编码序列调制后,即可发射进入信道传输。
2Matlab仿真及结果
2.1Turbo码仿真系统的实现
Turbo码是经过模拟仿真来的,而不是根据既定的设计准则得到的。
许多研究者正寻找其工作机理以便更好为Turbo码的构造提供理论依据。
至到现在Turbo码的研究成果很大一部分是通过对各种参数的模拟性能结果中得到的。
模拟仿真时,衡量其编码性能的好坏主要以误码率BER(BitErrorRate)来的。
仿真中使用加性高斯白噪声信道(AWGN)模型,因为它易于构建,也是具有代表性的信道模型之一,同时假设使用BPSK调制方式。
根据Turbo码系统的结构特点,将整个Turbo编译码系统合理地划分成多个模块,使用MATLAB通过模块化设计实现了可以用于计算机模拟的Turbo编译码系统。
系统所包涵的模块具体划分为:
主程序、信道模型子程序、交织子程序、RSC编码子程序、使用不同的算法进行译码的译码子程序等。
根据Turbo码系统的结构特点,本文将整个Turbo编译码系统合理地划分成多个模块,使用MATLAB通过模块化设计实现了可以用于计算机模拟的Turbo编译码系统。
主程序控制着整个系统的流程。
主程序首先完成对系统的先期设置,包括分量RSC的生成矩阵、帧大小(即交织器的大小)、迭代次数、使用何种译码算法等等。
然后,随即生成
信息源,调用各子程序完成编码、传输以及译码的过程。
交织子程序供主程序调用,主要完成对信息比特序列进行位置的随机置换,并提供给RSC2进行编码。
对每帧进行置换的格式将保存下来,以便在译码过程中进行正确的解交织。
RSC编码子程序供主程序调用,完成编码。
网格图生成子程序供译码子程序调用,用于生成给定生成矩阵对应的网格图。
对一帧编码的子程序供RSC编码子程序调用,用于对一帧的信息比特编码。
对一位信息比特编码子程序供对一帧编码的子程序调用,用于对单个输入比特进行编码。
信道模型及复用调制子程序供主程序调用,用于生成信道模型,将两个RSC分量编码器编码序列和信息序列进行复用,根据需要的码率组成整个编码器的编码结果,然后使用AWGN信道模型将编码序列进行调制,模拟进入信道传输。
译码前解复用子程序供主程序调用,用于从模拟信道接收观测序列,并将观测序列解复用,分解成系统比特序列和两个校验序列。
译码子程序同主程序调用,用于实现具体的译码算法,对观测序列进行译码。
2.2Turbo码的仿真结果及分析
影响Turbo码性能的参数很多,这里分别就不同的译码算法、迭代次数、交织长度对Turbo码性能的影响进行分析,给出仿真结果。
2.2.1不同译码算法对Turbo码的性能影响
图6给出了采用不同译码算法下的Turbo码仿真结果。
Turbo码码率为1/3,Log-Map算法和MAX-Log-Map算法译码迭代次数为3。
从图中可以观察到Log-MAP译码算法性能明显要优于MAX-Log-MAP和SOVA。
在误码率为10-4时,Log-MAP译码算法比MAX-Log-Map译码算法好0.4dB,比SOVA好2dB以上。
Max-Log-MAP算法用到了近似公式,故性能比Log-MAP有所下降。
验证了译码算法性能MAP>
Log-MAP>
MAX-Log-MAP>
SOVA的结论。
SOVA算法虽然性能是几种算法中最差的,但复杂性较低易于实现。
在实际运用中,要结合具体的情况,权衡硬件的复杂度和性能要求,选择合适的译码算法。
图6不同译码算法对Turbo码的影响
2.2.2迭代次数
图7迭代次数对Turbo码的影响
图7给出了不同迭代次数下,Turbo码的误比特率与信噪比的关系曲线,采用MAX-Log-MAP算法,码率为
从图7所示的仿真结果可以看出,随着迭代次数的增加,Turbo码的误比特率曲线不断降低并趋于收敛;
而且随着信噪比的增加,迭代对误比特率性能的影响越来越明显。
这是Turbo码通过迭代译码充分利用冗余信息来提高编译码性能这一特点的反映。
最初,迭代译码的增益较高,但随着迭代次数的增加,译码增益增长相对缓慢,虽然继续增加迭代次数可以提高Turbo码的性能,但权衡迭代所需要的时间、性能改善的幅度,我们通常都选取合适的迭代次数。
2.2.3交织长度
图8交织长度对Turbo码的影响
图8给出了不同交织长度下,Turbo码的误比特率与信噪比的关系曲线。
从图8中可以看出,交织长度越大,性能就越好,而且交织长度对性能的影响是很大的,这是由于交织器的存在所产生的所谓交织增益,使得Turbo码的性能随交织长度的增长而改善且在交织长度足够长时接近信道容量。
交织长度是决定Turbo码性能的一个重要因素。
但是与Turbo码不同,卷积码的一个优点在于只要帧长远大于码的约束长度,其性能就与帧长没有关系,另外,Turbo码性能的另一个重要因素是迭代译码所产生的译码复杂度,所以我们有必要在短帧的情况下,将Turbo码与采用最大似然译码算法的卷积码纠错性能和复杂度作一个比较。
在高斯信道环境下作了仿真比较,得到在同样信噪比的条件下,要达到
级BER的要求时,卷积码的复杂度小于Turbo码,在瑞利衰落信道下,结论也相似。
短帧传输有着广泛的应用,诸如在移动通信中,话音和控制信息通常采用小于300比特的短帧,通常话音和信令的误码率要求在
到
之间。
由上述结论可知,在对帧长有要求的移动通信系统中,在一定的误码率要求下,Turbo码并不是最佳的准则,在考虑译码复杂度的情况下,卷积码反而比Turbo码具有更好的性能。
反之,对于帧长较长的情况下,采用Turbo码将更有优势。
同时,我们还应该注意到交织深度和编译码时延之间还存在着一个兼顾的问题。
Turbo码的时延包括编码时延、码组传输时延、译码器时延及交织和解交织时延。
交织长度越长,时延也越大。
通信系统中,时延是个很重要的因素,实时的通信系统中总是对时延提出了较高的要求。
在实际的应用中,需要根据时延的要求来确定最佳的码长。
5结束语
Turbo码的出现为信道编码理论和实践带来了一场革命,在理论上,它有着不同于以往的结构,使通过可译码编码逼近信道容量成为可能;
在实践上,只要时延和复杂度允许,Turbo码可在各种恶劣条件下提供接近极限的通信能力。
Turbo码在中高噪声的应用环境中的性能比以往其他的信道编码要好很多,这是它的一大优点。
但是,Turbo码也有自己的不足:
(1)计算量大,要得到高码率,往往需要很大的交织器,这就增加了译码的复杂性,而较短的交织器不可能达到高码率,因此往往要根据实际需要来确定码率和计算复杂性之间的平衡来设计相应的Turbo码。
(2)由交织和迭代译码造成的时延使Turbo码在某些对时延要求高的通信系统(如数字电话、数字音像广播、数据包通信、太空通信等)中的应用受到限制。
(3)理论分析困难,至今尚未有对Turbo码译码复杂性,比特误码率完整的理论分析和估计。
一般是通过数值模拟与单个卷积码、乘积码、级联码比较或不同译码方法之间的性能比较。
参考文献
[1]王会,王忠.Turbo码性能分析与仿真[D].成都:
四川大学,2002.
[2]陈朝,陈芳,周峰.一种基于Matlat的Turbo码编码仿真实现[J].信息与电子工程,2005,3(3):
179--181.
[3]邓华.Matlat,通信仿真及应用实例详解[M].北京:
人民邮电出版社2003.
[4]周贤伟,赵欣,王丽娜.使用Simulink构建Turbo码仿真系统[J].微计算机信息,2006,22(1s):
202-204.
[5]钟麟,王峰.Matlal,仿真技术与应用教程[M].北京:
国防工业出版社,2004.
附录:
核心源码展示:
Logmap.m
functionL_all=logmapo(rec_s,g,L_a,ind_dec)
L_total=length(rec_s)/2;
%系统信息/校验信息的长度
[n,K]=size(g);
m=K-1;
%编码器移位寄存器个数
nstates=2^m;
%编码网格图状态数
%建立网格图,得到网格图上前一个输出比特及状态、下一个输出比特及状态
[next_out,next_state,last_out,last_state]=trellis(g);
Infty=1e10;
%定义无穷大
%初始化Alpha
Alpha(1,1)=0;
Alpha(1,2:
nstates)=-Infty*ones(1,nstates-1);
%初始化beta,第一个分量码的网格图归零,第二个不归零
ifind_dec==1
Beta(L_total,1)=0;
Beta(L_total,2:
elseifind_dec==2
Beta(L_total,1:
nstates)=zeros(1,nstates);
end
%前向递推计算alpha值
fork=2:
L_total+1
forstate2=1:
nstates
gamma=-Infty*ones(1,nstates);
%计算输入为0时的gamma值;
gamma(last_state(state2,1))=(-rec_s(2*k-3)+rec_s(2*k2)*last_out(state2,2))....
-log(1+exp(L_a(k-1)));
%计算输入为1时的gamma的值;
gamma(last_state(state2,2))=(rec_s(2*k-3)+rec_s(2*k-2)*last_out(state2,4))....
+L_a(k-1)-log(1+exp(L_a(k-1)));
%根据gamma值和前一时刻的alpha值计算前向递推计算当前时刻的alpha值
if(sum(exp(gamma+Alpha(k-1,:
)))<
1e-300)
Alpha(k,state2)=-Infty;
else
Alpha(k,state2)=log(sum(exp(gamma+Alpha(k-1,:
))));
end
end
%alpha值归一化,对数形式为减去最大值
tempmax(k)=max(Alpha(k,:
));
Alpha(k,:
)=Alpha(k,:
)-tempmax(k);
end
%后向递推计算beta值
fork=L_total-1:
-1:
1
forstate1=1:
%输入为0时的gamma值
gamma(next_state(state1,1))=(-rec_s(2*k+1)+rec_s(2*k+2)*next_out(state1,2))....
-log(1+exp(L_a(k+1)));
%输入为1时的gamma值
gamma(next_state(state1,2))=(rec_s(2*k+1)+rec_s(2*k+2)*next_out(state1,4))....
+L_a(k+1)-log(1+exp(L_a(k+1)));
%根据gamma值和前一时刻的beta值计算前向递推计算当前时刻的beta值
if(sum(exp(gamma+Beta(k+1,:
Beta(k,state1)=-Infty;
Beta(k,state1)=log(sum(exp(gamma+Beta(k+1,:
))));
%beta值归一化,对数形式为减去最大值
Beta(k,:
)=Beta(k,:
)-tempmax(k+1);
%计算对数似然比形式的软输出
fork=1:
L_total
gamma0=(-rec_s(2*k-1)+rec_s(2*k)*last_out(state2,2))....
-log(1+exp(L_a(k)));
gamma1=(rec_s(2*k-1)+rec_s(2*k)*last_out(state2,4))...
+L_a(k)-log(1+exp(L_a(k)));
temp0(state2)=exp(gamma0+Alpha(k,last_state(state2,1))+Beta(k,state2));
temp1(state2)=exp(gamma1+Alpha(k,last_state(state2,2))+Beta(k,state2));
L_all(k)=log(sum(temp1))-log(sum(temp0));