MATLAB 仿真 HDB3 码程序
clear
clc
a=1024;
数如 1024
r=unidrnd(2,1,a-1);
a-1 个
rn=r-1;
rn=[1,rn];
二值分布(1,2),共 a 个
ori=rn;
ori
l=1;
for n=1:a
if rn(n)==1 ;
l=-l;
rn(n)=l;
end
end
AMI=rn;
变一次号
AMI
m=-1;
for k=1:a-3
if abs(rn(k))==1
m=rn(k);
%a 表示元素个数,可以修改码元为任意个
%随机产生离散均匀二值分布(1,2),共
%每个元素减 1 变为(0,1)二值随机数列
%跟书上一致,从 1 开始随机产生离散均匀
%将原序列保存起来,便于后面解码后比较
%每检测到一个 1 变一次符号
%变为 AMI 码:每过一个 1 就使原来的 1
%符号初始化
%m 记录可能存在的连续 4 个 0 前面非零码元
的符号
end
if rn(k)==0
if rn(k+1)==0
if rn(k+2)==0
if rn(k+3)==0
%检测是否连续 4 个码元都是 0
rn(k+3)=2*m; %用 2 表示书上的 V
end
end
end
end
end
rn ;
后 checked
l=1;
码,0 是偶数,所以初始为 1,l=-1 表示两个 V 之间有奇数个非零码
for s=1:a
%插入 V(2)
%l=1 表示两个 V 之间有偶数个非零
if abs(rn(s))==2
for d=s+1:a
if abs(rn(d))==1
一个一使 l 变一次号,表示偶数或奇数
l=-l;
end
if abs(rn(d))==2
if l~=1
l=1;
也应把计数器清零
为偶数个,则插入 B
4))));
else
%V 之间的非零码只有+1,-1 遇到
%不需要插入 B 时若检测到 V
%最初版本的升级处 1
%检测到下一个 V 时,若
rn(d-3)=3*(-(rn(d-4))/(abs(rn(d-
%3 代表 B,插入不带符号的 B
rn(d:a)=-rn(d:a);
end
%V 后的符号再交替
%到此处完成了插入不带符号的 B
end
end
end
end
rn
%for s=1:a
%找到 B
%B
% if abs(rn(s))==3
%rn(s)=rn(s)*(-(rn(s-1))/(abs(rn(s-1))));
(3)与前一个位置的带符号的归一值相乘再取反,实现符号 B(3)的极性与前一非符号的
相反
来的 V,从它开始非零码正负号交替变化
%end
%end
HDB=rn;
且实现了 V 后的符号再交替
HDB ;
编码
for k=1:a
if abs(rn(k))==2
rn(k-3)=0;rn(k)=0;
0,V 前面第三个有可能是 B(3)有可能是 0 也恢复为 0
end
if abs(rn(k))==1
rn(k)=1;
%B 后面第三个就是接下
%给 B(3)添加了符号,并
%以上便实现了 HDB3 的
%下面进行解码
%每个 V(2)都变成
end
end
rn;
rn-ori
则解码正确
%解码后的恢复序列
%解码与原码比较全为 0