第一次用matlab编程。 查找了crc循环冗余的资料,就跟着crc求余数的思路。
Crc方法:把12位多项式当做除数,把多项式系数变成二进制01编码,最高次1, 于是12位多项式相 然后,把生成的随机数也变成二进制,在其后面补R=(多项式长度-1)个0, 再除以多项式,二进制除法就相当于异或计算,不进位。余数的取最后的R位。(做到这里就达到题目的要求了)再将随机数的后R位用余数替换,除以二进制多项式,若余数为0,则正确,不为0,错误。
1.十进制转二进制dec2bin 转化后的二进制格式,要转变成向量矩阵,才能进行矩阵合并,进而补0 oba=dec2bin(a) ; d=[]; for l=1:length(oba) d=[d str2num(oba(l))]; end d; 2.设置一个空矩阵x[],最后填充时,格式要对,还要把向量转成十进制 r=num2str(r) r=bin2dec (r
1XXXXXXXXXXX共2048个12位多项式,十进制时2048到4095 后一位确定为1,所以都不能被2整除所以可以作为判断条件。[q,v]=deconv()相当于多项式除法,结果可能为负数 Mod2,模2取余法,求得余数。 5.用二进制计算要注意之前各种数据格式的转化!!格式不对,会报错。而且有时回报2^53的错 这是crc,运行100次的概率图 这是用十进制直接除100次的概率图 十进制运行1W次的概率。 用crc算法,matlab运行太慢,里面有太多的for循环。其核心是多项式除法,即异或除法,所以和10进制除法不一样。附加crc代码: x=[]; i=0; a=unidrnd(2^60-1) oba=dec2bin(a) ; d=[]; for l=1:length(oba) d=[d str2num(oba(l))]; end d;
for m=2048:4095
obj=dec2bin(m) ; c=[]; for j=1:length(obj) c=[c str2num(obj(j))]; end c;R=length(c)-1; [q,r] = deconv([d zeros(1,R)],c);
r=mod(r(end-R+1:end),2); r=num2str(r); r=bin2dec®; i=i+1; x(i)=r; end end fprintf(‘x=%dx[]’)
第二问 假设用2000个随机数分别求第一个多项式…第2048个多项式,看哪个余数的重复最少。即验证2048个crc多项式哪个最优。 只用把除数的循环提前,再加一个2000次循环就可以了。
把数据导入excel中操作比较方便,筛选出余数个数最多的多项式。111001010011
