MATLAB和python中BCH代码的区别



我必须实现一个BCH纠错代码。我在Python BCH库Python和MATLAB BCH编码器中找到了一些代码。然而,代码具有不同的性能,Python中的BCH(127,70)可以在127的块大小中校正多达70个位翻转。然而,MATLAB代码最多只能校正BCH(127,15)中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:的数字通信纠错编码的附录A:BCH代码的代码生成器(pdf(

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

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

我没有使用过Python库,所以我不能确定地写作。如果ecc的长度为127,则I怀疑它是一个码字。将eccdata级联产生具有原始消息数据的副本以及码字的副本的分组。BCH代码不是这样使用的。当你有码字时,你不需要向它发送原始消息的单独副本。


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

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

多项式g2(x(等于g<1>

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

这意味着

g 2(x

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

相关内容

  • 没有找到相关文章