1、概述、

1.1 编码器

图1 Turbo编码器结构图

如图1所示,LTE使用 1/3码率 的 Turbo编码器作为信道编码方案的基础。内部采用两个3阶 RSC编码器并联,并由交织器一分为二。Turbo编码器输出为以下3个部分:

  • 第一比特为系统比特;
  • 卷积编码器1输出 —— 奇偶校验1比特流;
  • 卷积编码器2输出 —— 奇偶校验2比特流;

卷积编码器均包含卷尾,因此 K bit 的比特流,Turbo编码器输出三个 (K+4)bit 的比特流,导致Turbo编码效率略低于 1/3.

1.2 交织

LTE交织器由正交多项式序列(QPP)构成,交织器转换输入比特。输出比特指数 p(i) 和输入指数 i 的关系可以由下面的正交多项式表示:

K 和 f1, f2的关系,详细可参考:

Turbo编码原理及基本概念https://blog.csdn.net/snowman898/article/details/123818131

1.3  译码器

Turbo译码器使用两个后验概率(APP)译码器和两个交织器构成反馈环。Turbo译码器的计算复杂度与迭代次数直接相关。译码基本原理可参照:

Turbo译码原理说明(一)https://blog.csdn.net/snowman898/article/details/124318295

2、Matlab仿真实现

2.1  编码Matlab实现

我们使用通信系统工具箱的系统对象 comm.TurboEncoder 进行编码,并设置网络结构和交织器属性符合LTE标准定义。

function y = lte_TurboEncoder(u, intrlvrIndices)persistent Turbo
if isempty(Turbo)Turbo = comm.TurboEncoder('TrellisStructure', poly2trellis(4, [13 15],13), ...'InterleaverIndicesSource', 'Input port');
endy = step(Turbo, u, intrlvrIndices);

2.2  译码Matlab实现

译码器实现时,函数同时调用交织指数(intrlvrIndices)以及 最大迭代次数(maxIter)两个参数作为输入。

function [y,flag,inters]  = lte_TurboDecoder(u, intrlvrIndices, maxIter)
MAXITER = 6;
persistent Turbo
if isempty(Turbo)Turbo = comm.TurboDecoder('TrellisStructure', poly2trellis(4, [13 15],13), ...'InterleaverIndicesSource', 'Input port', 'MaximumIterations', MAXITER);
%                  'InterleaverIndicesSource', 'Input port', 'NumIterations', maxIter);end[y,flag,inters] = step(Turbo, u, intrlvrIndices);

一般 LTE译码 5~7次较为合理,可以同时兼顾译码性能和计算复杂度。

其中 intrlvrIndices 详细代码如下:

function indices = lte_IntrlvrIndices(blkLen)
% codegen
[f1,f2] = getf1f2(blkLen);
Idx = (0:blkLen-1).';
indices = mod(f1*Idx + f2*Idx.^2, blkLen) + 1;
end

2.2  BER测量

Turbo译码的运算性能取决于迭代次数,对于一个给定的译码器,越高的迭代次数意味着越好的BER性能。代码如下所示:

function [ber, numBits] = chapter4_ex03_nIter(EbNo, maxNumErrs, maxNumBits, nIter)persistent AWGN
AWGN = comm.AWGNChannel;FRM = 2432;
R = FRM/(3*FRM+4*3);Indices = lte_IntrlvrIndices(FRM);% Modulation Mode
ModulationMode = 1;          % 1--QPSK  2--QAM16  3-- QAM6
k = 2* ModulationMode;
snr = EbNo + 10*log10(k)+10*log10(R);AWGN.EbNo = snr;
% Compute noise variance
noiseVar = 10.^(-snr/10);% Processing loop: transmitter, channel model and receiver
numErrs = 0;  numBits = 0;
nS = 0;while((numErrs < maxNumErrs) && (numBits < maxNumBits))% Transmitteru = randi([0,1], FRM, 1);t0 = lte_TurboEncoder(u,Indices);t1 = lte_Scrambler(t0, nS);t2 = lte_Modulator(t1, ModulationMode);% channelc0 = AWGN.step(t2);% Receiverr0 = lte_DemodulatorSoft(c0,ModulationMode, noiseVar);r1 = lte_DescramblerSoft(r0, nS); y = lte_TurboDecoder(-r1, Indices, nIter);% MeasurementsnumErrs =numErrs+ sum(y~=u);numBits = numBits + FRM;nS = nS + 2;nS = mod(nS, 20);
end% Compute BER
ber = numErrs/numBits;

如果我们将迭代次数分别设置为1、3和5次,如下图所示:

图2  Turbo随着迭代次数增加性能改变

2.3 Turbo译码早期终止机制

Turbo译码器的迭代次数 是 Turbo译码器主要特性之一。LTE标准提供了一个有效途径,通过引入早期终止机制解决这一问题。通过对 Turbo编码器添加crc校验,可以在迭代译码结束时检出是否存在错误比特。若CRC不存在错误比特,可提前终止译码。这一方案可以大幅降低Turbo译码器计算复杂度,且不会带来性能损失。

考虑CRC排列顺序

添加的CRC比特可以采用顺序或者逆序排列。UTRA采用CRC逆序排列,但在LTE研究中,逆序排列没有性能上的提高,却会增加系统处理的复杂度。因此,LTE采用顺序排列

考虑CRC处理方式

当对较长的传输数据块进行分段时,一种选择是先对整个TB进行CRC处理,然后再进行分段处理,称为 TB CRC;另一是先进行分段处理,然后再对每个CB添加CRC校验处理,称为CB CRC。LTE选择的是两者结合,如下图所示:

图3-1  LTE CRC处理机制

 图3-2  LTE CRC具体实现过程

由图3-2可知,先将TB添加24bit crc校验,当传输块大于6144bit(maxCBlkLen = 6144,含crc),先进行码块分段,再在每个CB上添加 24 bit CRC校验。此方法可以有效降低高速率传输时译码的平均迭代次数。应注意的是,LTE采用不同的CRC多项式分别生成 CB CRC和TB CRC。

function [y, flag, iters]=lte_TurboDecoder_crc(u, intrlvrIndices)
%#codegen
maxIter=6;
persistent TurboCrc
if isempty(TurboCrc)TurboCrc = commLTETurboDecoder('InterleaverIndicesSource',  'Input port', ...'MaximumIterations', maxIter);
end
[y, flag, iters] = step(TurboCrc, u,  intrlvrIndices);

值得注意的是,commLTETurboDecoder这一函数原型只存在早期MATLAB版本中(R2015及以前),函数如下所示:

classdef commLTETurboDecoder < matlab.System %#ok<*EMCLS>
%commLTETurboDecoder Decode input using an early-terminating LTE turbo decoder.
%   H = commLTETurboDecoder creates an LTE turbo decoder System object, H.
%   This object uses the a-posteriori probability (APP) constituent decoder
%   to iteratively decode the parallel-concatenated convolutionally encoded
%   input data. It uses a CRC check for early decoder termination and
%   outputs only the message bits (minus the checksum) corresponding to the
%   code-block.
%
%   H = commLTETurboDecoder(Name, Value) creates an LTE turbo decoder
%   object, H, with the specified property Name set to the specified Value.
%   You can specify additional name-value pair arguments in any order as
%   (Name1, Value1, ... , NameN, ValueN).
%
%   H = commLTETurboDecoder(INTERLVRINDICES, MAXITER) creates an LTE turbo
%   decoder object, H, with the InterleaverIndices property set to

最终,我们给出包含早期终止机制的Turbo_crc译码:

function [ber, numBits]=chap4_ex04_crc(EbNo, maxNumErrs, maxNumBits)
%% Constants
clear functions;
FRM=2432-24; % Size of bit frame
Kplus=FRM+24;
Indices = lteIntrlvrIndices(Kplus);
ModulationMode=1;
k=2*ModulationMode;
CodingRate=Kplus/(3*Kplus+12);
snr = EbNo + 10*log10(k) + 10*log10(CodingRate);
noiseVar = 10.^(-snr/10);
%% Processsing loop modeling transmitter, channel model and receiver
numErrs = 0; numBits = 0; nS=0;
while ((numErrs < maxNumErrs) && (numBits < maxNumBits))% Transmitteru  =  randi([0 1], FRM,1);                % Randomly generated input bitsdata= CbCRCGenerator(u);                  % Transport block CRC codet0 = TurboEncoder(data, Indices);         % Turbo Encodert1 = Scrambler(t0, nS);                   % Scramblert2 = Modulator(t1, ModulationMode);       % Modulator% Channelc0 = AWGNChannel(t2, snr);                % AWGN channel% Receiverr0 = DemodulatorSoft(c0, ModulationMode, noiseVar);          % Demodulatorr1 = DescramblerSoft(r0, nS);                                % Descrambler[y, ~, ~]  = TurboDecoder_crc(-r1, Indices);                 % Turbo Deocder% MeasurementsnumErrs     = numErrs + sum(y~=u);        % Update number of bit errorsnumBits     = numBits + FRM;              % Update number of bits processed% Manage slot number with each subframe processednS = nS + 2; nS = mod(nS, 20);
end%% Clean up & collect results
ber = numErrs/numBits;                        % Compute Bit Error Rate (BER)

代码完整运行可自行下载:

LTETurbo编译码综合仿真-编解码文档类资源-CSDN下载1、Turbo设置最大迭代次数的编译码性能仿真,迭代次数分别设置为1/3/52、带早期终止机制的T更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/snowman898/85391832

LTE物理层概述(7)-- LTE之Turbo编码及其matlab仿真1相关推荐

  1. LTE物理层概述(6)-- LTE之调制与解调及其matlab仿真

    LTE(长期演进)下行链路 PHY(物理)层处理链路可以认为是下行链路共享信道(DLSCH)和物理下行链路共享信道(PDSCH)处理的组合.DLSCH 即 下行链路传输信道 TrCH. LTE下行链路 ...

  2. LTE物理层概述(4)-- LTE时间帧及资源块

    1.LTE时间帧描述 图1所示为LTE物理层帧结构,理解LTE传输过程取决于清晰理解数据的时 - 频分布 图1 LTE帧结构 由图1可以看出: LTE 每帧长10ms,分为10个子帧,每个子帧长1ms ...

  3. 基于空间通信超短QC- LDPC编码的matlab仿真实现

    欢迎订阅<FPGA学习入门100例教程>.<MATLAB学习入门100例教程> 目录 一.理论基础 二.核心程序 三.测试结果 一.理论基础

  4. LTE无线侧接口协议::::::之::::::LTE接口概述

    LTE接口概述 1.LTE无线网络接口协议总览 1.1UE---EPC接口框图 1.2 UE---EPC间各接口名称.连接网元.接口功能以及协议列表 2.E-UTRAN和EPC的分工模块 2.1 E- ...

  5. 初识LTE(五):完整的SISO LTE 物理层实现

    文章目录 初识LTE(五):完整的SISO LTE 物理层实现 零.代码地址 一.实现整体过程 1.参数初始化 commlteSISO_params commlteSISO_initialize pr ...

  6. LTE物理层过程--小区搜网、随机接入、功率控制、测量、数据传输

    前言 终端和网络进行通讯需要进行哪些物理层的交互呢? 终端需要搜索到服务自己的网络,然后接入网络,这就涉及小区搜索过程和随机接入过程:在交互过程中,终端和网络都需将功率调节到合适的大小,以增强覆盖或抑 ...

  7. Turbo编码相关知识

    这段时间里,看到的一些书籍和程序中,很多都用到LDPC码,卷积码和Turbo码,刚好又在学习Turbo码,故将资料中的关于Turbo码编码的知识点加以整理.    Turbo编码进化自卷积码,在LTE ...

  8. 搜matlab代码的网站,LTE小区搜索matlab仿真

    [实例简介] LTE小区搜索过程的matlab仿真,比较详细,内容不错 [实例截图] [核心代码] 35738649matlab └── matlab ├── Bc.m ├── CellSearch. ...

  9. turbo编码原理以及matlab实现

    一.原理 Turbo的编码器由两个并行的分量编码器组成.分量编码器的选择一般是卷积码.在Turbo码中,输入序列在进入第二个编码器时须经过一个交织器 ,用于将序列打乱.两个编码器的输出共同作为冗余信息 ...

  10. td lte pss同步matlab仿真,一种LTE-A帧定时同步算法的AISC设计与实现

    0 引言 当前LTE-Advanced系统架构趋于扁平化,以往的帧定时同步方案已不再适合LTE-Advanced系统,因此,需要寻找一种新的帧定时同步实现方案.本文将该算法分成3个步骤:粗定时同步和小 ...

最新文章

  1. android xUtils的使用
  2. 【怎样写代码】向现有类型“添加”方法 -- 扩展方法(一):扩展方法概述
  3. 【研究】大脑如何在“知道”与“无知”之间做出决定
  4. 不用恐惧AI的高速发展,论击败阿法狗(零)最简单的方法
  5. 使用Redis分区将数据分割到多个Redis实例
  6. python操作excel表格-Python自动化办公之操作Excel文件
  7. Mysql主从复制(docker例子)
  8. Scikit-Learn 机器学习笔记 -- 线性回归、逻辑回归、softmax回归
  9. C#中DateTime的缺陷与代替品DateTimeOffset
  10. win7 'IIS APPPOOL\Classic .NET AppPool' 登录失败
  11. 比亚迪2021年上半年营收908.85亿元 同比增长50.22%
  12. Linux进程的管理与调度(五) -- Linux下0号进程的前世(init_task进程)今生(idle进程)
  13. LeetCode 309 Best Time to Buy and Sell Stock with Cooldown 解决方案
  14. 杰控连接mysql_工控自动化应用方案:杰控FameView组态软件在数据库连接和查询方面的应用...
  15. 图像处理之图像质量评价指标PSNR(峰值信噪比)
  16. 纬创软件本社对日JAVA开发
  17. (VC++2013)MFC自绘圆形按钮
  18. day13-面向对象进阶
  19. 无法安装 cloudera-manager-agent
  20. win10 安装mysql5.7 超详细(亲测成功)

热门文章

  1. docker容器status为create状态
  2. java爆炸图片切换,JavaScript实现爆炸碎片的 图片切换 效果
  3. scrapy提高爬取速度
  4. 天载杠杆炒股A股三大指数团体高开
  5. 什么是GC?GC的基本原理
  6. DongDong认亲戚 来源:牛客网
  7. 一个超赞的开源串口虚拟示波器项目,玩起来!
  8. jQuery常用功能大全
  9. R语言hist作直方图
  10. re学习笔记(25)BUUCTF-re-[2019红帽杯]easyRE