python - MATLAB和python中BCH代码的区别
问题描述
我必须实现一个 BCH 纠错码。我在 MATLAB 中的 Python BCH 库 Python和 MATLAB BCH 编码器中找到了一些代码。但是,代码具有不同的性能,BCH(127,70)
在 Python 中最多可以纠正 127 块大小中的 70 位翻转。但是,MATLAB 代码最多只能纠正 127 位中的 15 位BCH(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
k>15
在 MATLAB 代码中增加会产生以下错误:
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 = 127和k = 15,t = 27是可以纠正的错误数。
- 对于n = 127,具有较大k的下一个选项是k = 22和t = 23。
您对 Python 库的使用令人困惑。对于 BCH 码的标准用法,对于某个正整数m ,码字的长度等于 2 m - 1 。您示例中的代码字不是这种形式。
我没有使用过那个 Python 库,所以我不能确定地写。如果ecc
长度为 127,那么我怀疑它是一个码字。连接ecc
并data
产生一个数据包,该数据包具有原始消息数据的副本以及代码字的副本。这不是 BCH 代码的使用方式。当您拥有代码字时,您不需要发送它和原始消息的单独副本。
如果您确实阅读了上面链接的参考资料,请注意用于描述多项式的符号。对于n = 127表,多项式g 1 ( x ) 用八进制表示法211表示。二进制表达式中的非零位表示多项式的非零系数。
- 八进制:211
- 二进制:010 001 001
- 多项式:x 7 + x 3 + 1
多项式g 2 ( x ) 等于g 1 ( x ) 乘以另一个多项式:
- 八进制:217
- 二进制:010 001 111
- 多项式:x 7 + x 3 + x 2 + x + 1
这意味着
g 2 ( x ) = ( x 7 + x 3 + 1)( x 7 + x 3 + x 2 + x + 1)
每个g t +1 ( x ) 等于g t ( x ) 乘以另一个多项式。
推荐阅读
- javascript - 将数组转换为 json 的最佳选择是什么
- python - 使用 Python Selenium 获取当前名称
- c++ - CMake:如何检查是否使用 -stdlib=libc++ 编译了 STATIC 库?
- macros - 在 Inno Setup [Code] 部分中将宏扩展为 Pascal 代码
- istio - istio-ingressgateway 总是等待 Istio Pilot 信息
- spring - 如何在空手道中测试基于 STOMP 协议的 Web 套接字?
- javascript - 如何在下拉菜单中加载所选选项而无需重新加载页面?
- c++ - printf 如何在小数点后打印 53 位?
- sql - 如何从重复行中获取唯一的最大行结果
- grafana - 输出最后一分钟数据的 Sql 查询