Python Reed-Solomon错误检测能力不是2T
我正在建立一个Reed Solomon库,以便在输入时更正和检测错误。为了简单起见,让我们看一看Reed Solomon配置,其中Python Reed-Solomon错误检测能力不是2T,python,false-positive,error-detection,reed-solomon,Python,False Positive,Error Detection,Reed Solomon,我正在建立一个Reed Solomon库,以便在输入时更正和检测错误。为了简单起见,让我们看一看Reed Solomon配置,其中 m(symbol size) : 8 [GF(256)] k(user payload) : 2 2T(parity symbols): 2 Yielding a transmitted payload of 4 octets. 这可以纠正任何1个符号错误,并且,在本文中,它可以检测2个符号错误。关于RS错误检测的文献有限,但是,对于粗略的来源,您可以
m(symbol size) : 8 [GF(256)]
k(user payload) : 2
2T(parity symbols): 2
Yielding a transmitted payload of 4 octets.
这可以纠正任何1个符号错误,并且,在本文中,它可以检测2个符号错误。关于RS错误检测的文献有限,但是,对于粗略的来源,您可以查看以下介绍:
通过向数据中添加t校验符号,里德-所罗门代码可以检测任何
最多和包括t个错误符号的组合,或最多和纠正
包括…在内⌊t/2⌋ 符号
然而,这似乎与我的观察不符
我有一个图书馆,主要是用
据我所知,这很有效。
我围绕我们的实现设置了一个详尽的测试,并发现了一个案例,其中有两个符号错误(据我所知,应该可以检测到),但事实并非如此。
据我所知,一个简单的检查,看看是否发生了通过正常检查的不可纠正错误(即错误定位器有效,查找错误有有效的错误计数,多项式次数有效),就是重新计算已纠正消息的综合征。如果症状不为零,那么我们仍然有一个错误。然而,当我这样做时,综合征都是0,这表明没有发现错误,并且我们有一个错误向量与一个错误符号和一个错误向量与两个错误符号之间的冲突
这就是测试:
# Create Message
msg_in = [0x10,0x2f]
# Append RS FEC codes
msg_enc = rs_encode_msg(msg_in)
# Apply Error
errVec = [0,0x2b,0,0xea]
for i,err in enumerate(errVec):
msg[i] ^= err;
# Decode
# Syndromes
synd = rs_calc_syndromes(msg)
# Error Locator
err_loc = rs_find_error_locator(synd)
# Error Positions
pos = rs_find_errors(err_loc)
# Correct
msg = rs_correct_errata(msg, synd, pos, err_loc)
#Calculate syndromes again
newSynd = rs_calc_syndromes(msg)
输出:
Message
0x10 0x2f
Encoded Message
0x10 0x2f 0x1 0x3e
Encoded Message With Errors
0x10 0x4 0x1 0xd4
Syndromes
0xc1 0x46
Error Locator
0x8 0x1
Error Position
0x00 # The first position
Corrected Message
0xd1 0x4 0x1 0xd4
Recalculated Syndromes
0x0 0x0
如果你还在读书,谢谢你。我知道我没有提供整个库,但我提供了输入、输出和关键变量值。我想知道的是,我上面写的理解是否错误;我们可以检测2T符号错误,其中2T是添加符号的数量。因为从这个测试用例来看,似乎存在冲突,所以我通过计算以下错误向量的综合征来进一步测试这一点,这些错误向量进一步支持冲突,并且Reed Solomon不一定能够检测到2T以下的所有错误。如果我错了,请告诉我
error vector: 0xc1 0x0 0x0 0x0
yielding syndrome: 0xc1 0x46
及
如果两个奇偶校验符号发生冲突,则综合征仅对单个符号错误是唯一的,这就是为什么可以使用它们来纠正单个符号错误。在两个符号错误的情况下,对于两个错误位置和两个错误值的所有组合,综合征将是非零的(其中一个可能是零,但不是两者都是零),但并不总是唯一的(这就是为什么只有两个奇偶校验符号时,两个符号错误无法纠正)
对于两个奇偶校验符号,汉明距离为3个符号。每个有效(零综合征==生成器多项式的精确倍数)码字与每个其他有效码字至少相差3个符号,因此没有2个符号的错误情况将显示为有效(零综合征)码字 错误位置和值的3个或更多错误案例组合可能产生综合征==0。最简单的例子是取一个有效的码字(零错误消息),并对消息中的任意3符号生成器多项式进行异或运算,这将是另一个有效的码字(生成器多项式的精确倍数) 此外,还有一个最大长度的码字。对于BCH类型的Reed-Solomon代码(您正在使用),对于GF(2^n),它是(2^n)-1符号。如果消息包含2^n或更多符号(包括奇偶校验符号),则在消息[i]和消息[i+2^n-1]处具有相同错误值的两个错误案例将产生零综合征。对于原始视图类型的Reed-Solomon码,最大长度码字为2^n(比BCH类型多一个符号),但很少使用,因为解码操作在整个消息上,而BCH解码操作在综合征上
更新-我忘了提到,对于两个奇偶校验符号,尝试对两个错误消息执行一个错误更正可能会导致第三个错误,这将导致一个有效的码字(综合征为零),但在三个位置与原始码字不同 如果缩短码字,则发生这种情况的概率降低,因为不在缩短码字范围内的任何计算位置都将是检测到的错误。如果存在n个符号(包括奇偶校验符号),则基于计算位置在范围内的单个错误错误错误校正的概率约为n/255
在本例中,由于码字大小为4字节,我在可能出现的390150两个错误案例中发现了3060个,这两个错误案例将通过执行单个错误更正来创建有效的码字,最终创建第三个错误。我现在明白了。它不是:纠错的T符号和错误检测的2T符号。它不是纠错符号,也不是检错符号。原因是基于rcgldr所说的,T符号错误具有独特的综合征,其中2T不是唯一的,而是非零的。唯一性使其可纠正,非零性使其可检测缩短的码字是什么意思?减少n或增加(n-k)?@AliMahdavi-减少n和k,使n-k保持不变,例如减少RS(255249)至RS(64,58)。
error vector: 0x0 0x2b 0x0 0xea
yielding syndrome: 0xc1 0x46