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

       

目录

1、单极性非归零码(NRZ码)

2、双极性非归零码

 3、单极性归零码(RZ)

4、双极性归零码

5、传号差分码

6、空号差分码

8、数字双向码

9、密勒码

10、传号反转码(CMI)

11、完整代码


        二元码基带信号的波形为矩形波,幅度取值只有两种电平,分别对应与二进制码1和0。接下来将介绍常用的二元码的编码方式以及对应的matlab代码。
        进行编码之前要先对要编码的二进制码进行定义:

% 定义二进制信码
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;

length_t = length(t);
%查看t的长度
disp(length_t);

        其中,时间轴数据可以任意创建,但是要保证后期绘图时plot函数的前两个参数长度相等。

1、单极性非归零码(NRZ码)

        最简单最常用的码型,用高电平和低电平(常为零电平)两种取值表示二进制码1和0。即用高电平表示1,用低电平表示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

2、双极性非归零码

        用正电平和负电平分别表示1和0。与单极性归零码相比只是将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

 3、单极性归零码(RZ)

        在发送1时,在整个码元期间。高电平只持续一段时间,其余时间归零,即返回到零电平,高电平与整个码元周期的比值叫做占空比。发送0时,则用零电平表示。
        假设占空比为50%

% 单极性归零码: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

4、双极性归零码

        用正极性的归零码和负极性的归零码分别用1和0表示。简单来说,1用10表示,0用-10表示。

% 双极性归零:在双极性非归零码的基础上,给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

5、传号差分码

        电平发生跳变用1表示,故需要定义前一个二元码的值才好进行比较

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

6、空号差分码

        电平发生跳变用0表示,与传号差分码只有细微差别

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

8、数字双向码

        用两位码表示想象中的一位码。一种规定是用10表示0,用01表示1

%数字双向码
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

9、密勒码

        1用10和01交替表示。0有两种情况:单0时在码元间隔内不出现电平跃变,而且在与相邻码元的边界处也无跃变;出现连0时,在两个0的边界处出现电平跃变,即00与11交替。

        所以需要一个flag实现10和01交替表示,用计数变量count存储连0出现的次数,判断是否出现连0的情况。(在代码中,负电平表示0)

%密勒码
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

10、传号反转码(CMI)

        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

11、完整代码

% 定义二进制信码
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;

length_t = length(t);
%查看t的长度
disp(length_t);

% 单极性非归零码: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的时候为-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的时候分一半为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

% 双极性归零:在双极性非归零码的基础上,给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

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


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


%密勒码
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
            

%传号反转码
%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

figure(1)
subplot(9,1,1)
plot(t, NRZ, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -0.5 1.5])
title('单极性非归零码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,2)
plot(t, polar_NRZ, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1.5 1.5])
title('双极性非归零码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,3)
plot(t, RZ, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -0.5 1.5])
title('单极性归零码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,4)
plot(t, polar_RZ, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1.5 1.5])
title('双极性归零码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,5)
plot(t, NRZ_M, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -0.5 1.5])
title('传号差分码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,6)
plot(t, NRZ_S, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('空号差分码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,7)
plot(t, manchester_code, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('数字双相码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,8)
plot(t, miler_code, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('密勒码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,9)
plot(t, CMI, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('传号反转码')
xlabel('时间')
ylabel('幅度')
grid on;

具体实现:

posted @ 2023-09-29 23:58  Flying3080  Views(158)  Comments(0Edit  收藏  举报  来源