通信原理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的时候为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(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 二元码编码
-
初始化:
- 定义了一个二进制信码
code
。 - 创建了时间轴数据
t
。
- 定义了一个二进制信码
-
单极性非归零码(NRZ):
- 当码值为1时,信号为高电平;当码值为0时,信号为低电平。
-
双极性非归零码(polar_NRZ):
- 与单极性非归零码类似,但当码值为0时,信号为负电平。
-
单极性归零码(RZ):
- 当码值为1时,信号从高电平到低电平过渡;当码值为0时,信号为低电平。
-
双极性归零码(polar_RZ):
- 在双极性非归零码的基础上,对1和-1的信号添加了过渡值,即一半为低电平。
-
传号差分码(NRZ_M):
- 与前一个比特位的值相反的比特位会导致信号波形的跳变。
-
空号差分码(NRZ_S):
- 当码值为0时,信号波形保持不变;当码值为1时,信号波形跳变。
-
数字双向码(manchester_code):
- 当码值为1时,信号波形从负电平跳变到正电平;当码值为0时,信号波形从正电平跳变到负电平。
-
密勒码(miler_code):
- 当连续两个或多个码值为0时,信号波形会有特定的跳变。
-
传号反转码(CMI):
- 对于连续的1,信号保持连续的电平;对于0,信号波形交替变化。
- 绘图:
- 使用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的时候为1,0的时候为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码
%二进制码0用0电平表示
%二进制码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码。
-
初始化:
- 定义了一个三元信码
code
。 - 创建了时间轴数据
t
。
- 定义了一个三元信码
-
单极性非归零码(NRZ3):
- 当码值为1时,信号为高电平;当码值为0时,信号为低电平。
-
AMI码:
- 二进制码0用0电平表示。
- 二进制码1交替地用+1和-1的半占空归零码表示。
-
HDB3码:
- HDB3是一种维护信号的直流偏置为零的编码方案,它在传输时保持相对恒定的电平。
- 当连续出现4个零时,HDB3码会替换前面出现的3个零。
-
BNZS码:
- BNZS码是一种与HDB3类似的码,但其处理连续的零的方式略有不同。
-
绘图:
- 使用MATLAB的
plot
函数绘制了每种码型的波形。
- 使用MATLAB的
三、二元码的解码
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的时候为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
%解码 1--0,0--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交替的用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)
四、三元码的解码
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)