1.完整项目描述和程序获取
>面包多安全交易平台:https://mbd.pub/o/bread/ZJWVmZxw
>如果链接失效,可以直接打开本站店铺搜索相关店铺:
>如果链接失效,程序调试报错或者项目合作也可以加微信或者QQ联系。
2.部分仿真图预览
3.算法概述
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 码就是并行级联卷积码。乘积码于1954 年由Elias 最早提出,随即得到了广泛应用。
4.部分源码
................................................................................
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function data_sp = func_S2P(Rec,alpha,puncture);
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
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function TPC_decode = func_maxlog(Rec_Signal,gpym,TPC_de_interleaver,flag)
Lens = length(Rec_Signal)/2;
[n,K] = size(gpym);
Num_STATE = 2^(K-1);
%初始化格子
[Next1,Next2,Last1,Last2] = func_trelli(gpym);
Alpha(1,1) = 0;
Alpha(1,2:Num_STATE) = -1e60*ones(1,Num_STATE-1);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if flag==1
Beta(Lens,1) = 0;
Beta(Lens,2:Num_STATE) = -1e60*ones(1,Num_STATE-1);
elseif flag==2
Beta(Lens,1:Num_STATE) = zeros(1,Num_STATE);
end
................................................................
%译码输出
for i1 = 1:Lens
for j1 = 1:Num_STATE
gamma0 = (-Rec_Signal(2*i1-1) + Rec_Signal(2*i1) * Last1(j1,2)) - log(1+exp(TPC_de_interleaver(i1)));
gamma1 = ( Rec_Signal(2*i1-1) + Rec_Signal(2*i1) * Last1(j1,4)) + TPC_de_interleaver(i1) - log(1+exp(TPC_de_interleaver(i1)));
temp0(j1) = exp(gamma0 + Alpha(i1,Last2(j1,1)) + Beta(i1,j1));
temp1(j1) = exp(gamma1 + Alpha(i1,Last2(j1,2)) + Beta(i1,j1));
end
TPC_decode(i1) = log(sum(temp1)) - log(sum(temp0));
end
end
14_016_m