function y =ami(x)
%AMI码
t0=300;
t=0:1/t0:length(x);
k=0;
for i=1:length(x)
if(x(i)==1)
k=k+1;
if(mod(k,2)==1) %x(i)若为奇数则从1到0,为偶数则从-1到0;
for j=1:t0/2
y(t0/2*(2*i-2)+j)=1;
y(t0/2*(2*i-1)+j)=0;
end
else
for j=1:t0/2
y(t0/2*(2*i-2)+j)=-1;
y(t0/2*(2*i-1)+j)=0;
end
end
else
for j=1:t0/2
y(t0*(i-1)+j)=0;
end
end
end
y=[y,x(i)];
M=max(y);
m=min(y);
subplot(211)
plot(t,y);grid on;
axis([0,i,m-0.1,M+0.1]);
title({'AMI码';'1 0 0 1 1 0 0 0 0 1 0 1'});
function y=hdb3(x)
%HDB3码
% 输入x为信息代码,输出y为相应的变换后的HDB3码
n=length(x);
m=zeros(1,n);
%设定初始参考值
last_y=-1;
last_v=1;%若前一点为V-,则last_v=-1;为V+,则last_v=1。zero_flag=0;
%开始变换
for i=1:n
if(x(i)==1)
m(i)=-last_y;
last_y=m(i);
zero_flag=0;
else
m(i)=0;
zero_flag=zero_flag+1;
end
if(zero_flag==4)
if(last_y==last_v)
m(i-3)=-last_y;
m(i)=m(i-3);
last_y=m(i);
last_v=m(i);
else
m(i)=last_y;
last_y=m(i);
last_v=m(i);
end
zero_flag=0;
end
end
%以下绘制波形
t0=300;
t=0:1/t0:length(m);
for i=1:length(m)
if(m(i)==1)
for j=1:t0/2
y(t0/2*(2*i-2)+j)=1;
y(t0/2*(2*i-1)+j)=0;
end
end
if(m(i)==-1)
for j=1:t0/2
y(t0/2*(2*i-2)+j)=-1;
y(t0/2*(2*i-1)+j)=0;
end
end
if(m(i)==0)
for j=1:t0/2
y(t0*(i-1)+j)=0;
end
end
end
y=[y,m(i)];
M=max(y);
m1=min(y);
subplot(211)
plot(t,y);grid on;
axis([0,i,m1-0.1,M+0.1]);
%下面的title视情况选V-或V+。
title({'前一破坏点为V+的HDB3码';'1 0 0 1 1 0 0 0 0 1 0 1'});