vtpp4vvsgfj64044431419.gif
! O1 A& h- s$ A8 I5 ^1 A( r
点击上方蓝色字体,关注我们
; L4 P+ q+ l& n+ O; H# c
$ g/ [" c( G& Z2 u3 X选择CRC校验码的长度时确实需要在检错能力和系统开销之间做出权衡。CRC码的长度(通常是4、8、16、32位)直接影响到能检测到的错误类型和概率。4 V) ?+ X4 U* B4 f* I
0 S. Y0 F% [, t9 f% o% m3 V
0tnvlapkqrq64044431519.png
7 }' J1 L: l- ?! r6 v要确定在一定检错概率 p 下的最小CRC长度,可以从几个方面入手,包括信息长度 n、错误检测概率需求 p、以及CRC多项式的选择。
" ^0 Q, o6 J! h2 U/ \
; p& [9 ?3 J/ y3 y# j. B9 L下面从理论背景、实用方法以及计算步骤等方面详细解释。6 i& U7 _' c6 ^4 ]- c! ^+ O
19 l% ?) v [7 u! m0 x+ {1 @* O
理论背景:CRC的检错原理, i8 i! t: ^9 F8 ]+ w" y: Y
CRC(Cyclic Redundancy Check)使用一个特定的生成多项式对数据帧进行余数计算,产生一个校验码。8 Z5 [+ \2 J ]# ?6 }5 @. y: v
) ?6 U$ k* |1 V6 l1 @8 n2 Y3 H接收端利用相同的多项式重算余数,如果余数为零则判定无误差,否则判定出错。
. r4 g" ~( X h! \# W6 i4 O7 k+ o) N* x8 o" M
对于不同长度的CRC码,其生成多项式能探测不同类型的错误:6 k: h) v$ _6 T# _! i) L9 ]
单比特错误:任何CRC都能检测单比特错误。连续位翻转的突发错误:长度为 k 位的CRC最多可以检测到长度不超过 k 位的突发错误。随机错误:概率与CRC码的位数有关。
) ?- l' G0 Q- H2 Y0 H! w P
7 |5 z! G1 V- h$ ~$ C5 n7 C2$ b; w6 E/ {8 o, h; ^0 Q
检错概率的数学模型7 D) {: ?5 Z- P, W* [- _# H
CRC的检错概率可以近似通过以下公式进行估算:
( P# g& f: C7 g* ]* U3 r
vkrxvwac1xd64044431619.jpg
' t+ V$ V/ ?: b& G0 ?, w其中 k为CRC校验码的位数。
# \6 C# F& u9 G* H* [0 Q- s' d( ?5 i+ B) g+ `: Q' Y3 Y( P
例如,对于一个8位的CRC码,理论上可检测到的错误概率约为 1?1/256=0.996。从公式中可以看出,位数越多,检错概率越高。* c6 h& s# n1 V9 i. ^' B2 v/ \
3
! u% A& S1 d3 r: W& w7 r' w根据信息长度 n 和所需检错概率 p 计算CRC位数2 s) E, ]& V6 \ }4 z# |
在实际应用中,我们可以通过以下步骤来确定CRC的位数:确定目标检错概率:假设我们要求的检错概率 Pdetect≥p。
5 a/ L0 C, ]+ X, C! {
4 ~' ^/ U0 H" g) B代入公式并求出位数:我们可以重新排列公式来得到最小的CRC位数:4 _7 h! \7 O0 w. c3 H' k9 d1 O' z
5hnnjxxd4il64044431719.jpg
9 Y( [5 o7 F, ]# {; e
例如,若我们希望检错概率 p=0.999,则:
3 @4 e3 C. i6 S% T
33vw2bzldje64044431819.jpg
. r5 a7 ~- N" ]" P7 T这意味着至少需要10位的CRC才能满足这个检错概率。
$ Y5 K$ D) p. H: K- j4 s5 l
8 H' _" N$ z1 b8 `' Z考虑信息长度 n:虽然理论上,CRC的检错能力与信息长度 n 不直接相关,但在极长的帧中,可能会遇到极端情况。
0 A% k' _( Q. k8 K/ W
% ~2 U# l1 A& _) p0 E) f, n因此,当 n 非常大(如数百甚至上千位)时,建议增加1-2位以提高稳健性。1 p3 `& w" A; ?8 a) s: q+ D7 n
4
% V6 G; @# ]2 y8 g" [2 I7 l( oCRC位数选择的经验法则6 y& E7 C3 x, x) M+ K
短数据帧(如10-100比特):通常8位的CRC码已经可以提供很高的检错概率,适合普通通信应用。中等数据帧(100-1000比特):16位的CRC是更合适的选择,适合要求较高检错概率的协议。长数据帧(1000比特以上):32位CRC可以提供极高的检错能力,多用于高可靠性的工业、通信或存储系统中。" d1 |/ D0 ^- X2 c% m& h: h: Z
: i* A1 E; k" D% b8 C& e8 d5 s' y0 X$ P
假设你设计的协议需要保证检错概率不低于 p=0.999,且每帧数据为 n=500 比特。
+ y+ @; @6 [0 {6 E5 p' s: _3 h W, J4 }
根据上面的公式,我们计算得到的最小位数约为10位;结合数据帧长度,实际应用中推荐至少选择12位甚至16位的CRC,以确保满足高检错需求。6 \5 J+ b+ n: S# k
. {+ P6 f' v& j进一步的,标准CRC多项式(如CRC-16或CRC-32)经过广泛验证,在通信和存储应用中可靠性高,通常推荐直接采用这些标准多项式。
( @* ~, F9 l( p5
# S9 w# ?! ]& Z% @$ p1 q8 O! QCRC码位数对系统的影响
. l4 b' W* G; B位数越长的CRC校验码,校验性能越好,但代价是数据包的开销和计算复杂性增大。. x3 s m( c$ g; N/ s) N# j' O# G) A5 e# F
1 _8 y! ]- q- V" A
典型的实现中:' F6 ?3 F4 i" i: i0 l( X' t0 o
计算性能:硬件CRC加速器可以显著降低较长CRC的计算延迟。通信开销:8位CRC增加的传输开销通常较小,但超过16位时,额外开销对低速通信协议影响较大。, b& G+ I d3 X( y8 d% @8 Y
8 M1 C' Q, W# j% Q) {
综合以上分析,为了在实际应用中确定CRC码长度,建议的步骤如下:
% Z1 W, U b& q+ H. A3 s$ {6 r根据要求的检错概率计算最小位数。考虑数据帧长度,适当增加1-2位以提高稳健性。使用标准CRC多项式以确保通用性和可靠性。5 R& R% f- m. l+ x+ O1 I
: ]' g7 G# N- \* p7 n m
pa2u5r01uci64044431919.jpg
7 x$ Z5 } B# R5 g0 `
d0vuz2dwazn64044432019.gif
1 T% y( e. T5 C
点击阅读原文,更精彩~ |