目录
1、传号交替反转码(AMI)
2、HDB3码
3、B6ZS码
4、完整代码
三元码指的是用信号幅度的三种取值表示二进制码,三种幅度的取值为:+A,0,-A,或记作+1,0,-1。
下面将介绍三种三元码及其具体的matlab编码。
编码之前先定义要编码的二进制码。
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码中,二进制码0用0电平表示,二进制码1交替的用+1和-1的半占空归零码表示。
%AMI码
AMI=[];
flag = 1; % 初始极性为正,即第一个1出现时用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的编码流程可以表示为以下三个步骤:
1、找到取代节的位置,即出现4个连0码的地方
定义count_0计数连0的个数,每次遇到1或者一轮的取代节取代结束都将其归零,开启新一轮的计数。
2、确定使用哪一种类型的取代节,选择的原则是保证相邻V脉冲之间的B脉冲个数为奇数。
定义count2V_1计数相邻V脉冲之间的B脉冲个数,遇到1加1,一轮的取代节取代结束将其归零,计算下一相邻V脉冲之间的B脉冲个数。
3、确定取代节中B脉冲和V脉冲的极性,B脉冲的极性保持交替反转,V脉冲的极性跟着上一个B脉冲走。
定义count_1计算B脉冲的个数,B脉冲的个数包括二进制码中本来就包括的1以及生成的取代节中的1,所以如若取代节为B00V型,取代结束之后count_1还需加1。
未出现连4个0情况时,HDB3码与AMI码相同。
%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为3时,取代节为0VB。B脉冲的极性保持交替反转,V脉冲的极性跟着上一个B脉冲走。
%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
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码
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(4,1,1)
plot(t, NRZ3, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('单极性非归零码')
xlabel('时间')
ylabel('幅度')
grid on;
subplot(4,1,2)
plot(t, AMI, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('AMI码')
xlabel('时间')
ylabel('幅度')
grid on;
subplot(4,1,3)
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(4,1,4)
plot(t, BNZS, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('BNZS码')
xlabel('时间')
ylabel('幅度')
grid on;
具体实现: