【零基础学会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/
//本课程以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/
相关文章推荐
- 【零基础学会LTE】【2】LTE 36.212 码块分段及CRC添加
- 【零基础学会LTE】【7】LTE 36.212 PUSCH信道复用和交织模块
- 【零基础学会LTE】【6】LTE 36.212 HARQ/RI/CQI信道编码模块
- 【零基础学会LTE】【5】LTE 36.212 速率匹配模块
- 【零基础学会LTE】【3】LTE 36.212 咬尾卷积码详解
- 【零基础学会LTE】【4】LTE 36.212 咬尾卷积码译码
- 【零基础学会LTE】【7】LTE 36.211 加扰模块
- python基础学习六——模块
- 转载:python基础之模块
- java并发编程实战学习(3)--基础构建模块
- Python基础学习--第十一篇(模块)
- 基础档案 模块功能分析
- 学会Linux下C语言编程--基础知识
- java并发编程实战-基础构建模块1
- 《java并发编程实战》基础构建模块(一)
- 零基础学习python_模块(50-52课)
- Maven多模块,Dubbo分布式服务框架,SpringMVC,前后端分离项目,基础搭建,搭建过程出
- Theano 模块 基础知识篇
- Java并发读书学习笔记(四)——基础构建模块
- 基础入门_Python-模块和包.深入Celery之节点管理/任务调度/任务追踪?