这是从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 不同,未检测到错误的几率约为 31 分之 1 或 961 分之 1,对所有单个错误没有特别保证。
我认为您没有足够的空间来明智地进行每个块的纠错,但是您可以在每 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。