function [code,varargout]=HDB3(signal,varargin)
%-------------------------使用须知-------------------------------
%功能 ,先得到AMI码,即把消息码中的"1"交替变成"-1"和"+1"将"0"仍保持为"0"
% 然后检查AMI码中连0的情况,
% 若AMI码中连0的个数小于4,此时的AMI码就是HDB3码;
% 若AMI码中连0的个数大于4,则将每4个连0小段的第4个0变换成与前一个非0符号(+1或-1)同极性的符号,
% 用V表示(+1 === +V,-1 === -V);
%
%使用 ,example:
% s=[0 1 0 1 1 0 0 0 1 0 0 0 0 1 1 1 1 1 1];
% code=HDB3(s); %全部按默认设置,返回二进制序列码
% code=HDB3(s,2); %初始连"0"个数为2,返回二进制序列码
% code=HDB3(s,2,-1); %初始连"0"个数为2,信号码序中的第一个"1"设为-1,返回二进制序列码和最后一个"1"的状态
% [code,pre]=HDB3(s,-1); %信号码序中的第一个"1"设为-1,返回二进制序列码和最后连"0"个数
% [code,pre,status]=HDB3(s,2); %初始连"0"个数为2,返回二进制序列码,最后连"0"个数
% %和最后一个"1"的状态
% [code,pre,status]=HDB3(s,2,-1); %初始连"0"个数为2,信号码序中的第一个"1"设为-1,返回二进制序列码,
% %最后连"0"个数和最后一个"1"的状态
%输入参数
%signal ,表示输入信号
%pre ,初始连"0"个数,默认值0
% 最终存储信号码序中的最后连"0"个数,并可返回供其它程序使用
%status ,表示信号码序中的第一个"1"的状态,默认值1
% 最终存储信号码序中的最后一个"1"的状态,并可返回供其它程序使用
%输出参数
%code ,返回变换后的二进制序列串
%pre
%status
%局部变量
%sf ,16倍输入信号码速
%最后更新 2010/4/15
%----------------------------------结束------------------------------------
sf=16;
pre=0;
if nargin > 2 && isnumberal(varargin{2}) && min(varargin{2},0)<1
pre=mod(varargin{2},4);
end
status=1;
if nargin > 1 && isequal(varargin{1},-1)
status=varargin{1};
end
group=[];
if pre >0
group=zeros(1,pre);
end
[code1,statusm]=AMI(signal,status);
code=code1;
len=length(signal);
codem=[group code];
lenm=len+pre;
if lenm>3
i=1;
while i<lenm-2
group=codem(i:i+3);
j=i;
if isequal(group,[0,0,0,0])
codem(i+3)=-status;
i=i+3;
else
i=i-1+find(group~=0,1);
status=0-status;
end
i=i+1;
end
code=codem(pre+1:end);
pre=lenm-max(j,find(codem~=0,1,'last'));
else
pre=len-find(group~=0,1,'last');
status=statusm;
end
if nargout > 2
varargout{2}=pre;
end
if nargout > 1
varargout{1}=status;
end
if nargout < 1
yper=-1.1:0.2:1.3;
xt=ones(length(yper),len);
yt=ones(length(yper),len);
for i=1:len
xt(1:end,i)=i;
yt(1:end,i)=yper(1:end);
end
subplot(2,1,1)
sy=zeros(1,sf*len);
sx=0:1/sf:len-1/sf;
for i=1:len
sy(sf*(i-1)+1:sf*i)=signal(i);
end
plot(sx,sy,xt,yt,'r--');
set(gca,'XLim',[-0.1 len+0.1]);
for i=1:len
text('Position',[i-0.8,1.3],'String',signal(i));
end
sy=zeros(1,sf*len);
for i=1:len
if ~isequal(code(i),0)
sy(sf*(i-1)+1:sf*i)=code(i);
end
end
subplot(2,1,2);
plot(sx,sy,xt,yt,'r--');
set(gca,'XLim',[-0.1 len+0.1]);
for i=1:len
if isequal(code(i),code1(i))
text('Position',[i-0.8,1.3],'String',code(i));
else
text('Position',[i-0.8,1.3],'String',strcat(num2str(code(i)),'V'));
end
end
end