电子技术实验报告2-译码器及数码管驱动芯片应用()

时间:2024.4.8

学生实验报告


第二篇:循环码编译码实验报告


Harbin Institute of Technology

信息论与编码报告

题 目循环码编译码实验

(系)  电子与信息工程学院  

          通信1        

                          

                           

                           

哈尔滨工业大学

循环码编译码实验

1 设计内容

循环码是线性分组码中最重要的一类码,它的结构完全建立在有限域多项式的基础上,它具有两个基本特点:一是编码电路与译码电路非常简单,易于实现;二是其代数性质好,分析方便,有一定的成熟的译码方法。

一个(n,k)线性分组码C,如果码组中的一个码字的循环移位也是这个码组中的一个码字,则称C为循环码。

本实验主要完成以下四项内容:

(1)利用(7,4)系统循环码的生成多项式为:,请设计该循环码的编码器。

(2)随机产生重量为0或1的八种错误图样中的一种,得到实际接收码字。

(3)根据接收到的码字进行译码,译码方式分为校验子译码和梅吉特译码两种。

(4)对于在BSC信道传输时的情形进行讨论,验证(7,4)系统循环码的纠错能力。   

2 编程环境

本实验采用Matlab作为编程工具,所有代码均在Matlab软件中运行,此软件功能强大,应用广泛,在此不再赘述。

3 各模块设计

3.1 编码器模块

利用(7,4)系统循环码的生成多项式为:,请设计该循环码的编码器。流程图为:

                 

图1 (7,4)循环码编码流程图              图2 4位信息码元编码流程图   

     

在学生设计的演示工具中输入的信息码元可以为任意多个,系统自动按每4个连续的码字一组进行编码,当输入的信息码元不是4的倍数时,自动补零到与信息码元长度最接近的4的倍数。译码时也是按照每7个连续的码字一组进行译码。但是为了流程图的清晰明了,在本文的流程图除流程图1以外,其余均按一个循环码码字(即7位)来描述。

编码器模块源程序如下:

%%%函数功能:(7,4)系统循环码编码器

%%%编程时间:20##-11-29

%%%该系统循环码编码器的生成多项式是g(x) = x^3 + x + 1;

% %%系统循环码编码的原理是,首先用x^r乘以信息码字多项式m(x),这里r = 3;然后用x^r*m(x)除以生成多项式g(x),

% %%得余式r(x);最后得系统循环码多项式c(x) = x^r*m(x) + r(x)

function [code_out,code_in_L] = coder(code_in)

%%code_in:输入信息码字

%%code_out:输出编码后的码字

%%L:输入的信息码元的长度

 n=7;%%每个码字长度

 k=4;%%每个码字中信息码元长度

 code_in_L=length(code_in);

a=rem(code_in_L,k);%信息码元的长度除以k后的余数

if a~=0 %%%信息码元长度不是k的整数倍,则补0

    array_0=zeros(1,k-a);%%%补零个数

    code_in=[code_in ,array_0];

end

code_in_4=(reshape(code_in,k,length(code_in)/k))';%%%将补零后的码元变成length(code_in)/4行,4列矩阵

for loop=1:length(code_in)/k

    mes_code = [code_in_4(loop,:),zeros(1,3)];    % 在信息码字后面补上三个零,相当于乘上x^r

    gen = [1 0 1 1];                    % 生成多项式向量

    % 在二元域进行运算,必须把信息码字多项式向量和生成多项式向量转到二元域GF(2)上

    % 函数gf(X,M)用于从向量X生成GF(2^M)上对应的向量

    mes_g = gf(mes_code,1);

    gen_g = gf(gen,1);

    % 用x^r*m(x)除以生成多项式g(x)

    [Q,rem_g] = deconv(mes_g,gen_g);    % 多项式除法其实就是解卷积运算,得到除法的商式Q,余式rem_g

    %%相应的,多项式乘法其实是系数的卷积

    code_rem = rem_g.x;  % rem_g.x表示二元域向量rem_g的一个属性,即多项式的系数。

    %rem_g.x是在实数域中,而rem_g是在二元域中

                                   

    % 输出系统循环码

    code_out(loop,:) = [code_in_4(loop,:),code_rem(5:n)];

end

end 

3.2 产生错误图样模块

本模块产生随机产生重量为0或1的八种错误图样中的一种,并得到实际接收码字。程序流程图如图3所示。

图3 产生随机错误图样流程图

产生错误图样源程序如下:

%%函数功能:随机产生重量为0或1的八种错误图样中的一种,得到实际接收码字

%%时间:20##-11-29

function [code_R,error_picture] = error_pattern(code_S)

% code_S:本来发送的码字

% code_R:实际接收到的码字

% error_picture:随机生成的重量为0或1的八种错误图样中的一种

 n=7;

 k=4;

 [L,W]=size(code_S);

 num=L*W;

 code_send=reshape(code_S',1,num);

 code_send_7=(reshape(code_send,n,length(code_send)/n))';%%%将码元变成length(code_in)/n行,n列矩阵

for loop=1:length(code_send)/7

    error=zeros(1,n);       %错误图样序列

    error_place=randi([0,n],1,1); %错误图样位置

    if (error_place==0)

        code_R(loop,:)=code_send_7(loop,:);

    else

        error(8-error_place)=1;

        for i=1:n

             code_temp=mod(code_send_7(loop,i)+error(i),2);          %接收码字序列

             code_R(loop,i) =code_temp;

        end

    end

         error_picture(loop,:)=error;

end

end

3.3 译码模块

学生设计了校验子译码和梅吉特译码两种译码方式,其中校验子译码时校验子多项式与错误图样多项式的对应关系表如下:

表1 校验子多项式与错误图样多项式对应关系

梅吉特译码电路如下图:

图4 梅吉特译码电路

                

图5 校验子译码流程图                       图6 梅吉特译码流程图

校验子译码源程序如下:

%%函数功能:校验子译码

%%时间:20##-11-29

function [C_decode_n,C_decode_k] = check(code_R,code_in_L)

% code_R:接收码字序列

%code_in_L:信息码元长度

%C_decode_n:译码后的码字序列

%C_decode_k:译码后的信息码元

n=7;

k=4;

gen = [1 0 1 1];                    % 生成多项式向量

 [L,W]=size(code_R);

 num=L*W;

 code_recrive=reshape(code_R',1,num);

code_recrive_7=(reshape(code_recrive,n,length(code_recrive)/n))';%%%将码元变成length(code_in)/n行,n列矩阵

for loop=1:length(code_recrive)/7

    % 在二元域进行运算,必须把信息码字多项式向量和生成多项式向量转到二元域GF(2)上

    % 函数gf(X,M)用于从向量X生成GF(2^M)上对应的向量

    R_g = gf(code_recrive_7(loop,:),1);

    gen_g = gf(gen,1);

    % 用R_g除以生成多项式g(x)

    [Q,rem_g] = deconv(R_g,gen_g);    % 多项式除法其实就是解卷积运算,得到除法的商式Q,余式rem_g

    S_rem_2 = rem_g.x;  % rem_g.x表示二元域向量rem_g的一个属性,即多项式的系数

    %rem_g.x是在实数域中,而rem_g是在二元域中

    L_S_rem_2=length(S_rem_2);%%长度

    S_rem=S_rem_2(L_S_rem_2)+2*S_rem_2(L_S_rem_2-1)+4*S_rem_2(L_S_rem_2-2);%%2进制转化为10进制

    error=zeros(1,n);

    if S_rem==0

        error=[0 0 0 0 0 0 0];

    elseif S_rem==1

        error=[0 0 0 0 0 0 1];

    elseif S_rem==2

        error=[0 0 0 0 0 1 0];

    elseif S_rem==4

        error=[0 0 0 0 1 0 0];

    elseif S_rem==3

        error=[0 0 0 1 0 0 0];

    elseif S_rem==6

        error=[0 0 1 0 0 0 0];

    elseif S_rem==7

        error=[0 1 0 0 0 0 0];

    elseif S_rem==5

        error=[1 0 0 0 0 0 0];

    end

    for i=1:length(error)

        if error(i)==1

            E_place=i;%%定位错误的位置

            code_recrive_7(loop,E_place)=~code_recrive_7(loop,E_place);   %错误码字译码

        end

    end

    code_temp=code_recrive_7(loop,:);

    % 输出译码

    C_decode_n(loop,:) =code_temp;

    C_decode_k0(loop,:) =code_temp(1:k);   

end

% 输出译码

%  C_decode_n=reshape(C_decode_n0',1,length(code_recrive));

 C_decode_k1=reshape(C_decode_k0',1,length(code_recrive)/7*4);

 C_decode_k=C_decode_k1(1:code_in_L);

end

梅吉特译码源程序如下:

%%函数功能:(7,4)系统循环码梅吉特译码

%%编程时间:20##-11-29

function [C_decode_n,C_decode_k] = encoder(code_R,code_in_L)

%%code_R:接收到的码字

%%code_in_L:信息码元长度

%%C_decode_n:译码之后得到的码字

%%C_decode_k:译码之后得到的信息码元

n=7;

k=4;

 [L,W]=size(code_R);

 num=L*W;

 code_recrive=reshape(code_R',1,num);

code_recrive_7=(reshape(code_recrive,n,length(code_recrive)/n))';%%%将码元变成length(code_in)/n行,n列矩阵

for loop=1:length(code_recrive)/7

    D=[0,0,0];%%开始译码时门打开

    %%寄存器初始化D=[D0 D1 D2]

    for i=1:n

        D_temp(1)=mod(D(3)+code_recrive_7(loop,i),2);

        D_temp(2)=mod(D(1)+D(3),2);

        D_temp(3)=D(2);

        D=D_temp;

    end

    for i=1:n                     %输入端关闭,移位寄存器中的接收码

        S=double(D(1)&(~D(2))&D(3));       %模2加后输出,S反馈到D寄存器

        D_temp(1)=mod(D(3)+S,2);

        D_temp(2)=mod(D(1)+D(3),2);

        D_temp(3)=D(2);

        D=D_temp;

        code_temp(i)=mod(code_recrive_7(loop,i)+S,2);

    end

    % 输出译码

    C_decode_n(loop,:) =code_temp;

    C_decode_k0(loop,:) =code_temp(1:k);

end

% 输出译码

%  C_decode_n=reshape(C_decode_n0',1,length(code_recrive));

 C_decode_k1=reshape(C_decode_k0',1,length(code_recrive)/7*4);

 C_decode_k=C_decode_k1(1:code_in_L);

end

3.4 BSC信道传输时的译码模块

本模块的编程比较简单,主要是调用bsc函数,设置一下错误概率参数p即可,故不在此报告中给出源代码。需要指出的是,本模块的主要作用不只是看一下不同错误概率时的实际接收码字,更重要的是,可以验证(7,4)系统循环码的纠错能力,因为理论上讲,(7,4)系统循环码只能纠一位错,本模块正好验证了这一点。

4 运行方法及相应结果

利用Matlab进行GUI设计生成的用户界面如图7所示。需要注意的是,不可直接在扩展名为.fig的文件下进行编译码操作,而需要运行该.fig的源m文件,在新弹出的界面中进行编译码操作,否则会提示错误:Attempt to reference field of non-structure array.

图7 (7,4)系统循环码编译码演示工具界面

本工具的操作方法如下,以下4步按操作依次进行

(1)在编码模块的“输入信息码元”处输入信息码元,点击“开始编码”按键,即进行(7,4)系统循环码编码操作,在“输出循环码码字”处输出编码后的码字。主要注意的是:本工具中,输入的信息码元形式不能为0000的形式,而应该是0 0 0 0(码元之间用空格隔开)或者0,0,0,0(码元之间用逗号隔开)的形式,当然两端也可以加中括号,输入的码元长度不是4的倍数也无所谓。比如可以输入信息码元 [1 1]或者[0 0 1 1]或者[1 1 1 1 0 1 0 1]。

(2)在产生随机错误图样模块,点击“产生错误图样”按键,显示错误图样和实际接收码字。

(3)在译码模块,在校验子译码板块点击“译码”按键则显示译码得到的码字和相应的信息码元,同样,在梅吉特译码板块点击“译码”按键也显示译码得到的码字和相应的信息码元。

(4)在BSC信道传输时板块,首先在“错误概率”处输入相应的错误概率,点击“显示实际接收码字”按键,则显示实际接收码字,然后点击“译码”按键分别显示校验子译码和梅吉特译码的结果。

运行结果见下面的5个图,其中图8、图9、图10分别为输入码元不同,分别为[1 1][0 0 1 1][1 1 1 1 0 1 0 1],分别代表了三种不同的情形。图11、图12则为输入码元[0 0 1 1],信道错误概率p=0.1时的情形,验证了(7,4)系统循环码只能纠一位错误。

图8 输入信息码元为[1 1]时的情形

图9 输入信息码元为[0 0 1 1]时的情形

图10 输入信息码元为[1 1 1 1 0 1 0 1]时的情形

图11每个码字错一位码元的情形

由图11可知,错一位码元时,译码可以纠正。

图12每个码字错两位的情形

由图12可知,错两位码元时,校验子译码和梅吉特译码不仅不能纠错,可能还会导致更多的错误。

5 实验心得及课程建议

通过本次试验,学生对(7,4)系统循环码的编译码过程有了更深的了解,掌握了循环码编码、校验子译码和梅吉特译码的编程方法,更值得高兴的是,学生初步了解了利用Matlab进行用户界面GUI设计,并进行了相应的实际操作。

学生对于课程的建议是,由于几乎所有同学本科室都学过信息论这门课,而对于编码掌握的并不好,故是不是可以适当压缩信息论部分的学时,多讲一些编码方面的知识,比如RS码等,感觉在做编码方面或者跳频方面(因为跳频图案的设计时需要一些编码的知识)的课题时,这些知识很有用。

更多相关推荐:
电子技术应用实验报告

电子技术应用实验报告一实验项目四人智力竞赛抢答器要求1每个参赛者控制一个按钮用按动按钮发出抢答信号2竞赛主持人另有一个开关用于将电路复位3抢答器具有锁存功能即竞赛开始后先按动按钮者将对应的一个LED灯点亮此后其...

电子技术实验教程实验五

实验五场效应管放大器系别姓名学号实验日期一实验目的1学习场效应管放大电路设计和调试方法2掌握场效应管基本放大电路的设计及调整测试方法二实验仪器345678示波器函数信号发生器直流稳压电源数字万用表多功能电路实验...

电子技术应用实验实验报告—抢答器

电子技术应用实验实验报告八一实验项目名称4人智力竞赛抢答器实验内容设计并实现一个4人智力竞赛用抢答器电路具体要求为1每个参赛者控制一个按钮用按动按钮发出抢答信号2竞赛主持人另有一个按钮用于将电路复位3抢答器具有...

模拟电子技术基础实验教程

模拟电子技术基础实验教程教材内容依照教学规律按照由浅入深循序暂进的学习和能力培养原则分层次安排实验内容后一层次的内容以前一层次为基础逐步加深模拟电子技术基础实验教程肇庆学院光机电一体化综合性实验教学示范中心实验...

电子技术实验报告(二极管应用电路)

实验报告二课程名称电子技术实验项目二极管应用电路专业班级姓名座号09实验地点仿真室实验时间指导老师成绩一实验目的1通过二极管的伏安特性的绘制加强对二极管单向导通特性的理解2掌握直流稳压电源的制作及其特点二实验内...

模拟电子技术课程设计实验报告

xxxxxxx学院模拟电子课程设计综合实验班级姓名学号指导教师设计时间电子信息工程xxxxxx120xx5022720xx年xxxxxxx学院二一四年一实验目的通过集成直流稳压电源的设计安装和调试要求学会1选择...

电子科技大学电子技术应用实验报告(四人抢答器)

电子技术应用试验实验报告八电子科技大学实验报告任课教师实验教师姓名学号时间20xx年12月1011日课程名称电子技术应用试验实验名称4人智力竞赛抢答器一实验项目名称4人智力竞赛抢答器实验内容设计并实现一个4人竞...

应用电子技术—电工技术实验教学大纲

电工技术课程实验教学大纲课程名称电工技术课程总学时72课程代码0720xx1实验学时16实验学分05适用专业应用电子技术专业通信技术专业三年制专科一实验教学的性质和任务1实验教学的性质电工技术实验是应用电子技术...

电子技术实验报告(集成运放应用电路)

实验报告四课程名称电子技术实验项目集成运放应用电路专业班级姓名座号09实验地点仿真室实验时间指导老师成绩一实验目的1通过运放应用电路的Multisim仿真映证运放应用电路估算方法的可行性二实验内容1比例运算电路...

《电路与模拟电子技术》EDA实验报告(实验一)

电路与模拟电子技术EDA实验报告实验一一实验目的1验证叠加原理的正确性2验证戴维南定理二实验内容求下图电路的戴维南等效电路用此电路验证叠加原理的正确性1戴维南等效电路第一步测ab间的开路电压第二步测ab间的短路...

20xx年模拟电子技术实验报告模板[1]

武汉职业技术学院电信学院模拟电子技术实验报告实验科目模拟电子技术实验实验名称实验专业实验者实验时间20xx20xx年第二学期实验指导教师黄老师武汉职业技术学院实验训项目单Trainingitem

电子科技大学电子技术实验报告Multisim4.16

416两级放大电路放大倍数的测量416两级放大电路输入电阻的测量416两级放大电路输出电阻的测量未接负载接负载416两级放大电路幅频特性曲线测量电路图416两级放大电路幅频特性曲线

电子技术应用实验教程实验报告(15篇)