您现在的位置:首页 >> 编解码 >> 内容

m基于Turbo-TPC乘积码的误码率仿真,并和传统的turbo进行对比

时间:2023/2/16 22:21:19 点击:

  核心提示:14_016_m,包括程序操作录像+说明文档...

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

作者:我爱C编程 来源:我爱C编程
本站最新成功开发工程项目案例
相关文章
相关评论
发表我的评论
  • 大名:
  • 内容:
本类固顶
  • 没有
  • FPGA/MATLAB商业/科研类项目合作(www.store718.com) © 2025 版权所有 All Rights Reserved.
  • Email:1480526168@qq.com 站长QQ: 1480526168