之前已经实现用matlab实现二元码编码
matlab实现三元码编码(AMI码,HDB3码,B6ZS码)-CSDN博客
现在实现用matlab解码。解码比编码简单很多,解码的前提是先编码。
由于编码的跨度为100,解码的时候for循环也往往是以100为跨度。
1、AMI码解码
%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
2、HDB3码
解码宗旨:找到B00V和000V取代节,将对应B,V位置上的码元换成0。B00V和000V取代节的关键特征就是B和V的极性一样。
解码规则:1、遇到两个连0,且两个连0前后码元极性相同,认为是B00V型,将B和V所在位置的码元修改为0 ;2、遇到三个连0,且三个连0前后码元极性相同,认为是000V型,将V所在位置的码元修改为0 ;3、最后将-1极性修改为1
%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
3、实现效果
4、完整代码
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)