用MATLAB实现HDB3编码

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值