MATLAB中BCH代码与python的区别

Difference between BCH code in MATLAB and python

我必须实现 BCH 纠错码。我在 Python BCH library Python and MATLAB BCH encoder in MATLAB 中找到了一些代码。然而,代码具有不同的性能,BCH(127,70) in Python 最多可以在块大小为 127 的情况下纠正 70 位翻转。但是,MATLAB 代码在 [=17 的 127 位中最多只能纠正 15 位=].

为什么这些实现的表现不同?

Python代码

import bchlib
import hashlib
import os
import random

# create a bch object
BCH_POLYNOMIAL = 8219
BCH_BITS = 72
bch = bchlib.BCH(BCH_POLYNOMIAL, BCH_BITS)

# random data
data = bytearray(os.urandom(127))

# encode and make a "packet"
ecc = bch.encode(data)
packet = data + ecc
# print length of ecc, data, and packet
print('data size: %d' % (len(data)))
print('ecc size: %d' % (len(ecc)))
print('packet size: %d' % (len(packet)))

# print hash of packet
sha1_initial = hashlib.sha1(packet)
print('sha1: %s' % (sha1_initial.hexdigest(),))

def bitflip(packet):
    byte_num = random.randint(0, len(packet) - 1)
    bit_num = random.randint(0, 7)
    packet[byte_num] ^= (1 << bit_num)

# make BCH_BITS errors
for _ in range(BCH_BITS):
    bitflip(packet)

# print hash of packet
sha1_corrupt = hashlib.sha1(packet)
print('sha1: %s' % (sha1_corrupt.hexdigest(),))

# de-packetize
data, ecc = packet[:-bch.ecc_bytes], packet[-bch.ecc_bytes:]

# correct
bitflips = bch.decode_inplace(data, ecc)
print('bitflips: %d' % (bitflips))

# packetize
packet = data + ecc

# print hash of packet
sha1_corrected = hashlib.sha1(packet)
print('sha1: %s' % (sha1_corrected.hexdigest(),))

if sha1_initial.digest() == sha1_corrected.digest():
    print('Corrected!')
else:
    print('Failed')

这输出

data size: 127
ecc size: 117
packet size: 244
sha1: 4ee71f947fc5d561b211a551c87fdef18a83404b
sha1: a072664312114fe59f5aa262bed853e35d70d349
bitflips: 72
sha1: 4ee71f947fc5d561b211a551c87fdef18a83404b
Corrected!

MATLAB 代码

%% bch params
M = 7;
n = 2^M-1;   % Codeword length
k = 15;       % Message length
nwords = 2; % Number of words to encode
% create a msg
msgTx = gf(randi([0 1],nwords,k));
%disp(msgTx)
%Find the error-correction capability.
t = bchnumerr(n,k)
% Encode the message.
enc = bchenc(msgTx,n,k);
%Corrupt up to t bits in each codeword.
noisycode = enc + randerr(nwords,n,1:t);
%Decode the noisy code.
msgRx = bchdec(noisycode,n,k);
% Validate that the message was properly decoded.
isequal(msgTx,msgRx)

输出:

t = 27
ans = logical 1

在 MATLAB 代码中增加 k>15 会出现以下错误:

Error using bchnumerr (line 72)
The values for N and K do not produce a valid narrow-sense BCH code.

Error in bchTest (line 10)
t = bchnumerr(n,k)

我今天(2021 年 1 月 24 日)在搜索有关 BCH 代码的其他信息时发现了这个问题。

参见 George C. Clark 和 J. Bibb Cain 的 Appendix A: Code Generators for BCH Codes (pdf) of Error-Correction Coding for Digital Communications

  • 对于n = 127k = 15, t = 27是可以纠正的错误数.
  • 对于n = 127,下一个k大的选项是k = 22t = 23.

您对 Python 库的使用令人困惑。对于 BCH 代码的标准用法,codeword 的长度等于 2m - 1一些正整数 m。您示例中的代码字不是这种形式。

那个Python库我没用过,所以不敢写。如果ecc的长度是127,那么我怀疑是一个码字。连接 eccdata 会产生一个数据包,其中包含原始消息数据的副本以及代码字的副本。这不是 BCH 代码的使用方式。当您拥有代码字时,您无需向其发送 原始消息的单独副本。


如果您确实阅读了上面链接的参考资料,请注意用于描述多项式的符号。对于n = 127 table,多项式g1 (x)用211表示,是八进制。二进制表达式中的非零位表示多项式的非零系数。

  • 八进制:211
  • 二进制:010 001 001
  • 多项式:x7 + x3 + 1

多项式g2(x)等于 g1(x) 乘以另一个多项式:

  • 八进制:217
  • 二进制:010 001 111
  • 多项式:x7 + x3 + x2 + x + 1

这意味着

g2(x) = (x7 + x3 + 1)(x7 + x3 + x2 + x + 1)

每个gt+1(x) 等于 gt(x ) 乘以另一个多项式。