MATLAB实现AMI码和HDB3码

一、HDB3码简介

HDB3码全称是三阶高密度双极性码(High Density Bipolar of Order 3 Code),是一种适用于基带传输的编码方式,它是为了克服AMI码的缺点而出现的。HDB3码具有能量分散,抗破坏性强的特点。

二、编码规则

1)当连续0的个数不超过3时,规则与AMI码相同,即0不变,1变为-1、+1交
替;
2)若连续0的个数超过3,则将每4个0看成一小节,定义为B00V,B可以是-1、
0、+1,V可以是-1,+1;
3)B和V具体值满足以下条件:V和前面相邻的非0符号极性相同;不看V时极
性交替;V与V之间极性交替;
4)一般第一个B取0,第一个非0符号取-1;

三、MATLAB实现

利用MATLAB程序实现上述编码规则,并对消息码1101001000000111编码后的
结果如下:

消息码
1 1 0 1 0 0 1 0 0 0 0 0 0 1 1 1
AMI码
-1 1 0 -1 0 0 1 0 0 0 0 0 0 -1 1 -1 HDB3码
-1 1 0 -1 0 0 1 0 0 0 -2 0 0 -1 1 -1
clear;
close all;
clc;
% 生成AMI码
input = [1 1 0 1 0 0 1 0 0 0 0 0 0 1 1 1];
disp('原码');
disp(input);

AMI = zeros(size(input));
% number1记录原码中1的数量
number1 = 0;
% number0记录原码中0的数量
number0 = 0;
% 生成AMI码
for i=1:length(input)
    if input(i)==1
        number1 = number1+1;
        if mod(number1,2)==0
            AMI(i) = +1;
        end
        if mod(number1,2)==1
            AMI(i) = -1;
        end
    end

    if input(i)==0
        number0 = number0+1;
        AMI(i) = 0;
    end
end
disp('AMI码');
disp(AMI);
clear i;
% 生成HDB3码
HDB = zeros(size(input));
% 给每个0000小节加V
i=0;
while(i<=length(input))
    i = i+1;
    if i>length(input)
        break;
    end
    % AMI中的-1和+1保持不变
    if abs(AMI(i))==1
        HDB(i) = AMI(i);
    end
    % 
    if AMI(i) == 0
        HDB(i) = 0;
        if AMI(i+1) == 0
            HDB(i+1) = 0;
            if AMI(i+2) == 0
                HDB(i+2) = 0;
                if AMI(i+3) == 0
                    % 用2代表V
                    HDB(i+3) = 2;
                    i = i+3;
                end
            end
        end
    end

end

% 每两个V极性相反
number2 = 0;
for i=1:length(input)
    if HDB(i)==2
        number2 = number2+1;
        if mod(number2,2)==0
            HDB(i) = +2;
        end
        if mod(number2,2)==1
            HDB(i) = -2;
        end
    end
end

% 统计每2个V之间非零脉冲个数,若偶数,则第2个V所在小节的第1个0变为B
firstV=0;
secondV=0;
for i=1:length(input)
    % 找到第一个V
    if abs(HDB(i)) == 2
        firstV = i;
        for j=i+1:length(input)
            if abs(HDB(j)) == 2
                % 找到第二个V
                secondV = j;
            end
        end
        if secondV ~= 0
            % 计算非0脉冲的个数
            number3 = sum(abs(HDB(firstV+1,secondV-1)));
            if mod(number3,2) == 0
                if HDB(secondV)==-2
                    HDB(secondV-3)==-3;%用-3代表-B
                end
                if HDB(secondV)==+2
                    HDB(secondV-3)==+3;%用+3代表+B
                end
            end
        end
    end
end
disp('HDB3码');
disp(HDB);

    原文作者:蚁群算法
    原文地址: https://blog.csdn.net/hhy_csdn/article/details/80890294
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞