AMI码及HDB3码的编译码程序设计

一、实验目的:掌握AMI码及HDB3码的编译码程序设计方法

二、实验内容:

(1)已知信息码流是1000 1 00 1 000 0 0 1 000 0 1 1 1 0 00 01 0 1

完成AMI码及HDB3码的编译码程序设计。

(2)已知HDB3码编码后的码流是:-1 +1 0 0 0 +1 -1 0 0 -1 0 +1 0 0 0 +1 0 -1 0 +1,使用译码程序得出原始信息码的码流。

三、实验步骤:

  1. 写出AMI码的编译码程序,基于上面给定的信息码,验证编译码算法是否正确?要求程序中输出编码后的码流。
  2. 写出HDB3码的编译码程序,基于上面给定的信息码,验证编译码算法是否正确?要求程序中输出编码后的码流。
  3. 将实验内容(2)中给出的HDB3码编码后码流输入到HDB3码译码程序中,经程序译码后输出译码结果,并与理论译码结果进行比较,检验二者是否一致?

四、实验结果及分析

AMI码编码原理:

消息码的“1”交替地变换为“+1”和“-1”,而“0”保持不变。(而第一个1的符号是正还是负均可)

HDB3码编码原理:

1 连“0”个数不超过3个时,遵循AMI的编码规则;

2 连“0”个数超过3个时,将第四个“0”改为非“0”脉冲,记为V+或V-,称为破坏脉冲。

3 相邻V码的极性必须交替出现(确保无直流);

4 V码的极性应与前一个非“0”脉冲的极性相同,否则,将0000更改为B+00V+或B-00V-。B称为调节脉冲。

5 V码之后的传号极性也要交替。

AMI:

clear;
A=input("输入一组信息码流:"); 
n=length(A);
flag=1;
for i=1:n
   if A(1,i)==1
        flag=flag*(-1);
        A(1,i)=flag;
   end
end
disp("AMI编码后的码组:");
disp(A);
%A=[-1 +1 0 0 0 +1 -1 0 0 -1 0 +1 0 0 0 +1 0 -1 0 +1]
for i=1:n
    if(A(1,i)==-1||A(1,i)==1)
        A(1,i)=1;
    end
end
disp("译码后的码组为:");
disp(A);

HDB3:

clear;
A=input("输入信息码:");
disp('原码');
disp(A);
AMI = zeros(size());
n=length(A);
count=0;%统计连0的个数
%用2表示V
%用3表示B
for i=1:n
    if A(1,i)==1
        count=0;
    else
        count=count+1;
        if count==4
            A(1,i)=2;
            A(1,i-3)=3;
            count=0;
        end
    end
end
disp(A);
flag1=-1;%决定第一个非零数为-1或1
flag2=1;%寻找第一个V
flag3=1;%寻找第一个B
for i=1:n
    if A(1,i)==1
        flag1=flag1*(-1);
        A(1,i)=flag1;
    end
    if(A(1,i)==3&&flag3==1)
        A(1,i)=0;
        flag3=0;
    end
    if A(1,i)==2
        if flag2==1
            flag2=0;
            if flag1>0
                A(1,i)=2;
            else
                A(1,i)=-2;
            end
            if A(1,i)>0
               flag4=1;
            else
                flag4=0;   %判断第一个V是正还是负
            end
        else
            if flag4==1
            A(1,i)=-2;
            else
            A(1,i)=2;
            end
            if A(1,i)>0
               flag4=1;
            else
                flag4=0;   %判断第一个V是正还是负
            end
            if (A(1,i)>0&&flag1==1)||(A(1,i)<0&&flag1==-1)
                A(1,i-3)=0;
            else
                if A(1,i)>0
                    A(1,i-3)=3;
                else
                    A(1,i-3)=-3;
                end
                flag1=flag1*(-1);
            end
        end
    if(A(1,i)>0)
        flag1=1;
    else
        flag1=-1;
    end
    end
end
disp(A);
for i=1:n
    if A(1,i)>0
        A(1,i)=1;
    elseif A(1,i)<0
        A(1,i)=-1;
    else
        A(1,i)=0;
    end
end
disp("HDB3编码为:");
disp(A);
A=[-1 +1 0 0 0 +1 -1 0 0 -1 0 +1 0 0 0 +1 0 -1 0 +1];%给定信息码译码
n=length(A);
count=0;
for i=1:n
    if A(1,i)==0
        count=count+1;
        if count==2
            if A(1,i+1)~=0&&A(1,i+1)==A(1,i-2)
                A(1,i-2)=0;
                A(1,i+1)=0;
            end
        end
        if count==3
            if A(1,i+1)~=0&&A(1,i+1)==A(1,i-3)
                A(1,i+1)=0;
            end
        end
    else
        count=0;
    end
end
for i=1:n
    if(A(1,i)==-1)
        A(1,i)=1;
    end
end
disp("译码结果为:");
disp(A);

  • 4
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值