错误检测和纠错算法



假设我们有一个来自数据传输介质的数据块,具有以下属性:

  • 总块大小为8字节
  • 数据传输是不可靠的,所以在一些位中可能出现错误。
  • 数据传输是循环的,块的开始是未知的。例如,代码0123456789ABCDEF3456789ABCDEF012 (0123456789ABCDEF <<12)和02468ACF13579BDE (0123456789ABCDEF <<1).接收端应由代码本身确定起始。

对于这种情况,最好的错误检测和纠错算法是什么?当然,它总是在每个块的有用数据量和成功验证(纠正)概率之间折衷。

这是一个尝试与一些想法从http://en.wikipedia.org/wiki/Frame_Relay。

以固定的头01110开始每个64位块。如果你有更多的报头信息(例如序列号或交替位标志,校验和…),你可以安排位模式01110永远不会出现。对于任意数据,将出现的任何0111替换为01111——这意味着有效数据速率现在取决于底层数据。让这一层的数据提供者确保数据几乎是随机的,例如通过应用http://en.wikipedia.org/wiki/Randomizer。我认为你在这里的总数据丢失大约是6位,这符合描述0到63的移位所需的6位。

在接收器中,查找01110来标记块的真正开始。如果您没有看到一个这样的模式,那么您就知道数据块已经被乱码了。我认为至少需要两个比特的错误来破坏现有的01110并产生一个假的。

导致块不对齐的乱码看起来不像典型的位乱码,因此CRC错误率计算将不适用开箱即用。我会在每个块中包括一个非crc校验和-也许是一个mod 31或mod 961计算的校验,以避免被禁止的5位模式01110,尽管这取决于什么,你可能需要更多的限制。然后,未检测到错误的机会大约是1/31或1/961,与多项式CRC不同,对所有单个错误没有特别的保证。

我不认为你有足够的空间来做每个块的错误纠正,但你可以在每M个普通块之后包含N个错误纠正块,例如使用SECDED应用于列。例如,您可能有57个数据承载块,然后6个纠错块,将每个有效载荷位位置处理为承载57个数据位,然后6个校验和位。如果错误倾向于损坏单个块的全部或没有损坏,例如,通过导致块重新排列失败,这应该可以很好地工作。

注释后-

编辑

好的,一个连续发送的消息,你有更少的带宽,但相对更多的cpu。我想到了两件事:

1)给定消息上的任何类型的校验和或其他约束,您可以通过例如考虑所有单比特错误,翻转接收到的消息的一位,并查看校验和现在是否有效来实现一些有限的错误纠正。

2)可以检查消息是否符合上述建议的比特填充方案,仅通过查看传递到消息上的5位窗口。我认为这是正确的,即使你需要调整它以在环绕时正常工作。这意味着消息可以通过可处理大小的BDD进行检查(Knuth 4A节7.1.4)。这意味着您可以计算符合位填充方案的64位消息的数量,并在消息数和消息(同一部分)之间有效地转换。因此,您可以使用此方案,而无需对要发送的数据进行潜在的随机化或最坏情况假设,只需将其视为范围为0的数字的编码。N(其中N将通过bdd计算)和64位消息。实际上,我认为您可以使用5位状态的动态规划,而不是bdd。

这只是对整个问题的部分回答,因为我不会回答如何确定起点。参考mcdowella的回答。我本想写个评论,但是太长了。

对于连续传输的消息,确实不再需要任何纠错了。即使发生了一个比特翻转(或一堆),它也不太可能影响到传输的同一比特的每一个实例——尤其是如果它永远重复的话。所以在这个意义上,你的冗余系数是N,其中N随着广播的进行趋于无穷。

所以重建64位现在很容易,因为你有很多样本要看。假设接收方知道周期长度,您可以轮询流并计算64个位置中每个位的出现次数。

100个完整循环后,你得到:

Bit #    0s / 1s    Interpret bit as
Bit 0:  100 /   0        0
Bit 1:    0 / 100        1
Bit 2:   99 /   1        0
Bit 3:   98 /   2        0
Bit 4:    1 /  99        1
...
Bit 63:  96 /   4        0

基于这些样本,您可以统计出正确的位值是什么。接收器继续接收周期的时间越长,你的界限就越强。因此,如果传输了足够的周期,您可以容忍任意高的错误率。

当然,这适用于任何周期长度-不仅仅是64位。因此,将此方法与mcdowella的方法结合使用(由于索引足迹,数据大小可能会增加)。

如果接收方不知道周期,有两种方法可以计算出周期:

  1. 猜测长度并运行轮询。对不同的长度继续这样做,直到你得到一个高度相关的长度。(每个位的高置信度)

  2. 对接收到的数据进行傅里叶变换。如果数据没有太大的噪声,这将立即显示周期。

print("-"*25,'CHECKSUM ERROR DETECTION MECHANISM',25*'-')
print("n",25*"-","At Sender's Side","-"*25,"n") 
data_bits = input('Enter the Data Bits : ')
checksum_bits = int(input("Enter number of checksum bits: "))
sum="0"
sum = int(sum,2)
for i in range(0, len(data_bits), checksum_bits):
    part_i = data_bits[i: i + checksum_bits]
    print("The Data Part : ",part_i)
    part = int(part_i,2)
    sum = sum+part
binary_sum = bin(sum)
finalsum = binary_sum[2:]
if len(finalsum)==checksum_bits:
    finalsum = finalsum
else:
    finalsum = binary_sum[3:]
def Convert(string):
    list1=[]
    list1[:0]=string
    return list1
final_sum = Convert(finalsum)
def complement(s):
    for i in range (0,len(s)):
      if s[i] == '1':
       s[i] = '0'
      else:
       s[i] = '1'
complement(final_sum)
def convert(s):
    checksum = ""
    return (checksum.join(s))
checksum = convert(final_sum)
print("The Checksum Calculated is: ",checksum)
codeword = data_bits + checksum
print('The Transmitter sequence will be: ',codeword)
print("n",25*"-","At Receiver's Side","-"*25,"n")
data_bits1 = input('Enter the Data Bits : ')
checksum_bits1 = int(input("Enter number of checksum bits: "))
sum1="0"
sum1 = int(sum1,2)
for i in range(0, len(data_bits1), checksum_bits1):
    part = data_bits1[i: i + checksum_bits1]
    parts = int(part,2)
    print("The Data Part: ",part)
    sum1 = sum1+parts
    binarysum = bin(sum1)
    finalsum1 = binarysum[2:]
if len(finalsum1)==checksum_bits1:
    finalsum1 = finalsum1 
else:enter code here
    finalsum1 = binarysum[3:]
    final_sum1 = Convert(finalsum1)
    complement(final_sum1)
    value = convert(final_sum1)
print("The Computed Received Sequence: ",value)
if final_sum1.count('1')>0:
    print("This is an Errored Message...Please try Transmitting the Message again.")
else:
    print("The Transmitted Sequence was Received Successfully with no Error Present.")
print("n",30*"-","DONE","-"*30,"n")

最新更新