matlab实现二元码解码(单极性非归零码、双极性非归零码,单极性归零码、双极性归零码、传号差分码、空号差分码、数字双相码、密勒码、传号反转码)

       

目录

1、单极性非归零码解码

2、双极性非归零码

3、单极性归零码

4、双极性归零码

5、传号差分码

6、空号差分码

7、数字双向码

7、密勒码

8、传号反转码

9、实现效果

10、完整代码


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

matlab实现二元码编码(单极性非归零码、双极性非归零码,单极性归零码、双极性归零码、传号差分码、空号差分码、数字双相码、密勒码、传号反转码)_Flying778的博客-CSDN博客

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

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

1、单极性非归零码解码

        直接解码即可,遇1解1,遇0解0。

% 单极性非归零码:1的时候为1,0的时候为0
NRZ = [];%存储单极性非归零码
for i = 1:length(code)
    if code(i) == 1
        %使用方括号拼接两个向量[]
        NRZ = [NRZ ones(1, 100)];%为了和t长度一样,一次的跨度也要为100
    else
        NRZ = [NRZ zeros(1, 100)];
    end   
end
%解码:1解码为1,0解码为0
decode_NRZ = [];
for i = 1:100:length(NRZ)
    if NRZ(i) == 0
        decode_NRZ = [decode_NRZ 0];
    else
        decode_NRZ = [decode_NRZ 1];
    end
end

2、双极性非归零码

        与单极性非归零码解码类似,1解码为1,-1解码为0。

% 双极性非归零码:1的时候为1,0的时候为-1
polar_NRZ = [];
for i = 1:length(code)
    if code(i) == 1
        polar_NRZ = [polar_NRZ ones(1, 100)];
    else
        polar_NRZ = [polar_NRZ -1*ones(1, 100)];
    end
end
%解码:1解码为1,-1解码为0
decode_polar_NRZ = [];
for i = 1:100:length(polar_NRZ)
    if polar_NRZ(i) == -1
        decode_polar_NRZ = [decode_polar_NRZ 0];
    else
        decode_polar_NRZ = [decode_polar_NRZ 1];
    end
end

3、单极性归零码

        每100第一个元素与单极性非归零码相同

% 单极性归零码:1的时候分一半为0(归零),0的时候为0
RZ = [];
for i = 1:length(code)
    if code(i) == 1
        RZ = [RZ ones(1, 50) zeros(1, 50)];%从高电平到低电平过渡
    else
        RZ = [RZ zeros(1, 100)];
    end
end
%解码
decode_RZ = [];
for i=1:100:length(RZ)
    if RZ(i) == 1
        decode_RZ = [decode_RZ 1]
    else
        decode_RZ = [decode_RZ 0]
    end
end

4、双极性归零码

% 双极性归零:在双极性非归零码的基础上,给1和-1均加入过渡值,即一半归零
polar_RZ = [];
for i = 1:length(code)
    if code(i) == 1
        polar_RZ = [polar_RZ ones(1, 50) zeros(1, 50)];
    else
        polar_RZ = [polar_RZ -1*ones(1, 50) zeros(1, 50)];
    end
end
%解码
decode_polar_RZ = []
for i= 1:100:length(polar_RZ)
    if polar_RZ(i) == 1
        decode_polar_RZ = [decode_polar_RZ 1]
    else
        decode_polar_RZ = [decode_polar_RZ 0]
    end
end

5、传号差分码

        设变量previous_bit表示前一码元的值,NRZ_M(i)与前一位码元相同为0,否则为1.

%传号差分码:波形跳变取值为1
NRZ_M = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i = 1:length(code)
    if code(i) == previous_bit
        bit_value = 0; % 当前位与前一位异或运算,相同为0,不同为1
    else
        bit_value = 1;
    end
    NRZ_M = [NRZ_M ones(1, 100)*bit_value];
    
    previous_bit = bit_value; % 更新前一位比特的数值
end
%解码
decoded_NRZ_M = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i=1:100:length(NRZ_M)
    if  NRZ_M(i) == previous_bit
        decoded_NRZ_M = [decoded_NRZ_M 0]
    else
        decoded_NRZ_M = [decoded_NRZ_M 1]
    end
    previous_bit = NRZ_M( i )
end

6、空号差分码

        与传号差分码类似,只是波形跳变为0。

% 空号差分码:波形跳变取值为0
NRZ_S = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i = 1:length(code)
    if code(i) == previous_bit
        bit_value = 1;
    else   
        bit_value = 0; % 当前位与前一位异或运算
    end
    
    NRZ_S = [NRZ_S ones(1, 100)*bit_value];
    previous_bit = bit_value; % 更新前一位比特的数值
end
%解码
decoded_NRZ_S = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i=1:100:length(NRZ_S)
    if  NRZ_S(i) == previous_bit
        decoded_NRZ_S = [decoded_NRZ_S 1]
    else
        decoded_NRZ_S = [decoded_NRZ_S 0]
    end
    previous_bit = NRZ_S( i )
end

7、数字双向码

        以100为跨度,判断第一位元素即可

%数字双向码
%0:用10表示;1:用01表示
manchester_code  = [];
for i = 1:length(code)
    if code(i) == 1
        manchester_code = [manchester_code -1*ones(1,50) ones(1,50)];
    else
        manchester_code = [manchester_code ones(1,50) -1*ones(1,50)];
    end
end
%解码
decode_manchester_code  = [];
for i = 1:100:length(manchester_code)
    if manchester_code(i) == 1
        decode_manchester_code = [decode_manchester_code 0]
    else
        decode_manchester_code =[decode_manchester_code 1]
    end
end

7、密勒码

        100周期内,码元全部相同为0,否则为1。

%密勒码
miler_code = [];
flag = 1;
count_0 = 0;%存储连0的个数
for i=1:length(code)
    if code(i) == 1
        count_0 = 0;%清空连0个数
        miler_code = [miler_code -1*flag*ones(1,50) flag*ones(1,50)]
        if flag == 1
            flag = -1;
        else
            flag = 1;
        end
    else  %等于0
        count_0 = count_0+1;
        if(count_0 < 2)%不连零的情况
            miler_code = [miler_code -flag*ones(1,100)]
        else%连零
            miler_code = [miler_code flag*ones(1,100)]
            flag = -flag;
        end
    end
end
            
%密勒码解码
decode_miler_code = []
for i=1:100:length(miler_code)
    if miler_code(i+49) == miler_code(i+99)
        decode_miler_code = [decode_miler_code 0]
    else
        decode_miler_code = [decode_miler_code 1]
    end
end

8、传号反转码

        与密勒码解码规则相同。

%传号反转码
%1交替的用00和11表示,0固定用01表示
CMI=[];
flag = 1; % 初始极性为正
for i = 1:length(code)
    if code(i) == 1
        CMI = [CMI ones(1, 100)*flag];
       if flag==1
           flag=-1;
       else
           flag=1;
       end
    else
        CMI = [CMI ones(1, 50)*-1 ones(1, 50)]; % 0:交替极性
    end
end
%解码
decode_CMI = []
for i = 1:100:length(CMI)
    if CMI(i+49) * CMI(i+99) == -1
        decode_CMI = [decode_CMI 0]
    else
        decode_CMI = [decode_CMI 1]
    end
end

9、实现效果

10、完整代码

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

% 单极性非归零码:1的时候为1,0的时候为0
NRZ = [];%存储单极性非归零码
for i = 1:length(code)
    if code(i) == 1
        %使用方括号拼接两个向量[]
        NRZ = [NRZ ones(1, 100)];%为了和t长度一样,一次的跨度也要为100
    else
        NRZ = [NRZ zeros(1, 100)];
    end   
end
%解码:1解码为1,0解码为0
decode_NRZ = [];
for i = 1:100:length(NRZ)
    if NRZ(i) == 0
        decode_NRZ = [decode_NRZ 0];
    else
        decode_NRZ = [decode_NRZ 1];
    end
end

%*****************************************************************************

% 双极性非归零码:1的时候为1,0的时候为-1
polar_NRZ = [];
for i = 1:length(code)
    if code(i) == 1
        polar_NRZ = [polar_NRZ ones(1, 100)];
    else
        polar_NRZ = [polar_NRZ -1*ones(1, 100)];
    end
end
%解码:1解码为1,-1解码为0
decode_polar_NRZ = [];
for i = 1:100:length(polar_NRZ)
    if polar_NRZ(i) == -1
        decode_polar_NRZ = [decode_polar_NRZ 0];
    else
        decode_polar_NRZ = [decode_polar_NRZ 1];
    end
end

%*****************************************************************************
% 单极性归零码:1的时候分一半为0(归零),0的时候为0
RZ = [];
for i = 1:length(code)
    if code(i) == 1
        RZ = [RZ ones(1, 50) zeros(1, 50)];%从高电平到低电平过渡
    else
        RZ = [RZ zeros(1, 100)];
    end
end
%解码,不管是否归零,以100为跨度,只看第一个
decode_RZ = [];
for i=1:100:length(RZ)
    if RZ(i) == 1
        decode_RZ = [decode_RZ 1]
    else
        decode_RZ = [decode_RZ 0]
    end
end

%******************************************************************************
% 双极性归零:在双极性非归零码的基础上,给1和-1均加入过渡值,即一半归零
polar_RZ = [];
for i = 1:length(code)
    if code(i) == 1
        polar_RZ = [polar_RZ ones(1, 50) zeros(1, 50)];
    else
        polar_RZ = [polar_RZ -1*ones(1, 50) zeros(1, 50)];
    end
end
%解码
decode_polar_RZ = []
for i= 1:100:length(polar_RZ)
    if polar_RZ(i) == 1
        decode_polar_RZ = [decode_polar_RZ 1]
    else
        decode_polar_RZ = [decode_polar_RZ 0]
    end
end

%******************************************************************************
%传号差分码:波形跳变取值为1
NRZ_M = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i = 1:length(code)
    if code(i) == previous_bit
        bit_value = 0; % 当前位与前一位异或运算,相同为0,不同为1
    else
        bit_value = 1;
    end
    NRZ_M = [NRZ_M ones(1, 100)*bit_value];
    
    previous_bit = bit_value; % 更新前一位比特的数值
end
%解码
decoded_NRZ_M = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i=1:100:length(NRZ_M)
    if  NRZ_M(i) == previous_bit
        decoded_NRZ_M = [decoded_NRZ_M 0]
    else
        decoded_NRZ_M = [decoded_NRZ_M 1]
    end
    previous_bit = NRZ_M( i )
end


%******************************************************************************
% 空号差分码:波形跳变取值为0
NRZ_S = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i = 1:length(code)
    if code(i) == previous_bit
        bit_value = 1;
    else   
        bit_value = 0; % 当前位与前一位异或运算
    end
    
    NRZ_S = [NRZ_S ones(1, 100)*bit_value];
    previous_bit = bit_value; % 更新前一位比特的数值
end
%解码
decoded_NRZ_S = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i=1:100:length(NRZ_S)
    if  NRZ_S(i) == previous_bit
        decoded_NRZ_S = [decoded_NRZ_S 1]
    else
        decoded_NRZ_S = [decoded_NRZ_S 0]
    end
    previous_bit = NRZ_S( i )
end

%数字双向码
%0:用10表示;1:用01表示
manchester_code  = [];
for i = 1:length(code)
    if code(i) == 1
        manchester_code = [manchester_code -1*ones(1,50) ones(1,50)];
    else
        manchester_code = [manchester_code ones(1,50) -1*ones(1,50)];
    end
end
%解码
decode_manchester_code  = [];
for i = 1:100:length(manchester_code)
    if manchester_code(i) == 1
        decode_manchester_code = [decode_manchester_code 0]
    else
        decode_manchester_code =[decode_manchester_code 1]
    end
end


%密勒码
miler_code = [];
flag = 1;
count_0 = 0;%存储连0的个数
for i=1:length(code)
    if code(i) == 1
        count_0 = 0;%清空连0个数
        miler_code = [miler_code -1*flag*ones(1,50) flag*ones(1,50)]
        if flag == 1
            flag = -1;
        else
            flag = 1;
        end
    else  %等于0
        count_0 = count_0+1;
        if(count_0 < 2)%不连零的情况
            miler_code = [miler_code -flag*ones(1,100)]
        else%连零
            miler_code = [miler_code flag*ones(1,100)]
            flag = -flag;
        end
    end
end
            
%密勒码解码
decode_miler_code = []
for i=1:100:length(miler_code)
    if miler_code(i+49) == miler_code(i+99)
        decode_miler_code = [decode_miler_code 0]
    else
        decode_miler_code = [decode_miler_code 1]
    end
end

%传号反转码
%1交替的用00和11表示,0固定用01表示
CMI=[];
flag = 1; % 初始极性为正
for i = 1:length(code)
    if code(i) == 1
        CMI = [CMI ones(1, 100)*flag];
       if flag==1
           flag=-1;
       else
           flag=1;
       end
    else
        CMI = [CMI ones(1, 50)*-1 ones(1, 50)]; % 0:交替极性
    end
end

%传号反转码解码
decode_CMI = []
for i = 1:100:length(CMI)
    if CMI(i+49) * CMI(i+99) == -1
        decode_CMI = [decode_CMI 0]
    else
        decode_CMI = [decode_CMI 1]
    end
end

disp("源码:")
disp(code)
disp("单极性非归零码解码")
disp(decode_NRZ)
disp("双极性非归零码解码")
disp(decode_polar_NRZ)
disp("单极性归零码解码")
disp(decode_RZ)
disp("双极性归零码解码")
disp(decode_polar_RZ)
disp("传号差分码解码")
disp(decoded_NRZ_M);
disp("空号差分码解码")
disp(decoded_NRZ_S)
disp("数字双相码解码")
disp(decode_manchester_code)
disp("密勒码解码")
disp(decode_miler_code)
disp("传号反转码解码")
disp(decode_CMI)

posted @ 2023-10-15 19:11  Flying3080  Views(71)  Comments(0Edit  收藏  举报  来源