一、实验目的:掌握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,使用译码程序得出原始信息码的码流。
三、实验步骤:
- 写出AMI码的编译码程序,基于上面给定的信息码,验证编译码算法是否正确?要求程序中输出编码后的码流。
- 写出HDB3码的编译码程序,基于上面给定的信息码,验证编译码算法是否正确?要求程序中输出编码后的码流。
- 将实验内容(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);