实验内容
采用MATLAB产生长度为16位的随机二进制序列进行HDB3编码和解码,并打印出原始码元、HDB3编码、解码波形。
先用seq = randi([0, 1], 1, 16)生成16位的随机二进制序列,再进行AMI编码得到AMI,在AMI编码的基础上判断0的个数和非0元素的极性,进行HDB3的编码。解码过程是先把HDB3解码为AMI,再通过decode = abs(decode);解码为原始二进制序列。流程如图1所示。
1.AMI
将消息码的“1”(传号)交替地变换为“+1”和“-1”,而“0”(空号)保持不变。
例如:消息码:0 1 1 0 0 0 0 0 0 0 1 1 0 0 1……
AMI码:0 -1 +1 0 0 0 0 0 0 0 -1 +1 0 0 -1……
AMI码对应的波形是具有正、负、零三种电平的脉冲序列。
%% AMI部分
seq = randi([0, 1], 1, 16);% 生成随机二进制序列
% AMI码
polarity = 1; % 初始符号
AMI=zeros(1,length(seq)); % 初始化
for i = 1:length(seq)
if seq(i) == 1
polarity = -polarity;
AMI(i) = polarity;
end
end
2.HDB3
HDB3是AMI码的一种改进型,使连“0”个数不超过三个。
(1)检查消息码中“0”的个数。当连“0”数目小于等于3时HDB码与AMI码一样,+1与-1交替;
(2)当连“0”数目超过3个时,将每4个连“0”化作一小节定义为 BOOV,称为破坏节,其中V称为破坏脉冲,而B称为调节脉冲;
(3)V与前一个相邻的非“0”脉冲的极性相同,并且要求相邻的V码之间极性必须交替。V的取值为+1或-1;
(4)B的取值可选0+1或-1,以使V同时满足(3)中的两个要求
(5)V码后面的传号码极性也要交替。
%% HDB3
count=0; % 连0计数器初始化
HDB3=AMI; % HDB3初始化
sign=0; % 极性标志初始化为0
V=zeros(1,length(AMI));
% V脉冲位置记录变量
B=zeros(1,length(AMI));
% B脉冲位置记录变量
for i = 1:length(AMI)
if AMI(i) == 0
count = count + 1; %连0个数
if count == 4 % 如果4连0
count = 0; % 计数器清0
if i==4 %前四位都为0
HDB3(1:4)=[1 0 0 1];
else
%先让0000--0001或者000-1
HDB3(i)=1*HDB3(i-4);
end
V(i)=HDB3(i); % V脉冲位置记录
if HDB3(i)==sign % 如果当前V符号与前一个V符号极性相同
HDB3(i)=-1*HDB3(i); % 进行V符号反转
HDB3(i-3)=HDB3(i); % 添加B符号,与V符号同极性
B(i-3)=HDB3(i); % B脉冲位置记录
V(i)=HDB3(i); % V脉冲位置记录
HDB3(i+1:length(AMI))=-1*HDB3(i+1:length(AMI));
%让后面的符号重新交替变化
end
sign=HDB3(i);%记录前一个V符号的极性
end
else % AMI(i) == 1或-1
count=0;
end
end
3.解码
遇到与前面相同的级数,将其和之前的3位(共4位)清零。
input=HDB3; % HDB3码输入
decode=input; % 解码初始化
sign=0; % 极性标志初始化
for i=1:length(HDB3)
if input(i)~=0
if sign==HDB3(i) % 当前码与前一个非零码的极性相同
decode(i-3:i)=[0 0 0 0];
% 则判断该码为V码,将B00V清0
end
sign=input(i);
if input(i) == -1
decode(i) = 1;
end
end
end
decode = abs(decode); % AMI解码
整体代码
% seq=[1 0 0 1 0 0 0 0 0 0 0 0];
seq = randi([0, 1], 1, 16);% 生成随机二进制序列
%% 编码
% AMI码
polarity = 1; % 初始符号为负
AMI=zeros(1,length(seq)); % 初始化
for i = 1:length(seq)
if seq(i) == 1
polarity = -polarity;
AMI(i) = polarity;
end
end
% HDB3码,在AMI的基础上
count=0; % 连0计数器初始化
HDB3=AMI; % HDB3初始化
sign=0; % 极性标志初始化为0
V=zeros(1,length(AMI)); % V脉冲位置记录变量
B=zeros(1,length(AMI)); % B脉冲位置记录变量
for i = 1:length(AMI)
if AMI(i) == 0
count = count + 1; % 连0个数计数
if count == 4 % 如果4连0
count = 0; % 计数器清0
if i==4 % 特殊情况:前四位都为0
HDB3(1:4)=[1 0 0 1];
else %否则,先让0000--0001或者000-1
HDB3(i)=1*HDB3(i-4);
end
V(i)=HDB3(i); % V脉冲位置记录
if HDB3(i)==sign % 如果当前V符号与前一个V符号极性相同
HDB3(i)=-1*HDB3(i); % 进行V符号反转
HDB3(i-3)=HDB3(i); % 添加B符号,与V符号同极性
B(i-3)=HDB3(i); % B脉冲位置记录
V(i)=HDB3(i); % V脉冲位置记录
HDB3(i+1:length(AMI))=-1*HDB3(i+1:length(AMI));%让后面的符号重新交替变化
end
sign=HDB3(i);%记录前一个V符号的极性
end
else % AMI(i) == 1或-1
count=0;
end
end
fprintf('原始码元: %s\n', num2str(seq));
fprintf('AMI码元: %s\n', num2str(AMI));
fprintf('HDB3码元: %s\n', num2str(HDB3));
%% 解码
input=HDB3; % HDB3码输入
decode=input; % 解码初始化
sign=0; % 极性标志初始化
for i=1:length(HDB3)
if input(i)~=0
if sign==HDB3(i) % 当前码与前一个非零码的极性相同
decode(i-3:i)=[0 0 0 0]; % 则判断该码为V码,将B00V清0
end
sign=input(i);
if input(i) == -1
decode(i) = 1;
end
end
end
decode = abs(decode);
fprintf('解码码元: %s\n', num2str(decode));
%% 绘制波形
subplot(4,1,1);
stairs(0:length(seq)-1,seq);
ylim([-2,2]);
title('原码');
subplot(4,1,2);
stairs(0:length(seq)-1,AMI);
ylim([-2,2]);
title('AMI');
subplot(4,1,3);
stairs(0:length(seq)-1,HDB3);
ylim([-2,2]);
title('HDB3');
subplot(4,1,4);
stairs(0:length(seq)-1,decode);
ylim([-2,2]);
title('解码');
实验结果
原始码元: 1 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1
AMI码元: -1 0 0 1 0 0 0 0 0 0 0 -1 1 -1 0 1
HDB码元: -1 0 0 1 0 0 0 1 0 0 0 -1 1 -1 0 1
-1 0 0 1 0 0 0 V 0 0 0 -1 1 -1 0 1
解码码元: 1 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1