|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產業(yè) | CAN-bus/DeviceNe |
請教BCH(63,48)的相關問題 |
| 作者:powerpan 欄目:通信技術 |
有沒有算法,或者生成多項式? 請知道的大蝦指導一下 |
| 2樓: | >>參與討論 |
| 作者: powerpan 于 2005/10/6 21:28:00 發(fā)布:
咋沒人說話? 我都搞定了。。。 對這個論壇有點心寒。。。。。 |
|
| 3樓: | >>參與討論 |
| 作者: 宇宙飛船 于 2005/10/7 9:20:00 發(fā)布:
這個碼的糾錯能力不強,目前在單片機中用它沒有多少意義, 如果用到63位的數據包,剛好是一個方陣了,最優(yōu)的方案是用漢明碼+交織處理 能夠達到(63,40)的碼率,糾突發(fā)錯的能力是BCH碼的3倍以上! * - 本貼最后修改時間:2005-10-7 9:38:01 修改者:宇宙飛船 |
|
| 4樓: | >>參與討論 |
| 作者: powerpan 于 2005/10/7 10:46:00 發(fā)布:
需要省電,而且碼率不高 這就是為啥不能使用RS之類的原因。 誰還知道peterson迭代法求任意2個錯誤的地方的方法? 我用了捕錯法,雖然可以捕捉15位或以下的連續(xù)錯誤,但是實際通訊中根本沒有這樣連續(xù)把0,1翻轉的。。。。而捕錯法如何判斷15為以內的錯誤也是一個不確定條件,如果不是連續(xù)錯誤,雖然4位以內的任意錯都可以糾正,但是也因此會引起其他條件下的誤糾。 看了書,據說peterson和捕錯法交叉使用最好。我原來做過BCH(31,21)的peterson解碼,但是BCH(63,48)的查錯表(數學都還給老師了,不會算)沒有,所以不能編出。請大蝦們幫忙。。 |
|
| 5樓: | >>參與討論 |
| 作者: 宇宙飛船 于 2005/10/7 11:05:00 發(fā)布:
給一個BCH(48,36)的C例程, /* * File: bch4836.c * Author: Robert Morelos-Zaragoza * * %%%%%%%%%%% Encoder/Decoder for a (48, 36, 5) binary BCH code %%%%%%%%%%%%% * * This code is used in CONTROL channels for cellular TDMA in the U.S.A. * * In this specific case, there is no need to use the Berlekamp-Massey * algorithm, since the error locator polynomial is of at most degree 2. * Instead, we simply solve by hand two simultaneous equations to give * the coefficients of the error locator polynomial in the case of two * errors. In the case of one error, the location is given by the first * syndrome. * * This program derivates from the original bch2.c, which was written * to simulate the encoding/decoding of primitive binary BCH codes. * PART of this program is adapted from a Reed-Solomon encoder/decoder * program, 'rs.c', to the binary case. * * rs.c by Simon Rockliff, UNIVERSITY of Adelaide, 21/9/89 * bch2.c by Robert Morelos-Zaragoza, UNIVERSITY of Hawaii, 5/19/92 * * COPYRIGHT NOTICE: This COMPUTER program is free for non-commercial purposes. * You may implement this program for any non-commercial application. You may * also implement this program for commercial purposes, provided that you * obtain my written permission. Any modification of this program is covered * by this COPYRIGHT. * * %%%% COPYRIGHT 1994 (c) Robert Morelos-Zaragoza. All rights reserved. %%%%% * * m = order of the field GF(2**6) = 6 * n = 2**6 - 1 - 15 = 48 = length * t = 2 = error correcting capability * d = 2*t + 1 = 5 = designed MINIMUM distance * k = n - deg(g(x)) = 36 = dimension * p[] = coefficients of primitive polynomial used to generate GF(2**6) * g[] = coefficients of generator polynomial, g(x) * ALPHA_to [] = log table of GF(2**6) * index_of[] = antilog table of GF(2**6) * data[] = coefficients of data polynomial, i(x) * bb[] = coefficients of redundancy polynomial ( x**(12) i(x) ) modulo g(x) * numerr = NUMBER of errors * errpos[] = error positions * recd[] = coefficients of received polynomial * decerror = NUMBER of decoding errors (in MESSAGE positions) * */ #include <math.h> #include <stdio.h> int m = 6, n = 63, k = 36, t = 2, d = 5; int length = 48; int p[7]; /* irreducible polynomial */ int ALPHA_to[64], index_of[64], g[13]; int recd[48], data[36], bb[13]; int numerr, errpos[64], decerror = 0; int seed; void read_p() /* Primitive polynomial of degree 6 */ { register int i; p[0] = p[1] = p[6] = 1; p[2] = p[3] = p[4] = p[5] =0; } void generate_gf() /* * generate GF(2**m) from the irreducible polynomial p(X) in p[0]..p[m] * lookup tables: index->polynomial form ALPHA_to[] contains j=ALPHA**i; * polynomial form -> index form index_of[j=ALPHA**i] = i ALPHA=2 is the * primitive element of GF(2**m) */ { 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; } void gen_poly() /* * Compute generator polynomial of BCH code of length = 48, redundancy = 12 * (OK, this is not very efficient, but we ONLY do it once, right? :) */ { register int ii, jj, ll, kaux; int TEST, aux, nocycles, root, noterms, rdncy; int cycle[13][7], size[13], min[13], zeros[13]; /* Generate cycle sets modulo 63 */ cycle[0][0] = 0; size[0] = 1; cycle[1][0] = 1; size[1] = 1; jj = 1; /* cycle set index */ do { /* Generate the jj-th cycle set */ 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]); /* Next cycle set representative */ ll = 0; do { ll++; TEST = 0; for (ii = 1; ((ii <= jj) && (!TEST)); ii++) /* Examine previous cycle sets */ for (kaux = 0; ((kaux < size[ii]) && (!TEST)); kaux++) if (ll == cycle[ii][kaux]) |
|
| 6樓: | >>參與討論 |
| 作者: song9644 于 2005/10/8 9:06:00 發(fā)布:
bch 是否可用卷積碼?(2.1.7.),(2.1.9).可糾連續(xù)32bit錯,或隨機錯2位. |
|
| 7樓: | >>參與討論 |
| 作者: powerpan 于 2005/10/9 14:05:00 發(fā)布:
謝謝飛船。! 我的BCH(63,48)程序也調通了。通過直接捕錯+查表糾正2位隨機錯誤。 不過在驗證中發(fā)現,如果出現隨機3位以上的錯誤,就沒有辦法糾正,因為出現多個解。。很暈。。。 * - 本貼最后修改時間:2005-10-9 14:07:17 修改者:powerpan |
|
| 8樓: | >>參與討論 |
| 作者: powerpan 于 2005/10/9 14:14:00 發(fā)布:
適合單片機的做法(編碼) void BCH_encode(void) { CHAR i,d,TEMP,key0,key1; /* Clear check bits */ key0 = 0; key1 = 0; for (i=0;i<6;i++){ TEMP = 0x80; d = data[i]; while (TEMP!=0){ /* 48 information bits */ if ( (((d&TEMP)!=0)&&((key0&0x80)==0))|| /* input data XOR highest bit of key */ (((d&TEMP)==0)&&((key0&0x80)!=0)) ){ key0 ^= SEED0; key1 ^= SEED1; } TEMP >>= 1; TEMP &= 0x7f; /* no need to be here, compliler's bug */ key0 <<= 1; /* shift left */ if ((key1&0x80)!=0) key0 ++; /* adjust bit */ key1 <<= 1; } } data[6] = key0; data[7] = key1; } |
|
|
|
| 免費注冊為維庫電子開發(fā)網會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號 |