-
2020-07-19 11:54:25
1.语法
(1)[blk,err] = nrCRCDecode(blkcrc,poly)
[blk,err] = nrCRCDecode(blkcrc,poly)检查输入数据blkcrc中是否存在CRC错误。该函数假定输入数据包括与多项式poly相关的CRC奇偶校验位。该函数返回blk,这是输入blkcrc的数据部分。该函数还返回err,它是输入中包含的CRC与跨输入的数据部分重新计算的CRC之间的逻辑差(XOR)。如果err不等于0,则说明发生了错误或输入CRC被屏蔽。有关相关多项式的详细信息,请参见TS 38.212第5.1节[1]。
(2)[blk,err] = nrCRCDecode(blkcrc,poly,mask)
[blk,err] = nrCRCDecode(blkcrc,poly,mask)在使用err返回之前,用mask对CRC差异进行XOR屏蔽。将掩码值应用于CRC差,最高有效位(MSB)在前,最低有效位(LSB)在后。
例:检查数据块是否存在CRC错误
使用和不使用掩码检查CRC解码的效果
(1)定义与等于12的无线网络临时标识符(RNTI)对应的掩码。将RNTI掩码的CRC奇偶校验位附加到一个数据块的全1矩阵。
rnti = 12;
blkCrc = nrCRCEncode(ones(100,1),‘24C’,rnti);(2)当执行不带掩码的CRC解码时,err1等于RNTI,因为CRC在编码过程中被掩码了。原始CRC与重新计算的CRC之间的逻辑差异是CRC掩码。
[blk,err1] = nrCRCDecode(blkCrc,‘24C’);
err1(3)使用RNTI值作为掩码执行CRC解码时,err等于0。
[blk,err2] = nrCRCDecode(blkCrc,‘24C’,err1);
err22.输入参数
(1)blkcrc — CRC编码的数据
CRC编码的数据,指定为实数矩阵。矩阵的每一列均视为单独的CRC编码数据块。
数据类型:双精度/8位整型/逻辑型
(2)poly — CRC多项式
CRC多项式,指定为“ 6”,“ 11”,“ 16”,“ 24A”,“ 24B”或“ 24C”。有关相关多项式的详细信息,请参见TS 38.212第5.1节。
数据类型:字符/字符串
(3)掩码—XOR掩码
XOR掩码,指定为非负整数。该掩码通常是无线电网络临时标识符(RNTI)。
数据类型:双精度
3.输出参数
(1)blk — CRC解码的数据
CRC解码数据,以实数矩阵形式返回。 blk是输入blkcrc的仅数据部分。
数据类型:双精度/8位整型/逻辑型
(2)err —逻辑CRC差
逻辑CRC差,以整数形式返回。 err是输入blkcrc中包含的CRC与跨输入数据部分重新计算的CRC之间的逻辑差。如果指定了掩码,则函数XOR使用mask对err-masks进行掩码,然后再返回它。
数据类型:无符号32位整型
4.参考文献
[1] 3GPP TS 38.212. “NR; Multiplexing and channel coding.” 3rd Generation Partnership Project; Technical Specification Group Radio Access Network.
更多相关内容 -
CRC 编码器和解码器:CRC 残差生成器,加上 CRC 解码器-matlab开发
2021-05-29 09:16:49.m 中的代码以通过多项式和通用数据生成废物 -
MATLAB的CRC编解码程序
2018-03-05 15:21:10详细描述了MATLAB中CRC循环冗余校验的编解码程序,已经通过测试,能运行 -
曼彻斯特编码解码+CRC校验,进行高速LVDS传输。。代码.zip
2019-08-25 01:32:40第二部分为曼彻斯特解码,同样同步头和数据位数可以参数化设计,解码完成后,对数据进行CRC校验,然后和接收到的CRC码进行比较,一验证传输是否正确。 decod_crc_par.rar (51.44 KB, 下载次数: 194 ) -
第9关:CRC编码流水传输实验.txt
2020-06-11 16:32:06第9关:CRC编码流水传输实验.txt sadassaasdasdasdasdasdasdsdadasdas -
crc编码代码matlab-CRC-Encoder-and-Decoder:CRC编码器和解码器
2021-05-27 07:05:08crc编码代码matlab CRC编码器和解码器 第1部分– CRC校验实现(12个标记)。 您将使用生成多项式g(x)= x5 + x3 + 1,其中(n,k)=(20,15...运行CRC解码器以确定CRC是否检测到错误。 最后,脚本将以下内容打印到屏幕 -
基于C语言的CRC编码与解码的实现
2020-01-21 22:02:38编写两个子程序,分别实现CRC编码和CRC解码,在主函数中对子程序进行调用。 解码子程序应能根据解码情况判断出接收到的数据帧是否出错,并给出提示。 要求分别以正确和错误的数据来检验此检错程序。 实验原理 CR...基于C语言的CRC编码与解码的实现
实验目的
-
设置一个d位的数据D, r+1位的多项式G,编写程序生成CRC码,并把此CRC码 作为数据帧进行传送。
-
编写两个子程序,分别实现CRC编码和CRC解码,在主函数中对子程序进行调用。 解码子程序应能根据解码情况判断出接收到的数据帧是否出错,并给出提示。
-
要求分别以正确和错误的数据来检验此检错程序。
实验原理
CRC检验原理实际上就是在一个p位二进制数据序列之后附加一个r位二进制检验码(序列),从而构成一个总长为n=p+r位的二进制序列;附加在数据序列之后的这个检验码与数据序列的内容之间存在着某种特定的关系。如果因干扰等原因使数据序列中的某一位或某些位发生错误,这种特定关系就会被破坏。因此,通过检查这一关系,就可以实现对数据正确性的检验。
CRC校验码的计算
设信息字段为K位,校验字段为R位,则码字长度为N(N=K+R)。设双方事先约定了一个R次多项式g(x),则CRC码:V(x)= A(x) g(x) = x Rm(x) + r(x)
其中: m(x)
为K次信息多项式,r(x)为R-1次校验多项式。
这里r(x)对应的代码即为冗余码,加在原信息字段后即形成CRC码。
r(x)的计算方法为:在K位信息字段的后面添加R个0,再除以g(x)对应的代码序列,得到的余数即为r(x)对应的代码(应为R-1位;若不足,而在高位补0)。计算实例
下面以一个例子来具体说明整个过程。现假设选择的CRC生成多项式为G(X)
= X4 + X3 + 1,要求出二进制序列10110011的CRC校验码。具体的计算过程:①首先把生成多项式转换成二进制数,由G(X)= X4 + X3 + 1可以知道:它一共是5位(总位数等于最高位的幂次加1,即4+1=5),然后根据多项式各项的含义(多项式只列出二进制值为1的位,也就是这个二进制的第4位、第3位、第0位的二进制均为1,其它位均为0)很快就可得到它的二进制比特串为11001。
② 因为生成多项式的位数为5,根据前面的介绍,得知CRC校验码的位数为4(校验码的位数比生成多项式的位数少1)。因为原数据帧10110011,在它后面再加4个0,得到101100110000,然后把这个数以“模2除法”方式除以生成多项式,得到的余数,即CRC校验码为0100,如图所示。
③把上步计算得到的CRC校验码0100替换原始帧101100110000后面的四个“0”,得到新帧101100110100。再把这个新帧发送到接收端。
④当以上新帧到达接收端后,接收端会把这个新帧再用上面选定的除数11001以“模2除法”方式去除,验证余数是否为0,如果为0,则证明该帧数据在传输过程中没有出现差错,否则出现了差错。
CRC编码算法实现
① 选择生成多项式G,其最高次方为r,即r+1位的二进制位串
②计算D·2r, 即在数据D后面补r个0,构成d+r位的位串
③按模2除法求(D·2r/G)的余数R,即:
④从D·2r中模2减去R,得到新的数据T,即加了CRC的帧
代码实现
CRC.h文件:
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> int D[40], M[40], G[40]; //M[]为生成器数据 G[]为原始数据 D[]为经处理除数/待解码数据 int m, n; //m为生成器长度 n为原始数据长度 void CRC(void); //CRC编码 void CRL(void); //CRC译码 void XOR (void); //模2除法
operation.c文件:
#include "CRC.h" //CRC编码 void CRC(void) { int i; for(i = 0; i <= n - 1; i++) D[i] = G[i]; //D[]为即将要处理的原始数据 for(i = n; i <= m + n - 2; i++) D[i] = 0; //对要进行操作的被除数D[]进行求补 printf("\n\t\t原始数据补数处理后为:"); for(i = 0; i <= m + n - 2; i++) //输出原始数据G[]求补后的数D[] printf("%d",D[i]); XOR();//进行模2除法,求余数 for(i = 0; i <= n - 1; i++) D[i] = G[i]; //将余数加到原数据后面,完成CRC编码 printf("\n\n\t编码后结果为:"); for(i = 0; i <= m + n - 2; i++) printf("%d", D[i]); } //CRC译码 void CRL(int m, int n) { int i; system("cls"); printf("\n\n\t请输入%d位需要解码的数据:",n + m - 1); for(i = 0; i <= n + m - 2; i++) scanf("%d", &D[i]); //接收待验证编码序列D[] XOR();//对D[]进行模2除法进行验证 for(i = 0; i <= m + n - 2; i++) if (D[i] != 0)i = m + n; //若余数均为0,则判断数据完全正确 if(i == m + n - 1) printf("\n\n\t数据完全正确\n"); else printf("\n\n\t数据出错\n"); } //模2除法 void XOR(void) { int i, j, k = 0; for(i = 0; i <= n-1; i++){ if (D[i] == 1){//当第一位为1时进行异或操作 k= 0;//k对生成器数据作比较的位置进行记录 for (j = i; j < i + m; j++){ if(M[k] == D[j]) D[j] = 0; //两数相同为0 else D[j] = 1; //两数相异为1 k++; } printf("\n\t\t异或结果:"); //对每次异或的结果进行输出显示 for(k = 0; k <= m + n - 2; k++) printf("%d", D[k]); } } }
Main.c文件:
#include "CRC.h" int main(){ int i,a; printf("\n\n\t请输入生成器的长度:"); scanf("%d", &m); printf("\n\t请输入原始数据的长度:"); scanf("%d", &n); printf("\n\n\t请输入生成器 = "); for (i = 0; i <= m - 1; i++) scanf("%d", &M[i]); printf("\n\t请输入原始数据 = "); for ( i= 0; i <= n - 1; i++) scanf("%d", &G[i]); CRC(); //CRC编码 printf("\n\n\t是否继续(1代表继续,2代表退出)? "); scanf("%d", &a);getchar(); if (a == 1)CRL(m, n); //若继续则进行译码 else { system("cls"); printf("\n\n\t按任意键退出\n"); getchar(); //接收任意键 exit(0); } return 0; }
演示结果
CRC编码
CRC译码正确
CRC译码错误
总结
(1)CRC是一种常用的检错码,并不能用于自动纠错。
(2)只要经过严格的挑选,并使用位数足够多的除数 P,那么出现检测不到的
错误的概率就很小。
(3)仅用循环冗余检验 CRC 差错检测技术只能做到无差错接受(只是非常近似的认为是无差错的),并不能保证可靠传输。
(4)余数的位数一定要是比除数位数只能少一位,哪怕前面位是0,甚至是全为0(附带好整除时)也都不能省略。 -
-
数据表示实验 logisim 华中科大 circ
2021-11-17 15:02:51观看慕课第三章数据表示实验的 1、汉字编码实验(用 HXD.EXE 将 ROM 内容换成自我简介,姓名,籍贯,年 龄) 2、奇偶检验码应用实验 3、海明码编码设计实验(22,16) ...和 CRC 解码电路;看懂 CRC 码流水传输的原理。 -
data实验.circ
2020-05-02 12:55:12包含计算机数据表示实验的全部编码(九关)分别是 1.汉字国标码转区位码实验 2.汉字机内码获取实验 3.偶校验解码电路设计 4.偶校验编码设计 ...8.16位CRC并行编解码电路设计 9.CRC编码流水传输实验 -
CRC编码解码 matlab仿真
2016-05-19 17:27:14CRC编码的matlab仿真,内含文档和代码。 -
data.circ计算机组成与体系结构实验
2020-06-03 14:05:24计算机数据表示实验 前五关 1.汉字国标码转区位码实验 2.汉字机内码获取实验 3.偶校验解码电路设计 4.偶校验编码设计 5.16位海明编码电路设计 -
Verilog 实现32位并行CRC编解码 可在一个时钟周期出结果
2021-09-16 09:17:01Verilog 实现32位并行CRC编解码 可在一个时钟周期出结果 CRC简介 CRC(Cyclic Redundancy Check,循环冗余校验)是数据帧传输中常用的一种差错控制编码方式,针对要发送的数据帧,使用一些特定的多项式可以计算出CRC...Verilog 实现32位并行CRC编解码 可在一个时钟周期出结果
CRC简介
CRC(Cyclic Redundancy Check,循环冗余校验)是数据帧传输中常用的一种差错控制编码方式,针对要发送的数据帧,使用一些特定的多项式可以计算出CRC校验结果,CRC校验结果和原始数据一起传输到接收端。
接收端在接收数据的同时按照相同的多项式对接收数据进行校验运算,并将 校验结果和接收的结果进行对比,如果二二者相同则认为没有发生传输错误;如果不同,则认为是发生了传输错误。从理论上说,如果接收端计算出的CRC值与接收到的CRC值匹配,数据中仍有出错的可能,但由于这种可能性极低,在实际应用中可以视为0,即没有错误出现。当接收端CRC不匹配时,接收端可以采取不同的措施,例如,丢弃数据包并通知对端,要求对端重新发送,或者只进行丢弃处理,通过高层协议实现数据的重传。
CRC多项式
本文介绍的并行CRC多项式为:x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x1 + 1.为32CRC常用多项式。crc32=32’h104c11db7.
仿真
很多提供的CRC编解码都是Verilog串行资料,因此博主花了点时间验证了Verilog并行实现。废话少说上图:
串行CRC
对于串行32位CRC,需要32个时钟周期出结果。本文一帧数据96bit,所以串行32crc需要分3批运算96次。
第一批
运算的第一批32位数据32’h00100000,crc结果32’h1d8ac870
运算的第二批32位数据32’h55555555,crc结果32’ha48ebce5
运算的第三批32位数据32’haaaaaaaa,crc结果32’hfc3c3755则,96’h0010000055555555aaaaaaaa的串行CRC结果为32’hfc3c3755.一共用了96个时钟周期运算。
并行CRC
第一个时钟32位数据32’h00100000,并行crc结果32’h1d8ac870
第二个时钟32位数据32’h55555555,并行crc结果32’ha48ebce5
第三个时钟32位数据32’haaaaaaaa,并行crc结果32’hfc3c3755
96’h0010000055555555aaaaaaaa的并行CRC结果为32’hfc3c3755.
可以看出并行CRC和串行CRC结果保持一致,但是在同样的一帧96bit数据串行crc用了96个clk.并行crc用了3个clk(不看其他开销)。具体Verilog的并行CRC代码如下链接下载
链接: https://download.csdn.net/download/baozouxiaoluoli/22331004.
-
第8关:16位CRC并行编解码电路设计.txt
2020-06-11 16:31:44第8关:16位CRC并行编解码电路设计.txt hgchgchgchgchgchgcghcghchjgjhmknlk -
【Logisim】汉字编码解码和流水传输实验
2020-07-16 16:36:521.了解汉字的机内码、区位码、字形码的区别。 2.了解海明编码和解码的原理。 3.了解流水传输机制。 华中科技大学《计算机硬件系统设计》 -
极坐标码的CRC辅助解码
2021-03-10 11:43:45极坐标码的CRC辅助解码 -
CRC码的编码、解码(循环冗余校验码)
2019-06-19 03:00:02一、CRC码的原理 CRC码是一种可以检查出多位错误的校验码。 利用CRC码检错的过程如下:发送端有 在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(CRC码),附在原始信息后边,构成一个...一、CRC码的原理
CRC码是一种可以检查出多位错误的校验码。
利用CRC码检错的过程如下:
在发送端根据要传送的k位二进制码序列,以一定的规则产生一个校验用的r位监督码(CRC码),附在原始信息后边,构成一个新的二进制码序列数共k+r位,然后发送出去。在接收端,根据信息码和CRC码之间所遵循的规则进行检验,以确定传送中是否出错。这个规则,在差错控制理论中称为“生成多项式”。
在上面这个图中,总位长必须符合这个式子(考试考过)生成多项式是一个二进制序列,它比校验信息多一位(即r+1位),发送方用它对被校验的信息进行模二的除法运算,以此来生成校验码序列。接收方也这么操作。
补充一下模二运算是什么
模2除法·,从字面上可理解为二进制下的除法。
模2除法与算术除法类似,但每一位除的结果不影响其它位,即不向上一位借位,所以实际上就是异或。
举个栗子:
1111000除以1101:
二、CRC码的编码
先求这个式子的r的最大值
然后找到G(X) [这个好像是直接查就行了]
然后在有效信息后面补r个0
举个栗子
这个时候把之前的3个0替换成010就好了
这时候,1100010就是crc编码三、那么如何校验呢
看这个图,比较清晰:
举个栗子
可以看到 余数为0,那就没错但是如果是这样:
四、检错与纠错
看一下如何纠错
这个图讲的比较抽象 可以详细讲一讲 但是太晚了我以后再写吧。。。。。 -
基于FPGA的CRC编解码器实现.pdf
2021-07-13 14:38:32基于FPGA的CRC编解码器实现.pdf -
CRC编解码器及其FPGA实现
2010-07-21 10:45:03CRC编解码器及其FPGA实现 简要介绍C R C编码原理及其常用实现方法的基础上, 提出了一种基于字节型递推( 会式法i 法的C R C编解码器算法, 并给出了它的F P G 人实现方案。 -
16位CRC并行编解码电路设计(计算器数据表示实验)
2020-04-15 22:03:00再将22位CRC编码进行解码成16位数据,且判断数据是否在传输过程中发生一位错,两位错的情况,若出错,则必须对数据进行纠正。因此该实验要进行两个的电路图的设计。 一.16位CRC并行编码电路设计 1.解题思路 ①已知该... -
通信与网络中的10G以太网系统中的并行CRC编解码器的设计
2020-12-10 04:05:03摘要:为了解决10G以太网接入系统中大规模并行CRC编码器的设计问题,提出了矩阵法、代入法、流水线法等三种设计方法。以此为基础,给出了10G以太网接入系统CHC编码器的实现方案。具体计算表明,在10G以太网接入系统... -
CRC16位运算码_c++crc16_tapezbc_CRC16modebus校验程序_迪文
2021-09-10 14:58:30迪文屏CRC16校验代码,C语言编写的,方便移植,可以直接使用,亲测完全没问题,自己 在用的代码,分享给大家 -
数据表示实验.circ
2020-06-10 12:50:45华中科技大学数据表示实验的全部电路图都有,有需要的小伙伴自己下载,这些电路都是经过本人测试,是可以通关的!!! -
CRC校验原理简述及python代码实现CRC检验误码
2021-03-15 17:52:24CRC循环原理简述 要理解CRC的运算过程,先要了解模2运算,这是CRC编码中的运算规则。 也就是说,模2运算就是对两个长度相同的二进制数进行异或运算(不进位借位的运算)。 CRC的运算过程核心是模二除法,模2除法... -
基于verilog语言实现CRC循环冗余码解码
2010-09-15 11:07:04用Verilog语言实现16位CRC码的解码 -
最通俗易懂CRC原理以及CRC-12 java源代码
2021-04-15 20:48:291.做课设的时候看了很多资料,结果很多讲的不清楚,这里转载一篇最好的,最通俗易懂的文章5.3.2循环冗余校验检错方案奇偶校验码只能校验一位错误,本节所要介绍的循环冗余校验码(CRC)的检错能力更强,可以检出多位错误... -
CRC校验方法,用C语言实现源代码
2021-05-19 18:32:27CRC校验CRC(Cyclic Redundancy Check)校验应用较为广泛,以前为了处理简单,在程序中大多数采用LRC(Longitudinal Redundancy Check)校验,LRC校验很好理解,编程实现简单。用了一天时间研究了CRC的C语言实现,理解和... -
CRC原理简析——史上最清新脱俗简单易懂的CRC解析
2020-11-07 13:17:58CRC原理简析 1. CRC校验原理 CRC校验原理根本思想就是先在要发送的帧后面附加一个数(这个就是用来校验的校验码,但要注意,这里的数也是二进制序列的,下同),生成一个新帧发送给接收端。当然,这个附加的数不是... -
CRC辅助的MIMO球形解码
2021-03-16 07:13:52此外,CRC辅助的清单范围提出了一种解码(CA-LSD)方案。 与传统的SD相比,CA-LSD最多可以在本地产生L 解码过程中的候选对象,以减少错过正确的码字的机会。 在接收器处,LSD 检测器将候选序列输出到CRC检测器,后... -
python 实现 CRC 冗余码的方法
2021-12-06 22:36:01python 实现 CRC 冗余码的方法 我这里考虑输入是 torch.Tensor的一个 只包含0 ,1 元素的张量 对于输入是numpy或者0,1字符串的方法就更简单了,总之都先要将输入处理成为 0,1字符串,例如“1010” 首先构造一个... -
基于Verilog的CRC算法实现
2021-07-16 13:24:35文章目录 CRC概述 CRC码的组成 校验码的生成与检验 模2除法 Verilog实现 CRC概述 CRC即Cyclic Redundancy Check,循环冗余校验,是一种数字通信中的常用信道编码技术。能识别是否出错,接收端检验时余数为0就没出错...