1.算法仿真效果
matlab2022a仿真结果如下:
2.算法涉及理论知识概要
Turbo码是一种极为复杂的信道编码技术,译码算法往往由于硬件实现的复杂度太高或者译码时延太长而难以实现。现目前Turbo码领域面临的主要问题是:在复杂度和时延都可以接受的前提下如何获得最佳的系统性能。Turbo码由分量码经由交织器级联而成。因此,分量码和交织器设计的好坏是决定Turbo码性能的关键因素。实际的通信系统中,为提高系统带宽效率,一种方法是通过删减部分校验比特来提高编码速率,称为删余。
Turbo码的编码过程实际上是一个利用强约束短码构造伪随机长码的过程。Turbo码的译码算法主要有两大类。是基于最大后验概率(MAP)的软输出算法,主要包括标准MAP算法、对数域上的Log.MAP算法和Max. Log-MAP算法、修正的MAP算法(M-MAP)、滑动窗MAP(SW-MAP)算法和只有前向递推的MAP算法(OSA)。其中,MAP算法是MAP算法的对数形式,它通过将大量的乘法运算转化为加法运算来简化算法的复杂性。
Turbo码由2个循环系统卷积码并行级联而成:译码采用迭代的串行译码交织器是Turbo 码所特有的,它可以使得信息序列随机化,增加各码字间的重量,从而提高码的保护能力。
Turbo编码器的基本结构如图1所示:
从图1的仿真结果可知,Turbo码编码器主要由分量删余矩阵、交织器、两个分量编码器以及复接器组成。
分量编码器是Turbo码编码器中的一个重要组成部分。Turbo码的分量编码器使用RSC编码,因为循环编码器可以改善码的比特误码率性能。
删余矩阵是通过删除冗余的校验位来调节码率,Turbo码采用两个成员编器。
交织器的作用是改变信息结构将传输过程中出现的突发错误进行的分散化和不规则化。交织器可以改变Turbo 码的重量分布,因此,交织器对Turbo 码性能的好坏有着重要作用。在Turbo 码中,交织器使输入码元符号的顺序尽可能随机分布,使码元符号之间的相关性减弱,从而使进入各个子译码器的信息序列之间不相关。
Turbo码的译码使用了迭代译码。利用EXIT图实现对迭代译码过程的跟踪,从而估计迭代译码的收敛性。利用EXIT图还可以预测实现一定性能要求时所必须的迭代译码次数。它为分析迭代译码过程和迭代译码方案的设计提供了有力的工具。
Turbo译码器主要包括如下几个结构:两个分量译码器模块,交织器模块,解交织器模块以及硬判决模块。
Turbo译码器的基本结构如图2所示:
Turbo译码器工作原理为:将接收到的串行数据进行并串转换,同时将删余的比特位填上虚拟比特。将信息序列r0以及RSC1生成的校验序列r1送入软输出译码器1,软输出译码器1生成的外信息序列Z1k经过交织后做为下一软输出译码器2的输入。信息序列r0经过交织器输入至译码器2,同时输入的还有RSC2生成的校验序列r2。
译码器2的输出外信息Z2k经过解交织器后做为反馈输入至译码器1,再次重复以上过程进行软判决,直至最后译码输出性能不再有提高,将最后结果有译码器2输出解交织后做为判决输出。
这种译码器结构的优点是每个译码器不仅可以利用本译码器的信息比特和校验比特,还能利用前一译码器提供的信息进行译码,从而提高译码的准确性。它的缺点是:迭代要花费更多时间,造成的延时使Turbo码在某些对时延要求高的通信系统(如数字电话等)中应用受限。 Turbo码译码算法基于最大后验概率(MAP)算法或者是软输出维特比(SOVA)算法。MAP算法是最小化符号或比特差错概率,SOVA算法是最小化序列差错概率。在低SNR环境下,MAP算法比SOVA算法的性能有一定改善,但是MAP算法在每一时刻都要考虑所有路径,并且其运算是乘法和指数运算,比较复杂。
————————————————
乘积码,并行级联码是一种用短码构造长码的编码组合方式,其中乘积码属于并行级联分组码,而大名鼎鼎的Turbo 码就是并行级联卷积码。乘积码于1954 年由Elias 最早提出,随即得到了广泛应用。
步骤
(1)将信息元填入一个 2 k 行 1 k 列的矩阵;
(2)对矩阵的每一行,用一个( , ) 1 1 n k 系统分组码 1 V 进行编码,得到一个2 k 行1 n 列
的矩阵;
(3)对这个矩阵的每一列,用一个( , ) 2 2 n k 系统分组码 2 V 进行编码,最终得到一个2 n
行1 n 列的矩阵。
这样得到的纠错码是一个1 2 1 2 (n ×n, k ×k)分组码,所以称为乘积码。乘积码的两个编码器是对排列顺序不同的同一组信息元进行编码,两个编码器并行工作,没有“内”“外”之分,统称为分量编码器。乘积码也因此被称为二维码。同样,乘积码也可以先按列编码,再按行编码,得到的码字是完全一样的。乘积码的传输方式也不唯一,可以按行传输、按列传输甚至按对角线传输。
3.MATLAB核心程序
Lens = length(Rec)/(2+puncture);
%打孔
if puncture == 1
for i = 1:Lens
Rec_1st(i) = Rec(3*(i-1)+1);
for j = 1:2
data_sp(j,2*i) = Rec(3*(i-1)+1+j);
end
end
end
%不打孔
if puncture == 0
for i = 1:Lens
Rec_1st(i) = Rec(2*(i-1)+1);
for j = 1:2
data_sp(j,2*i) = 0;
end
if rem(i,2)>0
data_sp(1,2*i) = Rec(2*i);
else
data_sp(2,2*i) = Rec(2*i);
end
end
end
for j = 1:Lens
data_sp(1,2*(j-1)+1) = Rec_1st(j);
data_sp(2,2*(j-1)+1) = Rec_1st(alpha(j));
end
end