MATLAB HDB3的编码与解码
clear;
clc;
close all;
%x1=[1 1 0 1 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 1 0];
x1=[1 0 0 0 1 0 1 0 0 0 0 1 0 1 1 0 0 0 0 1 1 0 1 1];
n=length(x1);
x2=x1;
m=1;
r=0;
v=[];
for i=1:n
if x2(i)==0 %如果是0
r=r+1;%开始计数
if r==4%连续4个0
v=[v i];%记录V坐标
r=0;%0计数清零
end
else%如果是1
r=0;%0计数清零
end
end
b=[];
for i=2:length(v)
count=0;
for j=v(i):-1:v(i-1)%序列中第二个破坏码向前面看(就是向左边看)
if x2(j)~=0
count=count+1;
end
end
if mod(count,2)==0%两个v之间偶数个非零,要加b
b=[b v(i)-3];%记录b坐标
end
end
x2(v)=2;%将V都为2,便于观察
x2(b)=3;%将b都为3,便于观察
disp("v为2,b为3")
x2
%处理b
x2(b)=1;%b与信码交替极性
for i=1:n
if x2(i)==1%如果是1
x2(i)=m;%1和-1交替
m=-m;%1和-1交替
end
end
%处理v
for i=1:length(v)
for j=v(i)-1:-1:1
if x2(j)~=0
x2(v(i))=x2(j);%v与前一个非零的相同
break;
end
end
end
%HDB3解码
e=0;
x3=x2;
for i=n:-1:1
if x3(i)~=0
for j=i-1:-1:1
if x3(j)~=0%前一个非0
if x3(j)==x3(i)%与前一个非0相同,说明是v
x3(i)=0;%v位置0
x3(i-3)=0;%b位置0,若原位置是0也无妨
end
break
end
end
end
end
x3=abs(x3);%处理完成
%以下与编解码无关,只是为了方便展示
x1=[x1 x1(21)];
x2=[x2 x2(21)];
x3=[x3 x3(21)];
subplot(3,1,1);stairs([0:length(x1)-1],x1);axis([0 length(x1)-1 -2 2]); set(gca,'xtick',0:1:length(x1));ylabel('消息码');
hold on;
x1=x1(1:length(x1)-1);
str1=num2str(x1');
text([0:length(x1)-1]+0.5,zeros(1,length(x1))+0.5,str1);
subplot(3,1,2);stairs([0:length(x2)-1],x2);axis([0 length(x2)-1 -2 2]); set(gca,'xtick',0:1:length(x1));ylabel('HDB3码');
hold on;
x2=x2(1:length(x2)-1);
str1=num2str(x2');
text([0:length(x2)-1]+0.5,zeros(1,length(x2))+0.5,str1);
subplot(3,1,3);stairs([0:length(x3)-1],x3);axis([0 length(x3)-1 -2 2]); set(gca,'xtick',0:1:length(x1));ylabel('解码后');
x3=x3(1:length(x3)-1);
str1=num2str(x3');
text([0:length(x3)-1]+0.5,zeros(1,length(x3))+0.5,str1);
posted on 2022-07-05 10:08 longway_chu 阅读(643) 评论(0) 收藏 举报