您的位置:首页 > 其它

【零基础学会LTE】【1】LTE 36.212 CRC模块

2012-08-30 16:45 239 查看
//本文均属原创,转载请注明出处。

//本课程以36.212 v10.4.0为教材,请自行到3GPP网站下载。下载地址为http://www.3gpp.org/ftp/Specs/archive/36_series/

//由于保密的原因,暂不提供代码查看。

模块作用:接收时通过CRC校验,判断接收比特的对错,如果错了,可以请求重传。

相关模块:速率匹配,HARQ重传

模块优缺点:

适用范围:PUSCH/PUCCH/

对应章节:5.1.1

今天要讲的是物理层第一个模块,CRC添加。

在这之前,请看一下这篇文章[1] :


这里,不讨论CRC的纠错原理以及为什么要选下面提及的生成多项式,只是针对以下的生成多项式,如何获得CRC校验码,作一个比较详细的说明。
标准CRC生成多项式如下表:
名称 生成多项式 简记式* 标准引用
CRC-4 x4+x+1 3 ITU G.704
CRC-8 x8+x5+x4+1 0x31
CRC-8 x8+x2+x1+1 0x07
CRC-8 x8+x6+x4+x3+x2+x1 0x5E
CRC-12 x12+x11+x3+x+1 80F
CRC-16 x16+x15+x2+1 8005 IBM SDLC
CRC16-CCITT x16+x12+x5+1 1021 ISO HDLC, ITU X.25, V.34/V.41/V.42

生成多项式的最高位固定的1,故在简记式中忽略最高位1了,如0x1021实际是0x11021(加最高位就是17位了)。

I、基本算法(人工笔算,一般写代码不用这种方法):
1)以CRC16-CCITT为例进行说明,CRC校验码为16位,生成多项式17位。假如数据流为4字节(32位):BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0];
2)数据流左移16位,相当于扩大256×256倍(左移一位扩大2倍),再除以生成多项式0x11021(这也就是为什么生成多项式第一位必须为1的原因,否则如果最高位是几个0,除法得不到16bits的余数),做不借位的除法运算,所得的余数就是CRC校验码。(不借位除法相当于异或?怎样异或?)
3)发送时的数据流为6字节:BYTE[3]、BYTE[2]、BYTE[1]、BYTE[0]、CRC[1]、CRC[0];

II、计算机算法1(比特型算法):
1)将扩大后的数据流(6字节)高16位(BYTE[3]、BYTE[2])放入一个长度为16的寄存器;
2)如果寄存器的首位为1,将寄存器左移1位(寄存器的最低位从下一个字节获得),再与生成多项式的简记式异或;
否则仅将寄存器左移1位(寄存器的最低位从下一个字节获得);
3)重复第2步,直到数据流(6字节)全部移入寄存器;
4)寄存器中的值则为CRC校验码CRC[1]、CRC[0]。


有了以上基础,再来看看LTE中的CRC,无非就是生成多项式变了,根据计算机算法1,写出24bits CRC校验代码:

解码算法与编码算法异工同曲,同样也是按照计算机算法1求出,唯一不同的是最后异或后24个bits都应该是0,如果不是0,那就说明接受数据出错了,代码如下:

参考文献:【1】http://kuaileljj2007.blog.163.com/blog/static/33974680200992194415674/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: