matlab实现三元码解码

        之前已经实现用matlab实现二元码编码

matlab实现三元码编码(AMI码,HDB3码,B6ZS码)-CSDN博客

        现在实现用matlab解码。解码比编码简单很多,解码的前提是先编码。

        由于编码的跨度为100,解码的时候for循环也往往是以100为跨度。

1、AMI码解码

%AMI码编码
AMI=[];
flag = 1; % 初始极性为正
for i = 1:length(code)
    if code(i) == 1
        AMI = [AMI ones(1, 50)*flag zeros(1,50)]
        if flag==1
           flag=-1;
        else
           flag=1;
        end
    else
        AMI = [AMI zeros(1,100)]
    end
end
%解码
decode_AMI = []
for i=1:100:length(AMI)
    if AMI(i) == 0
        decode_AMI = [decode_AMI 0]
    else
        decode_AMI = [decode_AMI 1]
    end
end

2、HDB3码

        解码宗旨:找到B00V和000V取代节,将对应B,V位置上的码元换成0。B00V和000V取代节的关键特征就是B和V的极性一样。

        解码规则:1、遇到两个连0,且两个连0前后码元极性相同,认为是B00V型,将B和V所在位置的码元修改为0 ;2、遇到三个连0,且三个连0前后码元极性相同,认为是000V型,将V所在位置的码元修改为0 ;3、最后将-1极性修改为1

%HDB3码编码
HDB3=[];
flag = 1; % 初始极性为正
count_0 = 0;%记录连0个数
count2V_1 = 0;%计算两个V之间1的个数,用于确定是B00V型还是000V型
count_1 = 0; %计算总的1的个数,用于确定B的极性

for i = 1:length(code)
    if code(i) == 1   %当不连0时,与AMI一样
         HDB3 = [HDB3 ones(1, 50)*flag zeros(1,50)]
         count_0 = 0; %连0个数清0,开启新一轮计数
         count_1 = count_1+1;%总的1的个数加1
         count2V_1 = count2V_1 + 1;%两个V之间1的个数加1
        if flag==1
           flag=-1;
        else
           flag=1;
        end
    else  %出现了0
        count_0 = count_0+1;
        if(count_0 < 4)  %仍然和AMI码一样
            HDB3 = [HDB3 zeros(1,100)]
        else   %出现了四个连零
            if mod(count2V_1 ,2 ) == 1 %奇数个,为000V类型,V的极性跟着上一个B走(10)
                HDB3 = [HDB3 ones(1,50) zeros(1,50)]
                count_0 = 0;  %连零个数清零
                count2V_1 = 0 %两个V之间1的个数清零,总的1的个数不清零
            else %偶数个,为B00V型,V的极性跟着上一个B走(-10)
                     if mod(count_1 ,2) == 0 %偶数个1,B的极性轮到1,V跟着B走
                         HDB3( (i-3)*100-99:(i-3)*100-50 ) = 1*ones(1,50)  %B
                         HDB3 = [HDB3 ones(1,50) zeros(1,50)]              %V
                         flag = -flag;
                         count_0 = 0;  %连零个数清零,开启新一轮连0计数
                         count2V_1 = 0 %两个V之间1的个数清零,总的1的个数不清零
                         count_1 = count_1 + 1;
                     else %奇数个1,B的极性轮到-1,V跟着B走
                         HDB3( (i-3)*100-99:(i-3)*100-50 ) = -1*ones(1,50)  %B
                         HDB3 = [HDB3 -1*ones(1,50) zeros(1,50) ]           %V
                         flag = -flag;
                         count_0 = 0;
                         count2V_1 = 0;
                         count_1 = count_1 +1;
                 end
            end
        end
    end
end

%解码
%若HDB3码为0,则源码为0
decode_HDB3 = []
count = 0; %计算连0的个数
for i = 1:100:length(HDB3)   
    if HDB3(i) == 0
        count = count+1;
        if(count == 3)%3连零前后非零脉冲同极性
            if HDB3(i+100) * HDB3(i-300) == 1
                HDB3( i+100:i+199 ) = zeros(1,100);
            end
        end
        
        if(count == 2)%2连零前后非零脉冲同极性
            if HDB3(i+100) * HDB3(i-200) == 1
                HDB3( i+100:i+199 ) = zeros(1,100);
                HDB3( i-200:i-101 ) = zeros(1,100);
            end
        end       
    else
        count = 0;
    end
end

%把-1极性修改为1 
for i=1:100:length(HDB3)
    if HDB3(i) == 0
        decode_HDB3 = [decode_HDB3 0]
    else
        decode_HDB3 = [decode_HDB3 1]
    end
end

3、实现效果

4、完整代码

clc
clear
% 定义二进制信码
code = [1 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 1];
%创建时间轴数据
t = 0:0.5:(length(code)*100-1)*0.5;

%AMI码编码
AMI=[];
flag = 1; % 初始极性为正
for i = 1:length(code)
    if code(i) == 1
        AMI = [AMI ones(1, 50)*flag zeros(1,50)]
        if flag==1
           flag=-1;
        else
           flag=1;
        end
    else
        AMI = [AMI zeros(1,100)]
    end
end
%解码
decode_AMI = []
for i=1:100:length(AMI)
    if AMI(i) == 0
        decode_AMI = [decode_AMI 0]
    else
        decode_AMI = [decode_AMI 1]
    end
end

%*************************************************************
%HDB3码编码
HDB3=[];
flag = 1; % 初始极性为正
count_0 = 0;%记录连0个数
count2V_1 = 0;%计算两个V之间1的个数,用于确定是B00V型还是000V型
count_1 = 0; %计算总的1的个数,用于确定B的极性

for i = 1:length(code)
    if code(i) == 1   %当不连0时,与AMI一样
         HDB3 = [HDB3 ones(1, 50)*flag zeros(1,50)]
         count_0 = 0; %连0个数清0,开启新一轮计数
         count_1 = count_1+1;%总的1的个数加1
         count2V_1 = count2V_1 + 1;%两个V之间1的个数加1
        if flag==1
           flag=-1;
        else
           flag=1;
        end
    else  %出现了0
        count_0 = count_0+1;
        if(count_0 < 4)  %仍然和AMI码一样
            HDB3 = [HDB3 zeros(1,100)]
        else   %出现了四个连零
            if mod(count2V_1 ,2 ) == 1 %奇数个,为000V类型,V的极性跟着上一个B走(10)
                HDB3 = [HDB3 ones(1,50) zeros(1,50)]
                count_0 = 0;  %连零个数清零
                count2V_1 = 0 %两个V之间1的个数清零,总的1的个数不清零
            else %偶数个,为B00V型,V的极性跟着上一个B走(-10)
                     if mod(count_1 ,2) == 0 %偶数个1,B的极性轮到1,V跟着B走
                         HDB3( (i-3)*100-99:(i-3)*100-50 ) = 1*ones(1,50)  %B
                         HDB3 = [HDB3 ones(1,50) zeros(1,50)]              %V
                         flag = -flag;
                         count_0 = 0;  %连零个数清零,开启新一轮连0计数
                         count2V_1 = 0 %两个V之间1的个数清零,总的1的个数不清零
                         count_1 = count_1 + 1;
                     else %奇数个1,B的极性轮到-1,V跟着B走
                         HDB3( (i-3)*100-99:(i-3)*100-50 ) = -1*ones(1,50)  %B
                         HDB3 = [HDB3 -1*ones(1,50) zeros(1,50) ]           %V
                         flag = -flag;
                         count_0 = 0;
                         count2V_1 = 0;
                         count_1 = count_1 +1;
                 end
            end
        end
    end
end

%解码
%若HDB3码为0,则源码为0
decode_HDB3 = []
count = 0; %计算连0的个数
for i = 1:100:length(HDB3)   
    if HDB3(i) == 0
        count = count+1;
        if(count == 3)%3连零前后非零脉冲同极性
            if HDB3(i+100) * HDB3(i-300) == 1
                HDB3( i+100:i+199 ) = zeros(1,100);
            end
        end
        
        if(count == 2)%2连零前后非零脉冲同极性
            if HDB3(i+100) * HDB3(i-200) == 1
                HDB3( i+100:i+199 ) = zeros(1,100);
                HDB3( i-200:i-101 ) = zeros(1,100);
            end
        end       
    else
        count = 0;
    end
end

%把-1极性修改为1 
for i=1:100:length(HDB3)
    if HDB3(i) == 0
        decode_HDB3 = [decode_HDB3 0]
    else
        decode_HDB3 = [decode_HDB3 1]
    end
end
                

disp("源码:")
disp(code)
disp("AMI解码:")
disp(decode_AMI)
disp("HDB3码解码:")
disp(decode_HDB3)

        

猜你喜欢

转载自blog.csdn.net/chenhuifei/article/details/133846223