CRC工作原理及演算法研究

2021-03-04 06:50:30 字數 5463 閱讀 4079

在數字通訊系統中可靠與快速往往是一對矛盾。若要求快速,則必然使得每個資料碼元所占地時間縮短、波形變窄、能量減少,從而在受到干擾後產生錯誤地可能性增加,傳送資訊地可靠性下降。若是要求可靠,則使得傳送訊息地速率變慢。

因此,如何合理地解決可靠性也速度這一對矛盾,是正確設計乙個通訊系統地關鍵問題之一。為保證傳輸過程的正確性,需要對通訊過程進行差錯控制。差錯控制最常用的方法是自動請求重發方式(arq)、向前糾錯方式(fec)和混合糾錯(hec)。

在傳輸過程誤位元速率比較低時,用fec方式比較理想。在傳輸過程誤位元速率較高時,採用fec容易出現「亂糾」現象。hec方式則式arq和fec 的結合。

在許多數字通訊中,廣泛採用arq方式,此時的差錯控制只需要檢錯功能。實現檢錯功能的差錯控制方法很多,傳統的有:奇偶校驗、校驗和檢測、重複碼校驗、恆比碼校驗、行列冗餘碼校驗等,這些方法都是增加資料的冗餘量,將校驗碼和資料一起傳送到接受端。

接受端對接受到的資料進行相同校驗,再將得到的校驗碼和接受到的校驗碼比較,如果二者一致則認為傳輸正確。但這些方法都有各自的缺點,誤判的概率比較高。

迴圈冗餘校驗crc(cyclic redundancy check)是由分組線性碼的分支而來,其主要應用是二元碼組。編碼簡單且誤判概率很低,在通訊系統中得到了廣泛的應用。下面重點介紹了crc校驗的原理及其 演算法實現。

一、 迴圈冗餘校驗碼(crc)

crc校驗採用多項式編碼方法。被處理的資料塊可以看作是乙個n階的二進位制多項式,由。如乙個8位二進位制數***可以表示為:。

多項式乘除法運算過程與普通代數多項式的乘除法相同。多項式的加減法運算以2為模,加減時不進,錯位,和邏輯異或運算一致。

採用crc校驗時,傳送方和接收方用同乙個生成多項式g(x),並且g(x)的首位和最後一位的係數必須為1。crc的處理方法是:傳送方以g(x)去除t(x),得到餘數作為crc校驗碼。

校驗時,以計算的校正結果是否為0為據,判斷資料幀是否出錯。

crc校驗可以100%地檢測出所有奇數個隨機錯誤和長度小於等於k(k為g(x)的階數)的突發錯誤。所以crc的生成多項式的階數越高,那麼誤判的概率就越小。ccitt建議:

2048 kbit/s的pcm基群裝置採用crc-4方案,使用的crc校驗碼生成多項式g(x)= 。採用16位crc校驗,可以保證在 bit碼元中只含有一位未被檢測出的錯誤。在ibm的同步資料鏈路控制規程sdlc的幀校驗序列fcs中,使用crc-16,其生成多項式g(x)= ;而在ccitt推薦的高階資料鏈路控制規程hdlc的幀校驗序列fcs中,使用ccitt-16,其生成多項式g(x)= 。

crc-32的生成多項式g(x)= 。crc-32出錯的概率比crc-16低倍。由於crc-32的可靠性,把crc-32用於重要資料傳輸十分合適,所以在通訊、計算機等領域運用十分廣泛。

在一些uart通訊控制晶元(如 mc6582、intel8273和z80-sio)內,都採用了crc校驗碼進行差錯控制;乙太網卡晶元、mpeg解碼晶元中,也採用crc-32進行差錯控制。

二、 crc校驗碼的演算法分析

crc校驗碼的編碼方法是用待傳送的二進位制資料t(x)除以生成多項式g(x),將最後的餘數作為crc校驗碼。其實現步驟如下:

設待傳送的資料塊是m位的二進位制多項式t(x),生成多項式為r階的g(x)。在資料塊的末尾新增r個0,資料塊的長度增加到m+r位,對應的二進位制多項式為。

用生成多項式g(x)去除,求得餘數為階數為r-1的二進位制多項式y(x)。此二進位制多項式y(x)就是t(x)經過生成多項式g(x)編碼的crc校驗碼。

用以模2的方式減去y(x),得到二進位制多項式 。就是包含了crc校驗碼的待傳送字串。

從crc的編碼規則可以看出,crc編碼實際上是將代傳送的m位二進位制多項式t(x)轉換成了可以被g(x)除盡的m+r位二進位制多項式,所以解碼時可以用接受到的資料去除g(x),如果餘數字零,則表示傳輸過程沒有錯誤;如果餘數不為零,則在傳輸過程中肯定存在錯誤。許多crc的硬體解碼電路就是按這種方式進行檢錯的。同時可以看做是由t(x)和crc校驗碼的組合,所以解碼時將接收到的二進位制資料去掉尾部的r位資料,得到的就是原始資料。

為了更清楚的了解crc校驗碼的編碼過程,下面用乙個簡單的例子來說明crc校驗碼的編碼過程。由於crc-32、crc-16、ccitt和crc-4的編碼過程基本一致,只有位數和生成多項式不一樣。為了敘述簡單,用乙個crc-4編碼的例子來說明crc的編碼過程。

設待傳送的資料t(x)為12位的二進位制資料100100011100;crc-4的生成多項式為g(x)= ,階數r為4,即10011。首先在t(x)的末尾新增4個0構成,資料塊就成了1001000111000000。然後用g(x)去除,不用管商是多少,只需要求得餘數y(x)。

下表為給出了除法過程。

除數次數被除數/ g(x)/結果餘數

0 1 001000111000000 100111000000

1 0011

0 000100111000000

1 1 00111000000 1000000

1 0011

0 00001000000

2 1 000000 1100

1 0011

0 001100

從上面表中可以看出,crc編碼實際上是乙個迴圈移位的模2運算。對crc-4,我們假設有乙個5 bits的暫存器,通過反覆的移位和進行crc的除法,那麼最終該暫存器中的值去掉最高一位就是我們所要求的餘數。所以可以將上述步驟用下面的流程描述:

//reg是乙個5 bits的暫存器

把reg中的值置0.

把原始的資料後新增r個0.

while (資料未處理完)

begin

if (reg首位是1)

reg = reg xor 0011.

把reg中的值左移一位,讀入乙個新的資料並置於register的0 bit的位置。

endreg的後四位就是我們所要求的餘數。

這種演算法簡單,容易實現,對任意長度生成多項式的g(x)都適用。在傳送的資料不長的情況下可以使用。但是如果傳送的資料塊很長的話,這種方法就不太適合了。

它一次只能處理一位資料,效率太低。為了提高處理效率,可以一次處理4位、8位、16位、32位。由於處理器的結構基本上都支援8位資料的處理,所以一次處理8位比較合適。

為了對優化後的演算法有一種直觀的了解,先將上面的演算法換個角度理解一下。在上面例子中,可以將編碼過程看作如下過程:

由於最後只需要餘數,所以我們只看後四位。構造乙個四位的暫存器reg,初值為0,資料依次移入reg0(reg的0位),同時reg3的資料移出 reg。有上面的演算法可以知道,只有當移出的資料為1時,reg才和g(x)進行xor運算;移出的資料為0時,reg不與g(x)進行xor運算,相當與和0000進行xor運算。

就是說,reg和什麼樣的資料進行xor移出的資料決定。由於只有乙個bit,所以有種選擇。上述演算法可以描述如下,

//reg是乙個4 bits的暫存器

初始化t=

把reg中的值置0.

把原始的資料後新增r個0.

while (資料未處理完)

begin

把reg中的值左移一位,讀入乙個新的資料並置於register的0 bit的位置。

reg = reg xor t[移出的位]

end 上面演算法是以bit為單位進行處理的,可以將上述演算法擴充套件到8位,即以byte為單位進行處理,即crc-32。構造乙個四個byte的暫存器reg,初值為0x00000000,資料依次移入reg0(reg的0位元組,以下類似),同時reg3的資料移出reg。用上面的演算法類推可知,移出的資料位元組決定reg和什麼樣的資料進行xor。

由於有8個bit,所以有種選擇。上述演算法可以描述如下:

//reg是乙個4 byte的暫存器

初始化t=//共有 =256項

把reg中的值置0.

把原始的資料後新增r/8個0位元組.

while (資料未處理完)

begin

把reg中的值左移乙個位元組,讀入乙個新的位元組並置於reg的第0個byte的位置。

reg = reg xor t[移出的位元組]

end 演算法的依據和多項式除法性質有關。如果乙個m位的多項式t(x)除以乙個r階的生成多項式g(x),,將每一位(0=演算法

通常的crc演算法在計算乙個資料段的crc值時,其crc值是由求解每個數值的crc值的和對crc暫存器的值反覆更新而得到的。這樣,求解crc的速度較慢。通過對crc演算法的研究,我們發現:

乙個8位資料加到16位累加器中去,只有累加器的高8位或低8位與資料相作用,其結果僅有256種可能的組合值。因而,我們可以用查表法來代替反覆的運算,這也同樣適用於crc32的計算。本文所提供的程式庫中,函式crchware是一般的16位crc的演算法;mk-crctbl用以在記憶體中建立乙個crc數值表;crcupdate用以查表並更新crc累加器的值;crcrevhware和crcrevupdate是反序演算法的兩個函式;buildcrctable、calculateblockcrc32和updatecharac

tercrc32用於crc32的計算。

/* crc.c——crc程式庫 */

#define crcccitt 0x1021

#define ccitt-rev 0x8408

#define crc16 0x8005

#define crc16-rev 0xa001

#define crc32-polynomial 0xedb88320l

/* 以上為crc除數的定義 */

#define nil 0

#define crcupdate(d,a,t)*(a)=(*(a)<<8)^(t)[(*(a)>>8)^(d)];

#define crcupdate16(d,a,t)*(a)=(*(a)>>8^(t)[(*(a)^(d))&0x00ff])

/* 以上兩個巨集可以代替函式crcupdate和crcrevupdate */

#include #include #include /* 函式crchware是傳統的crc演算法,其返回值即crc值 */ unsigned short crchware(data,genpoly,accum)

unsigned short data;/* 輸入的資料 */

unsigned short genpoly;/* crc除數 */

unsigned short accum;/* crc累加器值 */

return (accum);

}  /* 函式mk-crctbl利用函式crchware建立記憶體中的crc數值表 */

unsigned short *mk-crctbl(poly,crcfn);

unsigned short poly;/* crc除數--crc生成多項式 */

r>unsigned short (*crcfn)();/* 指向crc函式(例如crchware)的指標 */

/* 函式mk-crctbl的使用範例 */

if((crctblp=mk-crctbl(crcccitt,crchware))==nil)

{  puts("insuff memory for crc lookup table.n");

return 1; */

/* 函式crcupdate用以用查表法計算crc值並更新crc累加器值 */

遺傳演算法原理及應用

07計本張雷 070701010116 遺傳演算法是由美國的j.holland教授於1975年在他的專著 自然界和人工系統的適應性 中首先提出的,它是一類借鑑生物界自然選擇和自然遺傳機制的隨機化搜尋演算法 遺傳演算法模擬自然選擇和自然遺傳過程中發生的繁殖 交叉和基因突變現象,在每次迭代中都保留一組候...

SVPWM的原理及法則推導和控制演算法詳解第三修改版

一直以來對svpwm原理和實現方法困惑頗多,無奈現有資料或是模糊不清,或是錯誤百出。經查閱眾多書籍 長期積累總結,去偽存真,總算對其略窺門徑。未敢私藏,故公之於眾。其中難免有誤,請大家指正,謝謝!ps 原文寫的很好,但依然有不詳盡的地方,本人此次精心修改,希望能幫助到各位,時間緊張,文章格式不嚴謹,...

SVPWM的原理及法則推導和控制演算法詳解

svpwm是近年發展的一種比較新穎的控制方法,是由三相功率逆變器的六個功率開關元件組成的特定開關模式產生的脈寬調變波,能夠使輸出電流波形盡可能接近於理想的正弦波形。空間電壓向量pwm與傳統的正弦pwm不同,它是從三相輸出電壓的整體效果出發,著眼於如何使電機獲得理想圓形磁鏈軌跡。svpwm技術與spw...