C/C++ 编程实现 LTE Turbo编码

  在LTE协议TS 136 212中详细介绍了LTE里面Turbo编码的算法。但协议看起来实在是太晦涩难懂,本文档通俗地介绍LTE中Turbo编码的原理,并用C语言编程实现了一个LTE Turbo编码器。

1. Turbo编码器

  LTE系统采用的1/3码率的Turbo编码器,即1个输入比特会对应3个输出比特,即Xk,Zk,Z’k。其中,Xk叫做系统比特,Xk与输入的比特相等。Zk和Z’k叫做冗余比特,Zk对应编码器1的输出,Z’k对应编码器2的输出,冗余比特用来增强传输的可靠性。
  图中每个编码器的输入端都有一个单刀双掷开关,当正常编码时,开关与输入连接。当没有输入,正在添加尾比特时,开关与输入断开。
  下面以编码器1来介绍Turbo编码的原理。
  首先,三个寄存器(D1,D2,D3)初始化为0。输入比特Ck=1,此时有Xk=1。输入第一个寄存器的值为D2 +D3 +Ck。第一个编码器输出的值为 D1的输入值+D1的输出值+D3的输出值,即Zk=D2 +D3 +Ck + D1+D3。
  此次编码完成后,寄存器的值往后推。即D3的值更新为D2的输出,D2的值更新为D1的输出,D1的值更新为D1的输入值,即D2 +D3 +Ck。
  编码器2的原理与编码器1类似,输入比特进入编码器2前需要先进行交织,即把位置打乱。交织具体的原理将在下一章介绍。
  
Turbo编码器

  最后,当所有的输入比特都编码完成时,需要把开关与输入断开连接以对编码后的比特添加尾比特。尾比特是为了让编码器回到初始状态,避免了两个码字之间的关联性。协议定义了一共添加12bit的尾比特,12比特具体的值如下图所示。下图应该按照从上到下,从左往右的顺序看,即先看d(k),接着看d(k+1),d(k+2), d(k+3)。Xk,Zk,Z’k与上述定义相同,而X’k对应图中最底下的虚线。
  
Turbo尾比特 

  如果系统输入c0,c1,则编码后会输出c0,z(0),z’(0),c1, z(1),z’(1),d(k)(0),d(k)(1), d(k)(2), d(k+1)(0),d(k+1)(1), d(k+1)(2), d(k+2)(0),d(k+2)(1), d(k+2)(2)。

2. Turbo交织

  如果输入的比特为c0,c1……ci……c(K-1),输出的比特为c’0,c’1……c’j……c’(K-1),则j=(f1*i + f2*i*i) mod K。
  f1,f2和K的定义在LTE协议里面有一个对应的表格,一共188组。编码的时候根据表格找到大于编码输入长度的最小的K值。

Turbo交织

3. C编程实现Turbo编码器

  如果看了上述介绍还是不理解LTE Turbo编码的原理,那么就直接show you the code。对照C语言实现的Turbo编码器更容易理解Turbo编码的原理。

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

#define NOF_REGS 3
#define NOF_TAILINGS 12
#define MAX_CB_SIZE 188
#define MAX_BIT_LENGTH 6144

const uint32_t tc_cb_sizes[MAX_CB_SIZE] = {
40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120,       
128, 136, 144, 152, 160, 168, 176, 184, 192, 200, 208, 216, 224, 232,
240, 248, 256, 264, 272, 280, 288, 296, 304, 312, 320, 328, 336, 344,
352, 360, 368, 376, 384, 392, 400, 408, 416, 424, 432, 440, 448, 456,
464, 472, 480, 488, 496, 504, 512, 528, 544, 560, 576, 592, 608, 624,
640, 656, 672, 688, 704, 720, 736, 752, 768, 784, 800, 816, 832, 848,
864, 880, 896, 912, 928, 944, 960, 976, 992, 1008, 1024, 1056, 1088,
1120, 1152, 1184, 1216, 1248, 1280, 1312, 1344, 1376, 1408, 1440, 1472,
1504, 1536, 1568, 1600, 1632, 1664, 1696, 1728, 1760, 1792, 1824, 1856,
1888, 1920, 1952, 1984, 2016, 2048, 2112, 2176, 2240, 2304, 2368, 2432,
2496, 2560, 2624, 2688, 2752, 2816, 2880, 2944, 3008, 3072, 3136, 3200,
3264, 3328, 3392, 3456, 3520, 3584, 3648, 3712, 3776, 3840, 3904, 3968,
4032, 4096, 4160, 4224, 4288, 4352, 4416, 4480, 4544, 4608, 4672, 4736,
4800, 4864, 4928, 4992, 5056, 5120, 5184, 5248, 5312, 5376, 5440, 5504,
5568, 5632, 5696, 5760, 5824, 5888, 5952, 6016, 6080, 6144 };

const uint32_t f1_list[MAX_CB_SIZE] = { 
3, 7, 19, 7, 7, 11, 5, 11, 7, 41, 103,
15, 9, 17, 9, 21, 101, 21, 57, 23, 13, 27, 11, 27, 85, 29, 
信息传输的可靠性和有效性一直是通信系统中研究的热点问题,而信道编码技术则是很好解决这一矛盾的有效技术之一。由C.Berrou 等人于1993 年首次提出的Turbo 码,以其接近香农极限的良好性能,不仅在低信噪比下高噪声中表现出优越的性能,而且具有强大的抗干扰、抗衰落能力等优点,使其在通信领域得到了广泛的应用。因而,对Turbo 码的研究具有十分重要的实用价值。本文主要对LTE 标准下的Turbo 码进行了研究及FPGA 实现。   本文介绍了LTE 标准下Turbo 码的理论研究和性能分析,并FPGA 实现。首先,介绍了编码器的结构和译码算法:MAP,LOG_MAP 和MAX_LOG_MAP,接着在考虑译码速度、硬件实现复杂度及资源消耗的前提下,对复杂度较低,性能优异,基于Radix-4 的MAX_LOG_MAP 算法进行了详细推导,并得到了MATLAB下不同影响因素的译码性能曲线。其次,对接收数据量化,定点数据表示,内交织器,MAX_LOG_MAP 中的关键运算单元等模块进行了深入研究和设计。最后,在ISE 13.3 环境下,对FPGA 实现Turbo 码进行了功能测试,并使用Xilinx公司的Kintex-7(XC7K325T)芯片进行了性能仿真,得到了FPGA 设计的译码性能,并对硬件实现做了进一步的优化。   测试的结果表明,本论文实现Turbo 码具有良好的性能,工作稳定,是可以满足LTE 系统项目的性能要求的。   近年来由于信息网络化和经济全球化的迅猛发展,人们对移动通信的要求也随之提高,及时可靠,不受任何限制的进行信息传输交流,想要达到高的工作效率和经济效益,这就要求手机不仅仅用来打电话,收发电子邮件,而且还要能上网、文件传输,以及提供各种各样的多媒体服务。现有的移动网络已经很难满足用户的需要,一方面要求移动业务的增长要跟上用户对业务需要的增长速度,另一方面要求我们对技术进行革新,增加系统容量来满足日益增多的移动用户。在这两种要求的驱动下,移动通信技术得以不断的发展。   移动通信由马可尼于1897年率先采用无线电传输消息所开启[1]。时至今日,移动通信在这100多年的历史中已经取得了很大的进步和发展,从诞生于1978年的第一代的模拟蜂窝网电网系统,到第二代全数字蜂窝网电话系统的出现,再到现在第三代个人通信系统和新一代通信系统的普及,移动通信在社会中已不可缺少。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值