循环冗余码CRC使用matlab实现
生活随笔
收集整理的這篇文章主要介紹了
循环冗余码CRC使用matlab实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
循環冗余編碼
基本思想:發送端按照給定的規則,在k個信息比特后面增加L個按照某種規則計算的校驗比特;在接收端對收到的信息比特重新計算L個校驗比特。比較接收到的校驗比特和本地重新計算的校驗比特,如果相同則認為傳輸無誤,否則認為傳輸有誤。
循環冗余編碼需要生成多項式,
CRC編碼程序
%CRC循環冗余編碼函數 function crc_encode_scr=crc_encode(scr, poly) %scr為信息多項式系數向量,poly為生成多項式系數向量[],例如,若系數為1100,則輸入為[1 1 0 0] [M,N]=size(poly); scrg=[scr zeros(1,N-1)];%在信息多項式系數后補零 [q,r]=deconv(scrg, poly);%多項式除法q中為商,r為余數,此為十進制多項式除法 r=abs(r); for i=1:length(r)a=r(i);if(mod(a,2)==0)%將余數變為模二結果r(i)=0;elser(i)=1;end end crc=r(length(scr)+1:end);%獲取余項 crc_encode_scr=bitor(scrg,r);%余項加在信息位后面構成編碼這里起初有一個疑問:模二除和直接十進制除法之后再除2取余數 結果一致嗎?
通過實驗的方式驗證是一致的,數學基礎好像是代數論的問題。
比如對于原信息比特和生成多項式src=[1 1 1 1 1 1 1 1]; poly=[1 0 1 1];
經過簡單的列豎式計算(模二除)得到 crc校驗位是011.
下面看一下 直接十進制除法之后再除2取余數 的結果
得到余數為
然后對2取余數 發現也是 011
分析
deconv函數
不管是u,v還是q,r都是多項式的系數(所以,這是一個長除法的運算)。
bitor函數
返回兩數的異或值
mod函數
返回余數,取模。
CRC解碼程序
%解碼 function [crc_decode_rev, error]=crc_decode(rev,poly) %rev為接收到的碼向量,poly為生成多項式系數向量[M,N]=size(poly); [q r]=deconv(rev,poly);%得到長除法之后的商和余數,十進制下 r=mod(abs(r),2);%轉化為二進制下 if r==zeros(1,length(rev))error=0; elseerror=1; end crc_decode_rev=rev(1:length(rev-N+1));%去掉后面校驗碼,得到原始信息比特總結
以上是生活随笔為你收集整理的循环冗余码CRC使用matlab实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 奶茶涨价了 利润那么却还要涨价的原因
- 下一篇: Matlab最短路学习