通信原理matalab实验汇总——二三元码的调制与解调

通信原理matalab仿真实验汇总——二三元码的调制与解调

本文主要涉及通信原理中重要的二三原码的调制与解调的matalab代码的实现。
关于通信原理还有其他文章可参考:

1、信息量、码元、比特、码元速率、信息速率详细解析——实例分析
2、模拟系统的AM信号的调制与频域分析
3、AM解调、DSB、VSB的调制与解调
4、模拟非线性调制——相位调制PM、频率调制FM、NBFM窄带调频
5、低通抽样与带通抽样
6、简单二元码的编码与功率谱
7、数字双向码、密勒码、传号反转(CMI)码、AMI、HDB3
8、ASK(幅度移键控)、FSK(频率移键控)、PSK(相位移键控)的matalab仿真

一、 二元码的编码

1.1 所有二元码的matalab代码实现

%-----二元码的编码----
% 定义二进制信码
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的时候为10的时候为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的时候为10的时候为-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交替的用0011表示,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(2,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(2,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;

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

subplot(2,1,2)
plot(t, polar_RZ, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1.5 1.5])
title('双极性归零码')
xlabel('时间')
ylabel('幅度')
grid on;
 
figure(3)
subplot(2,1,1)
plot(t, NRZ_M, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -0.5 1.5])
title('传号差分码')
xlabel('时间')
ylabel('幅度')
grid on;
 
subplot(2,1,2)
plot(t, NRZ_S, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('空号差分码')
xlabel('时间')
ylabel('幅度')
grid on;
 
figure(3)
subplot(2,1,1)
plot(t, manchester_code, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('数字双相码')
xlabel('时间')
ylabel('幅度')
grid on;
 
subplot(2,1,2)
plot(t, miler_code, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('密勒码')
xlabel('时间')
ylabel('幅度')
grid on;
 
figure(4)
subplot(1,1,1)
plot(t, CMI, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('传号反转码')
xlabel('时间')
ylabel('幅度')
grid on;

1.2实现效果图:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3 二元码编码

  1. 初始化

    • 定义了一个二进制信码code
    • 创建了时间轴数据t
  2. 单极性非归零码(NRZ)

    • 当码值为1时,信号为高电平;当码值为0时,信号为低电平。
  3. 双极性非归零码(polar_NRZ)

    • 与单极性非归零码类似,但当码值为0时,信号为负电平。
  4. 单极性归零码(RZ)

    • 当码值为1时,信号从高电平到低电平过渡;当码值为0时,信号为低电平。
  5. 双极性归零码(polar_RZ)

    • 在双极性非归零码的基础上,对1和-1的信号添加了过渡值,即一半为低电平。
  6. 传号差分码(NRZ_M)

    • 与前一个比特位的值相反的比特位会导致信号波形的跳变。
  7. 空号差分码(NRZ_S)

    • 当码值为0时,信号波形保持不变;当码值为1时,信号波形跳变。
  8. 数字双向码(manchester_code)

    • 当码值为1时,信号波形从负电平跳变到正电平;当码值为0时,信号波形从正电平跳变到负电平。
  9. 密勒码(miler_code)

    • 当连续两个或多个码值为0时,信号波形会有特定的跳变。
  10. 传号反转码(CMI)

  • 对于连续的1,信号保持连续的电平;对于0,信号波形交替变化。
  1. 绘图
  • 使用MATLAB的plot函数绘制了每种码型的波形。

二、三元码的编码

2.1 三元码编码matalab代码

% 三元码的编码AMI码,HDB3码,B6ZS码
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;
 
 
% 单极性非归零码:1的时候为10的时候为0
NRZ3 = [];%存储单极性非归零码
for i = 1:length(code)
    if code(i) == 1
        %使用方括号拼接两个向量[]
        NRZ3 = [NRZ3 ones(1, 100)];%为了和t长度一样,一次的跨度也要为100
    else
        NRZ3 = [NRZ3 zeros(1, 100)];
    end
end
 
%AMI码
%二进制码00电平表示
%二进制码1交替地用+1和-1的半占空归零码表示
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
 
%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
 
%BNZS码
BNZS = []
count_0=0;
count_1=0;
flag =1;
for i = 1:length(code)
    if code(i) == 1  %当不连0时,与AMI一样
         BNZS = [BNZS ones(1, 50)*flag zeros(1,50)]
         count_0 = 0;        %0个数清0
         count_1 = count_1+1;%总的1的个数加1
        if flag==1
           flag=-1;
        else
           flag=1;
        end
    else  %出现了0
        count_0 = count_0+1;
        if(count_0 < 3)
            BNZS = [BNZS zeros(1,100)]
        else %出现了3个连零,用0vb,接下来判断VB的极性
            if mod(count_1,2)==1 %奇数个1,V的极性跟着前一个B走,为正,00->10
                BNZS( (i-1)*100-99:(i-1)*100-50 ) = 1*ones(1,50)%V
                BNZS = [BNZS -1*ones(1,50) zeros(1,50)]         %B
                count_1 = count_1 +1;
                count_0=0;
            else%偶数个1
                BNZS( (i-1)*100-99:(i-1)*100-50 ) = -1*ones(1,50)
                BNZS = [BNZS ones(1,50) zeros(1,50)]
                count_1 = count_1 +1;
                count_0=0;
            end
        end
    end
end
 
figure(1)
subplot(2,1,1)
plot(t, NRZ3, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('单极性非归零码')
xlabel('时间')
ylabel('幅度')
grid on;
 
subplot(2,1,2)
plot(t, AMI, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('AMI码')
xlabel('时间')
ylabel('幅度')
grid on;
 
figure(2)
subplot(2,1,1)
plot(t, HDB3, 'LineWidth', 2)
%stairs(0:length(HDB3)-1,HDB3);
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('HDB3码')
xlabel('时间')
ylabel('幅度')
grid on;
 
 
subplot(2,1,2)
plot(t, BNZS, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('BNZS码')
xlabel('时间')
ylabel('幅度')
grid on;

2.2 实现效果

在这里插入图片描述
在这里插入图片描述

2.3 三元码编步骤

用于生成和绘制三种三元码的波形:AMI码、HDB3码和BNZS码。

  1. 初始化

    • 定义了一个三元信码code
    • 创建了时间轴数据t
  2. 单极性非归零码(NRZ3)

    • 当码值为1时,信号为高电平;当码值为0时,信号为低电平。
  3. AMI码

    • 二进制码0用0电平表示。
    • 二进制码1交替地用+1和-1的半占空归零码表示。
  4. HDB3码

    • HDB3是一种维护信号的直流偏置为零的编码方案,它在传输时保持相对恒定的电平。
    • 当连续出现4个零时,HDB3码会替换前面出现的3个零。
  5. BNZS码

    • BNZS码是一种与HDB3类似的码,但其处理连续的零的方式略有不同。
  6. 绘图

    • 使用MATLAB的plot函数绘制了每种码型的波形。

三、二元码的解码

3.1 二元码解码matalab代码


% 二进制解码
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的时候为10的时候为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解码为10解码为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的时候为10的时候为-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
%解码 1--00--1
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
            
%密勒码解码49==99-----0(连0)
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交替的用0011表示,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)

四、三元码的解码

4.1 三元码的解码代码实现

%三元码的解码
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)

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写的什么石山代码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值