资源预览内容
第1页 / 共18页
第2页 / 共18页
第3页 / 共18页
第4页 / 共18页
第5页 / 共18页
第6页 / 共18页
第7页 / 共18页
第8页 / 共18页
第9页 / 共18页
第10页 / 共18页
亲,该文档总共18页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
计算机网络课程实验报告实验2:抗干扰编码姓名李蓝鑫院系自动化学院学号U实验地点科技楼十二楼机房实验时间5月3日实验目的:1. 了解抗干扰编码原理。2、掌握海明编码和CRC编码的原理,能熟练计算实验内容:内容1:海明编码1.1 海明编码原理将有效信息按某种规律分成若干组,每组安排一个校验位通过异或运算进行校验,得出具体的校验码;在接收端同样通过异或运算看各组校验结果是否正确,并观察出错的校校组,或者个出错的校验组的共同校验位,得出具体的出错比特位;对错误位取反来将其纠正;假设用N表示添加了校验码位后整个传输信息的二进制位数,用K代表其中有效信息位数,r表示添加的校验码位数,它们之间的关系应满足:N=Kr2r1(是为了确保r位校验码能校验全部的数据位,因为r位校验码所能表示的最大十进制数为2r-1,同时也确保各位码本身不被其他校验码校验)。海明码的校验码的位置必须是在2n次方位置(n从0 开始,分别代表从左边数起分别是第1、2、4、8、16),信息码也就是在非2n次方位置第i位校验码从当前校验码位开始,每次连续校验i位后再跳过i位,然后再连续校验i位,再跳过i位,以此类推。确定每个校验码所校验的比特位:1.2 海明编码程序流程图1.3 交互界面设计 编码:原码序列从“输入序列”编辑框输入,点击“编码”按钮在“编码序列”编辑框内输出编码序列,对输入编码要求为二进制输入译码:编码序列从“输入序列”编辑框输入,点击“译码”按钮在“译码序列”编辑框内输出译码序列,若译码错误会有响应的报错和纠错,对输入序列有不小于三位和二进制序列的要求1.4 核心代码与注释输入序列框callback%做输入检测,检测是否是“0”“1”输入,否则报错temp_str=get(handles.input,String);num_char=unique(temp_str);%unique函数获得输入字符串中不同字符的字符串if length(num_char)=2 %如果字符串长度为2 if num_char(2)=1 %第二个字符不是“1”说明字符串中有其他字符 else set(handles.input,String,0000); errordlg(只能输入1和0,输入错误); endelseif length(num_char)=1 %如果字符串长度为1,判断“1”还是“0,否则报错 if num_char(1)=0 elseif num_char(1)=1 else set(handles.input,String,0000); errordlg(只能输入1和0,输入错误); end else %如果字符串长度不为2,直接报错 set(handles.input,String,0000); errordlg(只能输入1和0,输入错误); End编码按钮callback(编码核心)%获取输入字符串temp_str=get(handles.input,string);%获取字符串长度len_str=length(temp_str);%转存原码字符串长度备用k=len_str;%初始化需要插入的校验码的位数r=0;%根据海明编码的2(r)-1)(k+r)要求,计算校验码位数while(2(r)-1)(k+r) r=r+1;end%把字符串数组转成0和1的数组,便于处理for i=1:1:len_str if temp_str(i)=1 yuan(i)=1;%原码数组为yuan else yuan(i)=0; endend%把求得相应位数的校验码,用0插入原码中得到新码j=0;m=1;for i=1:1:(k+r) if i=2(j) %如果该位置为2的次方,则插入校验码 xin(i)=0; j=j+1; else xin(i)=yuan(m); m=m+1; endend%进行海明编码odd=0;%用于计算每位校验码负责校验的位置的和for j=1:1:r %共有r位校验码,需要计算r次 n=1; %初始化循环变量 i=1; while(n*2(j-1)+i-1)(2(j-1) %如果本段的编码已经加完 i=1; %则调转到下一段,也就是隔一个2(j-1)的段再进行累加 n=n+2; else %累加 odd=odd+xin(n*2(j-1)+i-1); i=i+1; end end if mod(odd,2)=0 %判断是否为偶数 xin(2(j-1)=0; %若为偶数,则在对应的校验位插入0 else xin(2(j-1)=1; %若为奇数,则在对应的校验为插入1 end odd=0;end%编码完毕,把数组转换成字符串用于输出for i=1:1:(k+r) if xin(i)=1 output_str(i)=1; else output_str(i)=0; endendset(handles.out,String,output_str);译码按钮callback(原理与编码基本相同)%获得译码序列字符串temp_str=get(handles.input,string);len_str=length(temp_str);%判断输入序列长度是否满足要求,不满足报错返回if len_str=len_str) r=r-1; end r=r+1;%找到校验码的个数 k=len_str-r; for i=1:1:len_str%得到所有编码数组 if temp_str(i)=1 xin(i)=1; else xin(i)=0; end end %提取出信息编码数组 m=1; j=0; for i=1:1:(k+r) if i=2(j) j=j+1; else yuan(m)=xin(i); m=m+1; end end %重新偶校验,原理同编码 odd=0; for j=1:1:r n=1; i=1; while(n*2(j-1)+i-1)(2(j-1) i=1; n=n+2; else odd=odd+xin(n*2(j-1)+i-1); i=i+1; end end if mod(odd,2)=0 check(j)=0; %校验结果存在check数组中 else check(j)=1; end odd=0; end %把check数组也就是校验结果转成十进制数 num_wrong=0; for j=1:1:r num_wrong=num_wrong*2; if check(r-j+1)=1 num_wrong=num_wrong+1; end end %判断校验是否正确,为0则正确 if num_wrong=0 for m=1:1:k if yuan(m)=1 output_str(m)=1; else output_str(m)=0; end end set(handles.ym_out,String,output_str); else%否则校验错误,对应位置取反后再输出 if xin(num_wrong)=0 xin(num_wrong)=1; else xin(num_wrong)=0; end m=1; j=0; for i=1:1:(k+r) if i=2(j) j=j+1; else yuan(m)=xin(i); m=m+1; end end for m=1:1:k if yuan(m)=1 output_str(m)=1; else output_str(m)=0; end end set(handles.ym_out,String,output_str); errordlg(校验码第 ,num2str(num_wrong), 位出错,对应位置取反后得到正确解码为,output_str,校验出错); endend1.5 程序执行测试1.5.1 编码测试正常编码
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号