Turbo码的编码原理及实现
摘要
纠错码技术作为改善数字通信可靠性的一种有效手段,在数字通信的各个领域中获得极为广泛的应用。Turbo码是并行级联递归系统卷积码,在接近Shannon限的低信噪比下能获得较低的误码率,现已被很多系统所采用。本文分析了Turbo码编码译码的原理,为了使Turbo码仿真更容易,研究并建立了基于Matlab中Simulink通信模块的Turbo码仿真模型。使用所建立的模型进行仿真,结果表明,在信噪比相同的情况下,交织长度越大、迭代次数越多、译码算法越优,Turbo码性能越好,设计实际系统时,应综合考虑各因素。
关键词:Turbo码;Simulink仿真;交织长度;迭代次数
Abstract
As an effective means to improve the reliability of digital communication, error correcting code technology is widely used in the field of digital communication.Turbo code is a parallel concatenated recursive systematic convolutional code, which can obtain lower bit error rate in the low SNR near Shannon limit,which is now used by many systems.In this paper,the principle of Turbo coding and decoding is analyzed,in order to make the Turbo Code simulation easier,a Turbo code simulation model based on Simulink module of Matlab is studied. Simulation result using the established model shows that the longer interleaving length,the more iteration times and the better decoding algorithm bring the better Turbo code performance with the same SNR value.
Keywords:Turbo code;Simulink simulation;Interleaving length;Iteration times;
引言
根据Shanno噪信道编码定理,在信道传输速率R不超过信道容量C的前提下,只有在码组长度无限的码集合中随机地选择编码码字并且在接收端采用最大似然译码算法时,才能使误码率接近为零。但是最大似然译码的复杂性随编码长度的增加而加大,当编码长度趋于无穷大时,最大似然译码是不可能实现的。所以人们认为随机性编译码仅仅是为证明定理存在性而引人的一种数学方法和手段,在实际的编码构造中是不可能实现的。直到Turbo的出现,人们才改变了这种看法。1993年,Claud Bernou等人在国际通信会议(ICC' 93)上提出了并行级联卷积码(PCCC)即Turbo码,由于它很好地应用了Shannon信道编码定理中的随机性编译码条件,从而获得了几乎接近Shannon理论极限的译码性能。
Turbo码巧妙地将两个简单分量码通过伪随机交织器并行级联来构造具有伪随机特性的长码,并通过在两个软输入/软输出( SISO)译码器之间进行多次迭代实现了伪随机译码。采用迭代译码的方法来提高通信系统的译码性能是Turbo码的最大特点。Turbo码的编码器、译码器结构繁琐,是一种非常复杂的信道编码方案,这使得对Turbo码的理论分析十分困难,且只能对运算复杂度作宏观分析,对Turbo码的具体实现并没有一个清楚的度量。因此,使用计算机对Turbo码进行仿真分析是十分必要的。本文分析了Turbo码编码译码的原理,考虑到Turbo码系统编译码的数据处理量很大,利用生成矩阵对信息序列进行编码、译码时的迭代计算等等,都涉及了矩阵运算,故采用Matlab/Simulink来进行建模仿真。
1 Turbo码编码原理
Turbo码的典型编码器如图1所示,Turbo码编码器主要由分量编码器、交织器复接器组成。分量码一般选择为递归系统卷积(RSC,Recursive Systematic Convolutional)码[2],当然也可以是分组码(BC, Block Code)、非递归卷积(NRC,Non-Recursive Convolutional)码以及非系统卷积(NSC,Non-Systematic Convolutional)码,但从后面的分析将看到,分量码的最佳选择是递归系统卷积码。通常两个分量码采用相同的生成矩阵,当然分量码也可以是不同的。
以分量码为RSC为例,分量编码器为递归系统卷积码(RSC)编码器。第一个RSC之前不使用交织器,后续的每个RSC之前都有一个交织器与之对应。一个Turbo编码器中原则上可采用多个RSC,但通常只选用2个,因为过多的RSC分量编码器将使得译码非常复杂而难以实现。通常的Turbo码编码器中,长度为N的信息序列?uk?在送入第一个分量编码器的同时作为系统输出xks直
'接送至复接器,同时?uk?经过一个N位交织器,形成一个新序列uk(长度与内'容没变,但比特位置经过重新排列。?uk?与uk分别传送到两个分量码编器
??????(RSC1与RSC2)。一般情况下,两个分量码编码器的结构相同,生成分量码校
'p2p验序列x1和xk。?uk?uk与未编码的信息序列xks经过复接后,生成Turbok????????码序列?ck?,将编码序列调制后,即可发射进入信道传输。
?uk??xks? 复 接
交织器 分量编码器CRS1 ?ck? ?x? 1pk分量编码器
2 Matlab仿真及结果 2.1 Turbo码仿真系统的实现
Turbo码是经过模拟仿真来的,而不是根据既定的设计准则得到的。许多研究者正寻找其工作机理以便更好为Turbo码的构造提供理论依据。至到现在Turbo码的研究成果很大一部分是通过对各种参数的模拟性能结果中得到的。模拟仿真时,衡量其编码性能的好坏主要以误码率BER(Bit Error Rate)来的。仿真中使用加性高斯白噪声信道(AWGN)模型,因为它易于构建,也是具有代表性的信道模型之一,同时假设使用BPSK调制方式。根据Turbo码系统的结构特点,将整个Turbo编译码系统合理地划分成多个模块,使用MATLAB通过模块化设计实现了可以用于计算机模拟的Turbo编译码系统。系统所包涵的模块具体划分为:主程序、信道模型子程序、交织子程序、RSC编码子程序、使用不同的算法进行译码的译码子程序等。
仿真中使用加性高斯白噪声信道(AWGN)模型,因为它易于构建,也是具有代表性的信道模型之一,同时假设使用BPSK调制方式。根据Turbo码系统的结构特点,本文将整个Turbo编译码系统合理地划分成多个模块,使用MATLAB通过模块化设计实现了可以用于计算机模拟的Turbo编译码系统。系统所包涵的模块具体划分为:主程序、信道模型子程序、交织子程序、RSC编码子程序、使用不同的算法进行译码的译码子程序等。
主程序控制着整个系统的流程。主程序首先完成对系统的先期设置,包括分量RSC的生成矩阵、帧大小(即交织器的大小)、迭代次数、使用何种译码算法等
1,0?信息源,等。然后,随即生成?调用各子程序完成编码、传输以及译码的过程。
仿真中使用加性高斯白噪声信道(AWGN)模型,因为它易于构建,也是具有代表性的信道模型之一,同时假设使用BPSK调制方式。根据Turbo码系统的结构特点,本文将整个Turbo编译码系统合理地划分成多个模块,使用MATLAB通过模块化设计实现了可以用于计算机模拟的Turbo编译码系统。系统所包涵的模块具体划分为:主程序、信道模型子程序、交织子程序、RSC编码子程序、使用不同的算法进行译码的译码子程序等。
交织子程序供主程序调用,主要完成对信息比特序列进行位置的随机置换,并提供给RSC2进行编码。对每帧进行置换的格式将保存下来,以便在译码过程中进行正确的解交织。RSC编码子程序供主程序调用,完成编码。网格图生成子程序供译码子程序调用,用于生成给定生成矩阵对应的网格图。对一帧编码的子程序供RSC编码子程序调用,用于对一帧的信息比特编码。对一位信息比特编码
子程序供对一帧编码的子程序调用,用于对单个输入比特进行编码。信道模型及复用调制子程序供主程序调用,用于生成信道模型,将两个RSC分量编码器编码序列和信息序列进行复用,根据需要的码率组成整个编码器的编码结果,然后使用AWGN信道模型将编码序列进行调制,模拟进入信道传输。译码前解复用子程序供主程序调用,用于从模拟信道接收观测序列,并将观测序列解复用,分解成系统比特序列和两个校验序列。译码子程序同主程序调用,用于实现具体的译码算法,对观测序列进行译码。 2.2 Turbo码的仿真结果及分析
影响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算法,码率为13。
从图7所示的仿真结果可以看出,随着迭代次数的增加,Turbo码的误比特率曲线不断降低并趋于收敛;而且随着信噪比的增加,迭代对误比特率性能的影响越来越明显。这是Turbo码通过迭代译码充分利用冗余信息来提高编译码性能这一特点的反映。最初,迭代译码的增益较高,但随着迭代次数的增加,译码增益增长相对缓慢,虽然继续增加迭代次数可以提高Turbo码的性能,但权衡迭代所需要的时间、性能改善的幅度,我们通常都选取合适的迭代次数。 2.2.3 交织长度
图8 交织长度对Turbo码的影响
图8给出了不同交织长度下,Turbo码的误比特率与信噪比的关系曲线。从图8中可以看出,交织长度越大,性能就越好,而且交织长度对性能的影响是很大的,这是由于交织器的存在所产生的所谓交织增益,使得Turbo码的性能随交织长度的增长而改善且在交织长度足够长时接近信道容量。交织长度是决定Turbo码性能的一个重要因素。但是与Turbo码不同,卷积码的一个优点在于只要帧长远大于码的约束长度,其性能就与帧长没有关系,另外,Turbo码性能的另一个重要因素是迭代译码所产生的译码复杂度,所以我们有必要在短帧的情况下,将Turbo码与采用最大似然译码算法的卷积码纠错性能和复杂度作一个比较。在高斯信道环境下作了仿真比较,得到在同样信噪比的条件下,要达到10?3级BER的要求时,卷积码的复杂度小于Turbo码,在瑞利衰落信道下,结论也相似。短帧传输有着广泛的应用,诸如在移动通信中,话音和控制信息通常采用小于300比特的短帧,通常话音和信令的误码率要求在5?10?3到5?10?4之间。由上述结论可知,在对帧长有要求的移动通信系统中,在一定的误码率要求下,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]钟麟,王峰.M atlal,仿真技术与应用教程[M ].北京:国防工业出版社,2004.
附录:
核心源码展示: Logmap.m
function L_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,第一个分量码的网格图归零,第二个不归零 if ind_dec==1 Beta(L_total,1) = 0;
Beta(L_total,2:nstates) = -Infty*ones(1,nstates-1); elseif ind_dec==2
Beta(L_total,1:nstates) = zeros(1,nstates); end
% 前向递推计算alpha值 for k = 2:L_total+1 for state2 = 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值
for k = L_total-1:-1:1 for state1 = 1:nstates
gamma = -Infty*ones(1,nstates); %输入为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,:)))<1e-300) Beta(k,state1)=-Infty; else
Beta(k,state1) = log(sum(exp(gamma+Beta(k+1,:)))); end end
?ta值归一化,对数形式为减去最大值 Beta(k,:) = Beta(k,:) - tempmax(k+1); end
% 计算对数似然比形式的软输出 for k = 1:L_total for state2 = 1:nstates
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)); end
L_all(k) = log(sum(temp1)) - log(sum(temp0)); end