错误检测和纠错算法

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

>总块大小为8个字节.
>数据传输不可靠,因此可能存在多个位错误.
>数据传输是循环的,并且块的开头是未知的.例如,代码0123456789ABCDEF与3456789ABCDEF012(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,虽然取决于什么邻接,你可能需要更严格.然后,与多项式CRC不同,未检测到错误的可能性大约为1/31或961中的1,对所有单个错误没有特别保证.

我认为你没有足够的空间来明智地进行每块错误纠正,但是你可以在每M个普通块之后包括N个纠错块,例如使用N个纠错块. SECDED应用于列.你可能有例如57个数据承载组块,然后是6个纠错组块,将每个有效负载位位置视为承载57个数据位,然后是6个校验和位.如果错误倾向于破坏单个块的全部或没有,例如,这应该很好.通过导致块重新排列失败.

评论后 –

编辑

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

1)给出对消息的任何类型的校验和或其他约束,你可以通过例如一些有限的纠错来实现.考虑所有单个位错误,翻转一下收到的消息,并查看校验和现在是否有效.

2)通过查看仅通过消息传递的5位窗口,可以检查消息以查看是否符合上面建议的位填充方案.即使您需要调整它以在环绕声中正常工作,我认为这也适用.这意味着可以通过易处理大小的BDD检查消息(Knuth 4A第7.1.4节).这意味着您可以计算符合位填充方案的64位消息的数量,并在消息号和消息之间进行有效转换(相同部分).因此,您可以使用此方案,而无需基本随机化或关于要发送的数据的最坏情况假设,只需将其视为0..N范围内的数字编码(其中N将通过BDD计算)和64位消息.实际上,不太优雅,我认为你可以使用5位状态的动态编程而不是BDD.

点赞