turbo编码原理以及matlab实现

一、原理

Turbo的编码器由两个并行的分量编码器组成。分量编码器的选择一般是卷积码。在Turbo码中,输入序列在进入第二个编码器时须经过一个交织器 ,用于将序列打乱。两个编码器的输出共同作为冗余信息添加到信息序列之后,对抗信道引起的错误。

  • turbo编码器的结构
    在这里插入图片描述

二、交织器

什么是交织器?
编码器中交织器的使用是实现Turbo码近似随机编码的关键。交织器实际上是一个一对一的映射函数,作用是将输入信息序列中的比特位置进行重置,以减小分量编码器输出校验序列的相关性(减小两个RSC编码器输入序列的相关性,使二者编码过程趋于独立)并且提高码重(码字中1的数目)。

如何实现交织器?

k:信息块的长度,取k = 960
s:原始数据序号,1~k
k = k1 * k2 = 4 * 240
Π(s):交织后的数据序号
根据下图所示流程,即可得到交织后的数据序号。

在这里插入图片描述

在这里插入图片描述

三、RSC 递归系统卷积码

所谓卷积码,即输出为输入和一段已知序列的卷积。
每个输入会产生三个输出。输出是输入数据和三个寄存器的值之间的模2加法。当第一个数据做完模2加法后,产生第1组输出,然后将第1个数据移入移位寄存器,作为移位寄存器新的初始值。第二个输入数据进来之后,同样进行模2运算,产生第2组输出。即先算输出,再进行移位。

  • RSC编码器结构
    在这里插入图片描述

  • 生成多项式
    在这里插入图片描述

四、归零处理

在数据序列编码完成后,归零处理使分量编码器RSC中的移位寄存器恢复成编码前的零状态,从而使编译码变得简单易于控制。

Turbo码的归零处理如下:
(1)输入所有的编码序列,完成编码
(2)分量码开关切换,各个寄存器中的遗留状态值和反馈结构生成某些编码序列的尾部比特,这些尾比特与自身异或,使新进入寄存器的值为0。
(3)该过程直到所有移位寄存器中值全部为0。如寄存器有m个,则经过m次后寄存器将全为0。

  • 实际操作
    前k个时钟,开关位于a,信息被输入到编码器中。
    在k个时钟之后的6个时钟,开关位于位置b。在这6个时钟的前3个时钟里,只有RSC1输出。在这6个时钟的后3个时钟里,只有RSC2输出。
    所以,终止序列是(X、Y0、Y1、X’、Y0’、Y1’);

五、数据打孔(删余)

现代通信系统中,为了实现高速数据传输,系统对频带利用率要求较高,一般Turbo码的码率只有1/3,所以,频带利用率不高,为了解决这一问题,在编码器中加入了删余处理。
删余处理的具体操作即在编码完成后,将分量码输出的两路校验信息输入删余器,按照一定的规则删除一部分校验信息,减小信息的冗余度,从而提高编码效率。删余处理根据各系统自定。
在这里插入图片描述
在上表中,0表示删除这个数据,1表示保留这个数据。
注意,终止部分(尾比特)的穿刺表与前面数据的穿刺表不一定相同。

六、matlab程序

% 函数功能:turbo编码
% 输入:turbo_in
% 输出:turbo_out
% 时钟:clk
% rsc寄存器:reg1-->reg2-->reg3
% 移位寄存器输入:sr_in

function turbo_out=turbo(turbo_in)

% rsc参数
g1 = [1 1 1 1];         % y1的生成多项式
g0 = [1 0 1 1];         % y0的生成多项式
g = [1 1 0 1];          % rsc的生成多项式

% 数据打孔参数
punc_para = [[1 0 1 0 0 0] [1 0 0 0 0 0] [1 0 0 0 0 0] [1 0 0 0 0 0] [1 0 0 0 0 0] [1 0 0 0 0 1]];

% 数据交织
turbo_in1 = interleaver(turbo_in);

% 初始化
rsc1_reg1 = 0;
rsc1_reg2 = 0;
rsc1_reg3 = 0;
rsc1_sr_in = mod(turbo_in(1)+rsc1_reg2+rsc1_reg3,2);

rsc2_reg1 = 0;
rsc2_reg2 = 0;
rsc2_reg3 = 0;
rsc2_sr_in = mod(turbo_in1(1)+rsc2_reg2+rsc2_reg3,2);

ram = [];
rsc1_reg = [0 0 0];
rsc2_reg = [0 0 0];
% 前k个时钟,开关位于a
for clk = 1:length(turbo_in)
    % 因为先计算输出,再进行移位
    % 所以注意组合逻辑放在前面,时序逻辑放在后面,对移位寄存器的赋值注意先后顺序
    % rsc1
    rsc1_sr_in = mod(turbo_in(clk)+rsc1_reg2+rsc1_reg3,2);
    rsc1_x = turbo_in(clk);
    rsc1_y0 = mod(rsc1_sr_in+rsc1_reg1+rsc1_reg3,2);
    rsc1_y1 = mod(rsc1_sr_in+rsc1_reg1+rsc1_reg2+rsc1_reg3,2);

    rsc1_reg3 = rsc1_reg2;
    rsc1_reg2 = rsc1_reg1;
    rsc1_reg1 = rsc1_sr_in;
    
    
    % rsc2
    rsc2_sr_in = mod(turbo_in1(clk)+rsc2_reg2+rsc2_reg3,2);
    rsc2_x = turbo_in1(clk);
    rsc2_y0 = mod(rsc2_sr_in+rsc2_reg1+rsc2_reg3,2);
    rsc2_y1 = mod(rsc2_sr_in+rsc2_reg1+rsc2_reg2+rsc2_reg3,2);

    rsc2_reg3 = rsc2_reg2;
    rsc2_reg2 = rsc2_reg1;
    rsc2_reg1 = rsc2_sr_in;
    
    
    % 并转串
    ram = [ram rsc1_x rsc1_y0 rsc1_y1 rsc2_x rsc2_y0 rsc2_y1];
    rsc1_reg = [rsc1_reg;rsc1_reg3 rsc1_reg2 rsc1_reg1];
    rsc2_reg = [rsc2_reg;rsc2_reg3 rsc2_reg2 rsc2_reg1];
end

%6个时钟,开关位于b
rsc1_sr_in = 0;
rsc2_sr_in = 0;
for clk = 1:6

    % rsc1
    rsc1_x = mod(rsc1_reg2+rsc1_reg3,2);
    rsc1_y0 = mod(rsc1_sr_in+rsc1_reg1+rsc1_reg3,2);
    rsc1_y1 = mod(rsc1_sr_in+rsc1_reg1+rsc1_reg2+rsc1_reg3,2);
    
    rsc1_reg3 = rsc1_reg2;
    rsc1_reg2 = rsc1_reg1;
    rsc1_reg1 = rsc1_sr_in;
    
    
    
    % rsc2
    rsc2_x = mod(rsc2_reg2+rsc2_reg3,2);
    rsc2_y0 = mod(rsc2_sr_in+rsc2_reg1+rsc2_reg3,2);
    rsc2_y1 = mod(rsc2_sr_in+rsc2_reg1+rsc2_reg2+rsc2_reg3,2);
    
    rsc2_reg3 = rsc2_reg2;
    rsc2_reg2 = rsc2_reg1;
    rsc2_reg1 = rsc2_sr_in;
    
    

    % 并转串
    ram = [ram rsc1_x rsc1_y0 rsc1_y1 rsc2_x rsc2_y0 rsc2_y1];
    rsc1_reg = [rsc1_reg;rsc1_reg3 rsc1_reg2 rsc1_reg1];
    rsc2_reg = [rsc2_reg;rsc2_reg3 rsc2_reg2 rsc2_reg1];
    
end


rsc1_x_ram = ram(1:6:length(ram));
rsc1_y0_ram = ram(2:6:length(ram));
rsc1_y1_ram = ram(3:6:length(ram));

rsc2_x_ram = ram(4:6:length(ram));
rsc2_y0_ram = ram(5:6:length(ram));
rsc2_y1_ram = ram(6:6:length(ram));


% 数据打孔
punc = repmat(punc_para,1,ceil(length(ram)/36));
punc = punc(1:length(ram));
punc_addr = find(punc);
turbo_out = ram(punc_addr);

Turbo是一种利用迭代解算法来实现极高误纠正能力的编码技术。它包括了两个相互协作的卷积,相比传统的卷积具有更好的编码效率和纠错能力。 Turbo编码过程主要分为三个步骤。首先,将待编码的信息数据按照一定的规则分组,形成多组子块。其次,将每组子块输入到第一个卷积器中,经过卷积编码得到第一个输出字。然后,将该字输入到第二个卷积器中继续编码,得到最终的编码结果。 在卷积编码过程中,Turbo引入了一个关键的组成部分,即交互串扰(Interleaver)。交互串扰器通过改变输入序列的顺序,将可能出现的连续错误分散到不同子块中,从而提高了系统的纠错能力。该部分非常重要,因为它是保证Turbo能够达到较低误率的关键之一。 在Matlab中,我们可以使用通用编码原理实现Turbo编码。首先,需要设计两个卷积器,并设置好每个卷积器的多项式。然后,构建交互串扰器,并将待编码的信息数据输入到交互串扰器中。接下来,将串扰后的数据分别输入到两个卷积器中,并得到两个字输出。最后,将两个字按照一定规则组合起来,形成最终的编码结果。 在实现的过程中,我们需要注意设置好交互串扰器和卷积器的参数,包括多项式、长和约束长度等。此外,还需要进行调制操作,将二进制编码转换为模拟信号,方便实际传输。最后,通过输出的编码结果,可以进行信道传输和解等后续操作。 以上是关于Turbo编码原理Matlab中的简要介绍,希望对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据线

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值