BCH码介绍
文章目录应用从太空到口袋的可靠保障C语言实现BCH码是循环码的一个重要子类。其名称来源于三位独立发现者博斯Bose、查德胡里Chaudhuri和霍昆格姆Hocquenghem。汉明码仅能纠1个错误可视为BCH码的一个特例t1。BCH码的核心思想是通过在传输的数据中加入精心设计的冗余信息让接收端不仅能检测出错误还能自动修正。这一过程建立在严谨的有限域伽罗瓦域 数学理论之上。数学基础BCH码的构造和运算都在一个名为GF(2m)的有限域中进行。这个域里的所有元素都可以用m位的二进制数来表示并遵循一套特定的加法和乘法规则。例如在GF(23)中元素可以是{0, 1, α, α², α³, …, α⁶}。2、生成多项式这是BCH码编码的核心。对于一个能纠t个错误的BCH码其生成多项式 g(x) 是通过在有限域中选取特定的2t个连续元素作为根并求其最小多项式的最小公倍式LCM 得到的。通过这个精心构造的多项式可以保证码字的最小距离d_min ≥ 2t1从而具备纠正t个错误的能力。3、编码与解码流程编码将待发送的k位信息看作一个多项式u(x)。用x^(n-k)乘以u(x)后除以生成多项式g(x)得到的余数r(x) 就是校验位。最终的码字c(x)就是信息位与校验位的组合。解码接收端收到可能出错的码字r’(x)后首先计算伴随式Syndrome来判断是否有误。如果有误则通过伯利坎普梅西Berlekamp-Massey迭代算法和钱天闻Chien搜索等关键步骤精确定位错误位置并予以纠正。应用从太空到口袋的可靠保障BCH码凭借其强大的纠错能力已成为保障数据可靠性的关键技术应用范围极广。深空通信在极其微弱的信号和巨大的噪声下可靠性至关重要。NASA在火星探测器通信中就采用了RS-BCH级联码在0.1dB信噪比下将误码率从10⁻³降至10⁻⁶数据传输成功率从82%提升至99.7%。5G移动通信在5G新空口NR标准中BCH码与Polar码级联用于保护至关重要的控制信道信息共同提升了系统的整体性能。数据存储无论是NAND闪存如SSD还是光盘BCH码都是对抗数据损坏的核心技术。例如企业级SSD采用BCH码后可将原始误码率从10⁻⁵显著降低至10⁻¹⁰有效延长了设备寿命。其他关键领域BCH码还广泛用于卫星通信、光纤通信、无线传感网络等。其缩短码型n-s, k-s更提供了极大的灵活性能适配各种字节长度的信息编码需求。C语言实现编码#include stdio.h#include stdint.h#include string.h// BCH(15,7)参数定义#define BCH_N 15 // 总码长#define BCH_K 7 // 信息位长度#define BCH_M (BCH_N - BCH_K) // 校验位长度 8// 生成多项式 g(x)x^8 x^7 x^6 x^4 1// 二进制:1110100010x1D1#define BCH_POLY 0x1D1/** * BCH编码函数 * param data 输入7位信息数据(仅低7位有效)* return15位编码后的码字 */ uint16_t bch_encode(uint8_t data){uint16_t code(uint16_t)dataBCH_M;// 信息位左移8位留出校验位空间 // 循环移位除法计算校验位for(int i0;iBCH_K;i){if(code0x4000){// 检查最高位(第14位)code ^(BCH_POLY7);// 异或生成多项式对齐最高位}code1;// 左移一位}// 此时code的高8位是余数校验位低7位是0 // 将校验位与原始信息位组合成最终码字 uint16_t encoded((uint16_t)dataBCH_M)|((code7)0xFF);returnencoded;}解码// 有限域GF(2^4)下的数据表 static const uint8_t gf_exp[16]{1,2,4,8,3,6,12,11,5,10,7,14,15,13,9,0};static const uint8_t gf_log[16]{0,0,1,4,2,8,5,10,3,14,9,7,6,13,11,12};// 有限域乘法 static uint8_t gf_mul(uint8_t a, uint8_t b){if(a0||b0)return0;returngf_exp[(gf_log[a] gf_log[b])%15];}// 有限域除法 static uint8_t gf_div(uint8_t a, uint8_t b){if(a0)return0;if(b0)return0;// 错误处理returngf_exp[(gf_log[a]- gf_log[b]15)%15];}/** * BCH译码函数(使用BM算法纠正最多2个错误)* param rx 接收到的15位码字 * param data 输出纠正后的7位信息数据 * return 返回检测到的错误个数-1表示不可纠正 */ int bch_decode(uint16_t rx, uint8_t *data){uint8_t s[4]{0};// 伴随式 S1, S2, S3, S4(t2需要2t4个)//1. 计算伴随式 S_irx(alpha^i)for(int i1;i4;i){uint16_t polyrx;uint8_tsum0;// 使用霍纳法则计算多项式在 alpha^i 的值for(int jBCH_N -1;j0;j--){sumgf_mul(sum, gf_exp[i %15]);if(poly(1j)){sum^1;}}s[i-1]sum;}// 如果没有错误所有伴随式应为0if(s[0]0s[1]0s[2]0s[3]0){*datarxBCH_M;return0;}//2. BM算法求错误位置多项式 sigma(x)uint8_t sigma[3]{1,0,0};// sigma[0]1, sigma[1]sigma1, sigma[2]sigma2 uint8_t b[3]{1,0,0};uint8_t delta, delta_prev1;int L0;for(int r1;r4;r){// 计算差值 delta delta0;for(int i0;iL;i){delta ^gf_mul(sigma[i], s[r-1-i]);}if(delta0){// 更新bfor(int iL;i1;i--){b[i]b[i-1];}b[0]0;}else{uint8_t t[3];memcpy(t, sigma, sizeof(t));// sigmasigma - delta * x^r * bfor(int i0;iL;i){sigma[ir]^gf_mul(delta, b[i]);}if(2*Lr-1){Lr - L;for(int i0;iL;i){b[i]gf_div(t[i], delta);}}else{for(int iL;i1;i--){b[i]b[i-1];}b[0]0;}}}//3. 钱搜索找到错误位置 int err_count0;uint16_t error_pos0;for(int i0;iBCH_N;i){uint8_tevalsigma[0];uint8_t xgf_exp[i %15];eval^gf_mul(sigma[1], x);eval^gf_mul(sigma[2], gf_mul(x, x));if(eval0){error_pos|(1i);err_count;}}// 检查错误个数是否超出纠错能力if(err_count2){return-1;// 不可纠正}//4. 纠正错误 uint16_t correctedrx ^ error_pos;*datacorrectedBCH_M;returnerr_count;}