一种BCH码编译码的实现
- 格式:pdf
- 大小:113.48 KB
- 文档页数:5
BCH码编译码器仿真与设计实现西南科技⼤学课程设计报告课程名称:通信系统课程设计设计名称:BCH码编译码器仿真与设计实现姓名:学号:班级:指导教师:杨俊平起⽌⽇期:2012.6.4-2011.6.18西南科技⼤学信息⼯程学院制课程设计任务书学⽣班级:通信0902 学⽣姓名:李尧学号: 20096090 设计名称: BCH码编译码器仿真与设计实现起⽌⽇期: 2012.6.9—2012.6.25 指导教师:杨俊平课程设计学⽣⽇志课程设计评语表BCH 码编译码器仿真与设计实现⼀、设计⽬的和意义BCH 码具有能纠正多个错误的能⼒ ,因⽽在现代数字通信系统中得到了⼴泛的应⽤.在BCH 码中 , (15,5)BCH 码具有纠3位错误的能⼒ ,其信息位为5位 ,去掉⼀位后刚好形成半个字节(4位) 的信息位.很适合单⽚机与单⽚机之间、单⽚机与计算机之间及计算机与计算机之间的数字信息传送中的差错控制.所以该设计的⽬的是为了更加熟悉BCH 码的编译码过程,让我们对其更加了解在以后的运⽤上更加娴熟。
⼆、设计原理1.BCH 码定义:BCH 码1959 年由Hocquenghem 、1960 年由Bose 和Chandhari 分别独⽴提出。
BCH 码是能够纠正多个随机错误的循环码,可以⽤⽣成多项式g(x)的根描述。
给定任⼀有限域GF(q)及其扩域GF(m q ),其中q 是素数或或者某⼀素数的幂,m 为某⼀正整数。
设β='α∈GF(2m ),l 是任意整数,α是GF(2m )的本源元,若V 是码元取⾃GF(2)上码长为n 的循环码,他的⽣成多项式g (x )含有以下2t 个根β、2β、、、2t β,则由g (x )⽣成的循环码称为⼆元BCH 码,若β、2β、、、2t β中有⼀个是本原元,则g (x )⽣成的码称为本原BCH 码。
要考虑g (x )能否⽣成本原BCH 码,将要考虑β、2β、、、2t β中是否有⼀个本源元,实际上只要考虑β是本原元,g (x )⽣成本原BCH 码,若β不是本原元,则i β也⼀定不是本原元,因⽽⽣成本原BCH 码。
可变码率BCH 码编译码的FPGA 实现刘 冀1,孙 玲2(1.中国电子科技集团公司第五十四研究所,河北石家庄050081;2.石家庄供电公司科技信息部,河北石家庄050081)摘 要 为了克服LDPC 的误码平台,可采用BC H 码与LDPC 的级联。
在参考了多种编译码结构的基础上,针对二进制BCH 码,介绍了适合码率可变的编译码方法,包括短时延的编码,译码中的伴随式计算、错误位置多项式的计算、错误位置的求解、逆元素的求解和相关控制存储等模块所采用的算法及FPGA 实现的硬件结构。
通过测试,该算法结构占用FPGA 资源适中,整体硬件实现可靠,在工作时钟为150MHz 时,数据吞吐速率达到100MHz 以上。
关键词 B CH ;LDPC ;级联码;FPGA中图分类号 TN92 文献标识码 A 文章编号 1003-3106(2010)07-0011-02FPGA Implementation of Coding /Decoding ofVariable -rate BCH CodeLIU Ji 1,SUN Ling2(1.The 54th Research Ins titute o f CETC ,Shijia zhuang H ebei 050081,China ;2.Depa rtment of Science &Technology &Info rmation o f Shijazhuang Electric Power Inc .,Shijia zhuang H ebei 050081,China )A bstract To overcome the defect of error floor of LDPC ,BCH can be cascaded with LDPC .Based on several coding /decodin g structures ,the article introduces the encoding and decoding algorithm of variable -rate BCH code ,includin g the al gorithms and hardware structures for encoder with short delay ti me ,s yndrome calculation ,error position pol ynomial calculation ,error position calculation ,inverse element calculation and related control and storage modules inside decoder .In practical test ,this algorithm is reliable and occupies an appropriate amount of FPGA resource .When the working clock is 150MHz ,the data transmission rate is more than 100MHz .Key words BCH ;LDPC ;cascaded code ;FPGA收稿日期:2010-04-190 引言近几年,随着计算机遍历搜索技术和超大规模集成电路工艺的发展,LDPC 的构造和实现逐步成熟,但是,误码平台[2]影响了LDPC 在许多领域中的应用。
实验6 BCH循环码的编码与译码一、实验内容用VC或Matlab软件编写循环BCH码的编码与译码程序。
利用程序对教科书的例题做一个测试。
二、实验环境1.计算机2.Windows 2000 或以上3.Microsoft Visual C++ 6.0 或以上4.Matlab 6.0或以上三、实验目的1.通过BCH循环码的编码与译码程序的编写,彻底了解并掌握循环BCH的编码与译码原理2.通过循环BCH码的编码与译码程序的编写,提高编程能力。
四、实验要求1.提前预习实验,认真阅读实验原理以及相应的参考书。
2.对不同信道的进行误码率分析。
特别是对称信道,画出误码性能图。
即信道误码率与循环汉明码之间的关系。
3.认真填写实验报告。
五、实验原理1.循环BCH的编码与译码原理(略)2.循环BCH的程序实现。
六、实验步骤bch_en_decode.m文件function bch_en_decode()code=bch155code=code+randerr(5,15,1:3);code=rem(code,2);code=gf(code) %随机产生1-3位错误decode=debch155(code)endfunction decode=debch155(code)code=gf(code);M=4;code = gf(code.x,M);[m , n]=size(code);decode=[];code1=[];for i=1:m ;code1=code(i,:);M=code1.m;T2=6;N=15;S = code1* ((gf(2,M,code1.prim_poly)).^([N-1:-1:0]'*([1:T2])));LambdaX = gf([1 zeros(1,T2)],M,code1.prim_poly);Tx = [0 1 zeros(1,T2-1)];L=0;for k = 1:T2;LambdaXTemp = LambdaX;Delta = S(k) - LambdaXTemp(1+[1:L])*(S(k-[1:L]))';if Delta.x;LambdaX = LambdaXTemp - Delta*Tx;if 2*L < k;L = k-L;Tx = LambdaXTemp/Delta;end;end;Tx = [0 Tx(1:T2)];end;LambdaXValue = LambdaX.x;LambdaX = gf(LambdaXValue(1:max(find(LambdaXValue))), M, code1.prim_poly);errLoc_int = roots(LambdaX);errLoc = log(errLoc_int);for i = 1:length(errLoc);errorMag = 1;code1(N-errLoc(i)) = code1(N-errLoc(i)) - errorMag;end;decode=[decode;code1]; end;ccode = gf(decode.x);decoded = ccode(:,1:5);endfunction [yout]=bch155(x) %定义函数k=5; %信息码位,BCH(15,5)if nargin<1x2=randint(5,k);n=5;msg=x2 %判断输入信息 ,若未输入,系统自动产生5组信息码,并显示出信息位elseif rem(length(x),k)==0;n=length(x)/k;x2=[]; %判断msg是否为K的整数倍,并把输入码员分组for i=0:n-1x2=[x2;x(i*k+1) x(i*k+2) x(i*k+3) x(i*k+4) x(i*k+5)];endif rem(length(x),k)>0 %把输入码员补零并分组x=[x,zeros(size(1:k-rem(length(x),k)))];n=length(x)/k;x2=[];for i=0:n-1x2=[x2;x(i*k+1) x(i*k+2) x(i*k+3) x(i*k+4) x(i*k+5)];endendendik=[eye(5) zeros(5,10)]; %输入信息码扩展x3=x2*ik;yout=[];for i=1:ng=[1 0 1 0 0 1 1 0 1 1 1];[w,yo]=deconv(x3(i,:),g); %产生余式yo=abs(rem(yo,2));yout=[yout;yo];endyout=yout+x3; %产生信息码end运行结果:msg =1 1 0 1 00 1 1 0 10 1 0 0 01 1 1 0 10 0 1 0 0code =1 1 0 1 0 1 1 0 0 1 0 0 0 1 10 1 1 0 1 1 1 0 0 0 0 1 0 1 00 1 0 0 0 1 1 1 1 0 1 0 1 1 01 1 1 0 1 0 1 1 0 0 1 0 0 0 10 0 1 0 0 0 1 1 1 1 0 1 0 1 1 code = GF(2) array.Array elements =1 1 0 1 0 1 0 1 0 1 0 0 0 1 10 1 1 1 1 1 1 0 0 0 0 1 01 00 0 0 0 0 1 1 1 1 0 0 0 11 01 1 0 0 1 0 1 1 1 0 1 0 0 0 10 0 1 1 0 0 1 1 1 1 0 1 01 1decode = GF(2^4) array. Primitive polynomial = D^4+D+1 (19 decimal)Array elements =1 1 0 1 0 1 1 0 0 1 0 0 0 1 10 1 1 0 1 1 1 0 0 0 0 1 01 00 1 0 0 0 1 1 1 1 0 1 0 11 01 1 1 0 1 0 1 1 0 0 1 0 0 0 10 0 1 0 0 0 1 1 1 1 0 1 01 1。
WORD 格式可编辑BCH 码的编译码程序 #include#include#includeintm, n, length, k, t, d; intp[21]; intalpha_to[1048576], index_of[1048576], g[548576]; intrecd[1048576], data[1048576], bb[548576];intseed; intnumerr, errpos[1024], decerror = 0; voidread_p()(int i, ninf;printf("\\nEnter a value of m such that the code length is\\n");printf("2**(m-1) - 1 < length <= 2**m - 1\\n\\n");do {printf("Enter m (between 2 and 20): scanf("%d", &m);");} while ( for (i=1; i p[0] = p[m]= if (m == 2) !(m>1) || p[i] = 0;1;p[1] = 1;!(m ⑵)); else if (m == 3) p[1]= 1;else if (m == 4) p[1]= 1;else if (m == 5) p[2]= 1;else if (m == 6) p[1]= 1;else if (m == 7) p[1]= 1;else if (m == 8) p[4]= p[5] = p[6]=1;else if (m == 9) p[4]= 1;else if (m == 10) p[3] =1;else if (m == 11) p[2] =1;else if (m == 12) p[3] =p[4] = p[7]=1; else if (m == 13) p[1] =p[3] = p[4]=1; else if (m == 14) p[1] =p[11] = p[12] =1;else if (m == 15) p[1] =1;else if (m == 16) p[2] =p [3] = p [5]=1;else if (m == 17) p[3] =1;else if (m == 18) p[7] =1;else if (m == 19) p[1] =p[5] = p[6]=1; else if (m == printf("p(x) n = 1;20) p[3]=");=1;专业技术分享WORD 格式可编辑 for (i = 0; i <= m; i++) {n *= 2;printf("%1d", p[i]);)printf("\\n");n = n / 2 - 1;ninf = (n + 1) / 2 - 1;do {printf("Enter code length (%d < length <= %d): ", ninf, n);scanf("%d", &length);} while ( !((length <= n)&&(length>ninf)));)voidgenerate_gf(){ register int i, mask;mask = 1;alpha_to[m] = 0;for (i = 0; i < m; i++) {alpha_to[i] = mask;index_of[alpha_to[i]] = i;if (p[i] != 0)alpha_to[m] ' mask;mask <<= 1;}index_of[alpha_to[m]] = m;mask >>= 1;for (i = m + 1; i < n; i++) {if (alpha_to[i - 1] >= mask)alpha_to[i] = alpha_to[m]〜((alpha_to[i - 1]〜mask) << 1); else alpha_to[i] = alpha_to[i - 1] << 1;index_of[alpha_to[i]] = i;}index_of[0] = -1;}voidgen_poly()专业技术分享WORD格式可编辑(register int ii, jj, ll, kaux;register int test, aux, nocycles, root, noterms, rdncy;int cycle[1024][21], size[1024], min[1024], zeros[1024];cycle[0][0] = 0;size[0] = 1;cycle[1][0] = 1;size[1] = 1;jj = 1;if (m > 9) { printf("Computing cycle sets modulo %d\\n", n); printf("(This may take some time)…\\n");)do {ii = 0;do {ii++;cycle[jj][ii] = (cycle[jj][ii - 1] * 2) % n;size[jj]++;aux = (cycle[jj][ii] * 2) % n;} while (aux != cycle[jj][0]);ll = 0;do {ll++;test = 0;for (ii = 1; ((ii <= jj) && (!test)); ii++)for (kaux = 0; ((kaux < size[ii]) && (!test)); kaux++)if (ll == cycle[ii][kaux]) test = 1;} while ((test) && (ll < (n - 1)));if (!(test)) {jj++;cycle[jj][0] = ll;size[jj] = 1;}} while (ll < (n - 1));nocycles = jj;printf("Enter the error correcting capability, t:");专业技术分享WORD格式可编辑scanf("%d", &t);d = 2 * t + 1;kaux = 0;rdncy = 0;for (ii = 1; ii <= nocycles; ii++) { min[kaux] = 0;test = 0;for (jj = 0; ((jj < size[ii]) && (!test)); jj++) for (root = 1; ((root < d) && (!test)); root++) if (root == cycle[ii][jj]) { test = 1;min[kaux] = ii;)if (min[kaux]) {rdncy += size[min[kaux]]; kaux++;))noterms = kaux;kaux = 1;for (ii = 0; ii < noterms; ii++)for (jj = 0; jj < size[min[ii]]; jj++) { zeros[kaux] = cycle[min[ii]][jj];kaux++;)k = length - rdncy;if (k<0){ printf("Parameters invalid!\\n"); exit(0);)printf("This is a (%d, %d, %d) binary BCH code\\n", length, k, d);g[0] = alpha_to[zeros[1]];g[1] = 1;for (ii = 2; ii <= rdncy; ii++) { g[ii] = 1;专业技术分享WORD格式可编辑for (jj = ii - 1; jj > 0; jj--)if (g[jj] != 0)g[jj] = g[jj - 1]“ alpha_to[(index_of[g[jj]] + zeros[ii]) % n]; elseg[jj] = g[jj - 1];g[0] = alpha_to[(index_of[g[0]] + zeros[ii]) % n];)printf("Generator polynomial:\\ng(x)=");for (ii = 0; ii <= rdncy; ii++) {printf("%d", g[ii]);if (ii && ((ii % 50) == 0))printf("\\n");)printf("\\n");)voidencode_bch(){register int i, j;register int feedback;for (i = 0; i < length - k; i++)bb[i] = 0;for (i = k - 1; i >= 0; i一) {feedback = data[i]〜bb[length - k - 1];if (feedback != 0) {for (j = length - k - 1; j > 0; j--)if (g[j] != 0)bb[j] = bb[j - 1]“ feedback;elsebb[j] = bb[j - 1];bb[0] = g[0] && feedback;} else {for (j = length - k - 1; j > 0; j--)bb[j] = bb[j - 1];bb[0] = 0;}}}专业技术分享WORD格式可编辑void decode_bch() (register int i, j, u, q, t2, count = 0, syn_error = 0;int elp[1026][1024], d[1026], l[1026], u_lu[1026], s[1025]; int root[200], loc[200], err[1024], reg[201];t2 = 2 * t;/* first form the syndromes */ printf("S(x)=");for (i = 1; i <= t2; i++) {s[i] = 0;for (j = 0; j < length; j++)if (recd[j] != 0)s[i] = alpha_to[(i * j) % n];if (s[i] != 0)syn_error = 1;s[i] = index_of[s[i]];printf("%3d ", s[i]);)printf("\\n");if (syn_error) {d[0] = 0;d[1] = s[1];elp[0][0] = 0;elp[1][0] = 1;for (i = 1; i < t2; i++) { elp[0][i] = -1;elp[1][i] = 0;)l[0] = 0;l[1] = 0;u_lu[0] = -1;u_lu[1] = 0;u = 0;do {u++;if (d[u] == -1) {l[u + 1] = l[u];for (i = 0; i <= l[u]; i++) {专业技术分享WORD格式可编辑elp[u + 1][i] = elp[u][i];elp[u][i] = index_of[elp[u][i]];)} else(q = u - 1;while ((d[q] == -1) && (q > 0))q--;if (q > 0) {j = q;do {j--;if ((d[j] != -1) && (u_lu[q] < u_lu[j])) q = j;} while (j > 0);}if (l[u] > l[q] + u - q)l[u + 1] = l[u];elsel[u + 1] = l[q] + u - q;for (i = 0; i < t2; i++)elp[u + 1][i] = 0;for (i = 0; i <= l[q]; i++)if (elp[q][i] != -1)elp[u + 1][i + u - q]=alpha_to[(d[u] + n - d[q] + elp[q][i]) % n];for (i = 0; i <= l[u]; i++) {elp[u + 1][i] = elp[u][i];elp[u][i] = index_of[elp[u][i]];}}u_lu[u + 1] = u - l[u + 1];if (u < t2) {if (s[u + 1] != -1)d[u + 1] = alpha_to[s[u + 1]];专业技术分享WORD格式可编辑elsed[u + 1] = 0;for (i = 1; i <= l[u + 1]; i++)if ((s[u + 1 - i] != -1) && (elp[u + 1][i] != 0)) d[u + 1]〜= alpha_to[(s[u + 1 - i]+ index_of[elp[u + 1][i]]) % n];d[u + 1] = index_of[d[u + 1]];)} while ((u < t2) && (l[u + 1] <= t));u++;if (l[u] <= t) {for (i = 0; i <= l[u]; i++)elp[u][i] = index_of[elp[u][i]];printf("sigma(x)=");for (i = 0; i <= l[u]; i++)printf("%3d ", elp[u][i]);printf("\\n");printf("Roots:");for (i = 1; i <= l[u]; i++)reg[i] = elp[u][i];count = 0;for (i = 1; i <= n; i++) {q = 1;for (j = 1; j <= l[u]; j++)if (reg[j] != -1) {reg[j] = (reg[j] + j) % n;q ' alpha_to[reg[j]];}if (!q) {root[count] = i;loc[count] = n - i;count++;printf("%3d ", n - i);}}printf("\\n");if (count == l[u])for (i = 0; i < l[u]; i++)recd[loc[i]] = 1;专业技术分享WORD格式可编辑elseprintf("Incomplete decoding: errors detected\\n");))) main()(int i;read_p();generate_gf();gen_poly();seed = 131073;srandom(seed);for (i = 0; i < k; i++) data[i] = ( random() & 65536 ) >> 16;encode_bch();for (i = 0; i < length - k; i++) recd[i] = bb[i];for (i = 0; i < k; i++)recd[i + length - k] = data[i];printf("Code polynomial:\\nc(x)=");for (i = 0; i < length; i++) {printf("%1d", recd[i]);if (i && ((i % 50) == 0)) printf("\\n");)printf("\\n");printf("Enter the number of errors:\\n");scanf("%d”, &numerr);printf("Enter error locations (integers between"); printf(" 0 and %d): ", length-1);for (i = 0; i < numerr; i++) scanf("%d", &errpos[i]);专业技术分享WORD格式可编辑if (numerr)for (i = 0; i < numerr; i++) recd[errpos[i]] = 1;printf("r(x)=");for (i = 0; i < length; i++) { printf("%1d", recd[i]);if (i && ((i % 50) == 0)) printf("\\n");)printf("\\n");decode_bch();printf("Results:\\n");printf("original data =");for (i = 0; i < k; i++) { printf("%1d", data[i]);if (i && ((i % 50) == 0)) printf("\\n");)printf("\\nrecovered data =");for (i = length - k; i < length; i++) { printf("%1d", recd[i]);if ((i-length+k) && (((i-length+k) % 50) == 0)) printf("\\n");)printf("\\n");for (i = length - k; i < length; i++) if (data[i - length + k] != recd[i]) decerror++; if (decerror)printf("There were %d decoding errors in message positions\\n", decerror); else printf("Succesful decoding\\n");)专业技术分享。
BCH码的常用译码方法优点:译码速度快,而且硬件实现比较容易;缺点:当错误位数比较多时,存储表格将会消耗大量的硬件资源;优点:使用的硬件资源相对较少,对错误位数不敏感;缺点:运算速度与纠错位数成线性关系,硬件复杂度较高;Gorenstein-Zierler 译码算法对于线性分组码的纠错来说,我们需要两个信息就可以确定码中存在的错误:(1) 错误发生的位置;(2) 错误的大小;Gorenstein-Zierler迭代算法的译码过程,就是利用BCH码的生成多项式的特点确定这两个信息的过程。
12211e x e x e x e e(x)n n n n ++++=---- vv i i i i i i xe x e x e e(x)+++= 2211其中 表示第 k 个错误的大小。
k i e 对于一个码长为n的BCH码,其纠错能力为t,其错误多项式.,,,21v i i i 假设实际发生了v 个错误, 0 ≤ v ≤ t。
错误发生位置为它的系数中最多有t个非零系数。
在域元素 处的伴随式其中:其中 是第k个错误的位置, 是这个位置对应的域元素。
错误大小:错误位置:在j=1,2,…,2t处,有V个未知的错误大小Y1,Y2,…,Y v)xX ()xX )(xX (x Λx Λx ΛΛ(x)v v v v v ---=+++=--111121111 错误位置的倒数 就是这个多项式的零点。
1-k X定义错误位置多项式为:⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡---=⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡ΛΛΛ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡++---++-v v v v v v v v v v v v v S S S S S S S S S S S S S S S 2211112221132121 通过解这个方程组,就可以求出错误位置多项式的所有系数 的值。
i Λ1) 先尝试设 ,计算伴随式矩阵的行列式 。
tv =)det(M ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=--++-12221132121v v v v v v v v S S S S S S S S S S S S M 如果 ,说明伴随式矩阵是奇异的,接收码字中没有发生t 个错误。
信道编码姓 名:郭宇琦 学 号:xxx2009xxx一、 实验目的1. 复习巩固BCH 码编码译码知识。
2. 使用matlab 进行实践编写BCH ,了解实际应用中BCH 的编码译码过程。
3. 结合实践验证所学BCH 码知识。
二、 实验原理BCH 码是用于校正多个随机错误的多级、循环、错误校正、变长数字编码,是循环码的子类。
本原BCH 码编码原理如下:1. 确定n 、m 、t.2. 用函数构造扩域GF()m q ,q=2取二进制,GF(2)m3. 取本原元α,根据纠错能力t ,确定连续根232t αααα⋅⋅⋅,,,,。
通过逐个验证每个元素来找出每一个根的全部共轭根系。
根据-1242()(-)(-)(-)(-)k M x x x x x βββββ=⋅⋅⋅计算最小多项式。
4. 所有非共轭根系的最小多项式乘积得到生成多项式()g x5. 利用系统码编码方程--()()=()+Rem [()]n k n k g x C x x m x x m x ,进行编码。
BCH 码译码方法主要有Peterson 译码法和Berlekamp 迭代译码法等,其中Peterson 译码方法如下:1. 计算伴随式。
已知接受向量()R x ,则(),i=1,2,...2i i S R t β=2.求解错误位置。
引入错误位置多项式,将求解错误位置的问题转化为求解线性方程组的问题1-121+1+1122+22112222++.......+=++......+s =......s ......e e e e e e e e e e e e e s s s s s s s s s s σσσσσσσσσ--⎧⎪⎪⎨⎪⎪+++=⎩3.用Peterson 译码方法译码,解出错误位置多项式系数和错误图样,得到估值码字。
(1).假设e=t ,计算S 行列式M 的值。
M=0则降阶,e=e-1,同样计算直到M ≠0.(2)将上面得到的2t 个连续根代入试根,求上述方程组解。
BCH译码算法的研究及硬件实现的开题报告
研究背景
BCH码是一种常用的纠错码,常常应用于数字通信、数字存储等领域,可以有效地纠正传输或存储中的错误。
BCH码的译码算法有很多种,但是如何在硬件上实现译码算法是一个难点,因此有必要对BCH译码算
法的硬件实现进行研究。
研究目的
本研究旨在探究BCH码的译码算法,并深入研究BCH译码算法的硬件实现方法。
通过本研究,可以在硬件上实现高效快速的BCH译码算法,提高纠错码的译码效率。
研究内容
本研究将重点研究以下内容:
1. BCH码的基本概念和译码算法;
2. BCH码的硬件实现方法,包括综合设计、布局布线和验证等步骤;
3. 利用Verilog语言实现BCH码的硬件译码器,并进行仿真和验证;
4. 通过FPGA实现BCH码的硬件译码器,并进行性能测试。
研究方法
本研究将采用文献综述和实验研究相结合的方法。
通过文献综述,
全面了解BCH码的相关知识和译码算法,分析各种译码算法在硬件实现
中的优缺点;通过实验研究,利用Verilog语言实现BCH码的硬件译码器,并在FPGA上进行测试。
研究意义
本研究针对BCH码的译码算法的硬件实现方法进行了深入研究,可以提供一种高效、快速、可靠的纠错码译码方案。
这对于提高数字通信
和数字存储等领域的数据传输的可靠性和稳定性具有一定的实际应用价值。
DVB-S2中BCH编译码的研究与实现本文针对DVB-S2中使用的BCH码主要进行了编译码算法、硬件实现和纠错性能三个方面的研究。
在编译码算法研究的基础上设计了符合DVB-S2应用的可配置串行和并行编/译码器电路结构,并对所设计的电路进行了FPGA实现。
最后对DVB-S2中BCH和LDPC级联码的纠错性能进行了实验分析和研究。
本文在以上三个方面所完成的主要工作和取得的主要研究成果有:1.对传统的基于BM迭代的BCH译码算法的改进。
在传统的BCH迭代译码算法中根据迭代过程需要计算的伴随式个数为2t,本文在对二进制BCH码的BM迭代过程进行深入分析后,发现在其迭代过程中对迭代结果有用的伴随式只有2t-1个,最后一个伴随式是不需要的。
据此,改进后的译码算法只需要计算2t-1个伴随式,从而实现了对算法的简化。
2.根据BCH的编码算法分别设计了符合DVB-S2标准的串行和并行编码电路。
串行编码电路采用移位寄存器实现,并行电路由一个组合逻辑网络和余数寄存器构成。
在此基础上对编码器的动态可配置方案进行了研究,提出了编码器的串行和并行配置结构。
对所设计的两种编码器分别进行了FPGA实现,8位并行编码器的编码速率可达到2244Mbps。
3.根据改进的译码算法分别设计了可灵活配置多种参数的串行和并行流水译码器体系结构。
该结构对码字参数之间相差较大而造成的流水和配置问题进行了充分考虑,从而使得译码器的可配置参数范围得到了很大提高。
在译码器设计中,通过对不同有限域上乘法器设计共同点的发掘,设计了支持不同有限域的重构乘法器电路,比单独设计不同的有限域乘法器节省了硬件资源。
对设计好的两种译码器分别进行了实现和正确性仿真,8位并行译码器译码速率可达到1528Mbps。
4.分析了在DVB-S2中采用BCH和LDPC进行级联的原因。
首先,对DVB-S2中使用LDPC码和BCH+LDPC级联码进行了性能仿真和对比,仿真结果表明,采用级联码要比单独使用LDPC多出0.5dB的编码增益;其次,采用与BCH码具有相同码长和码率的RS码与LDPC进行级联,通过级联的结果来看,采用BCH+LDPC级联比RS+LDPC可获得0.1dB的编码增益。