资源描述
AMI、HDB3、密勒码编码实现
——matlab仿真模拟
【任务描述】
A. 产生一个长为1000的二进制随机序列,“0”的概率为0.8,”1”的概率为0.2;
B. 对上述数据进行归零AMI编码,脉冲宽度为符号宽度的50%,波形采样率为符号率的8倍,画出前20个符号对应的波形(同时给出前20位信源序列);
C. 改用HDB3码,画出前20个符号对应的波形;
D. 改用密勒码,画出前20个符号对应的波形;
E. 分别对上述1000个符号的波形进行功率谱估计,画出功率谱;
F. 改变信源“0”的概率,观察AMI码的功率谱变化情况;
【基本思路】
采用调用子函数的方法,在掌握了各种码的编码规律之后实现编码功能。具体实现了AMI码、HDB3码以及密勒码的编码。而且调用了功率谱函数spectrum对各种码的功率谱以及不同信源概率下的功率谱进行了比较。下面就详细介绍各种码形的变换思路:
1. AMI码
AMI码中信息码“0”对应着三元码序列中的“0”,信息码“1”则交替地变换为“+1”和“-1”的归零码。
2. HDB3码
在AMI码的基础上,当出现多于3个零的情况,利用其检错能力,使用异常代替长连零,以平衡码中的极性使得直流分量为0。
3. 密勒码
密勒码中使用码元周期中点的跳变来代表“1”,当出现连续的“0”时出现电平跳变,否则码元周期内不出现跳变。
【程序清单】
Code.m:完成产生随机0、1序列并且将其用波形表示的功能。
AMI_Code.m:将随机序列转换为AMI码
HDB3_Code.m:将随机序列转换为HDB3码
Miller_Code.m:将随机序列转换为密勒码
Plot_spectrum.m: 使用库函数绘制功率谱曲线
【仿真分析】
1. 前20个符号所对应的各种码形
在一次的仿真中随机产生的前20个符号为:
0 0 0 0 0 0 0 0 0 0 1 1 0 0 1 0 0 0 1 0
显然,NRZ(L)码的波形即为原始的序列信息码
对应的AMI码为:
0 0 0 0 0 0 0 0 0 0 1 -1 0 0 1 0 0 0 -1 0
对应的HDB3码为:
1 0 0 1 -1 0 0 -1 0 0 1 -1 0 0 1 0 0 0 -1 0
对应的密勒码为:
0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1
1 0 0 1 1 1 0 0 0 1 1 1 0 0 1 1 1 0 0 0
可以看出:编码结果完全正确!
2. 四种码形的功率谱
3. 不同概率‘0’下AMI码形功率谱变化
【程序代码】
figure
subplot(3,1,1)
plot(x_t(1:20*8))
axis([1,20*8,-1.5,1.5]);
title('initial code')
subplot(3,1,2)
plot(y_AMI(1:20*8))
axis([1,20*8,-1.5,1.5]);
title('AMI code')
subplot(3,1,3)
plot(y_HDB3(1:20*8))
axis([1,20*8,-1.5,1.5]);
title('HDB3 code')
figure
plot_spectrum(x_t,'b');
hold on
plot_spectrum(y_AMI,'r');
plot_spectrum(y_HDB3,'g');
title('Power spectrum of NRZ,AMI and HDB3 Code')
legend('NRZ','AMI','HDB3')
%Code.m
N=1000;
fs=8;
x=ceil(rand(1,N)-0.8);
AMI=AMI_Code(x);
HDB3=HDB3_Code(x);
Miller=Miller_Code(x);
y=zeros(1,N*fs);
x_t=zeros(1,N*fs);
y_AMI=zeros(1,N*fs);
y_HDB3=zeros(1,N*fs);
y_Miller=zeros(1,N*fs);
for i=1:N*fs
if(mod(i-1,8)<=5 & mod(i-1,8)>=2)
y(i)=1;
else
y(i)=0;
end
%分别给画图序列赋值
y_AMI(i)=y(i)*AMI(ceil(i/8));
y_HDB3(i)=y(i)*HDB3(ceil(i/8));
y_Miller(i)=Miller(ceil(i/4));
x_t(i)=x(ceil(i/8));
end
%AMI_Code.m
function AMI=AMI_Code(x)
m=length(x);
%初始化AMI编码
AMI=zeros(1,m);
%反转标志初始化
f=0;
for i=1:m
%若原码为0,直接将AMI码置0
if x(i)==0
AMI(i)=0;
%否则,使得AMI码交替为+1,-1
else
f=XOR(f,1);
AMI(i)=2*f-1;
end
end
return;
%HDB3.m
function HDB3=HDB3_Code(x)
m=length(x);
%初始化HDB3编码
HDB3=zeros(1,m);
%初始化信息“1”标志B和连0数标志V
B=-1;
V=-1;
i=1;
while (i<=m-3)
%若原码为1,交替为+1,-1
if(x(i)==1)
HDB3(i)=-1*B;
B=HDB3(i);
i=i+1;
else
%原码只有一个0
if(x(i+1)==1)
HDB3(i)=0;
HDB3(i+1)=-1*B;
B=HDB3(i+1);
i=i+2;
else
%原码有两个连续0
if(x(i+2)==1)
HDB3(i)=0;
HDB3(i+1)=0;
HDB3(i+2)=-1*B;
B=HDB3(i+2);
i=i+3;
else
%原码有三个连续0
if(x(i+2)==1)
HDB3(i)=0;
HDB3(i+1)=0;
HDB3(i+2)=0;
HDB3(i+3)=-1*B;
B=HDB3(i+3);
i=i+4;
%原码出现了四个连续0
else
%原始B、V标志不相同
if(Xor(B,V))
HDB3(i)=01;
HDB3(i+1)=0;
HDB3(i+2)=0;
HDB3(i+3)=B;
V=B;i=i+4;
%B、V标志相同
else
HDB3(i)=-1*B;
HDB3(i+1)=0;
HDB3(i+2)=0;
HDB3(i+3)=-1*B;
B=-1*B;V=B;i=i+4;
end
end
end
end
end
end
for j=i:m
if (x(j)==1)
HDB3(j)=-1*B;
B=HDB3(j);
else
HDB3(j)=0;
end
end
return;
%plot_spectrum.m
function plot_spectrum(x,str)
P=spectrum(x,8000,0,hanning(300));
plot(10*log10(P(:,1)),str);
return; function plot_spectrum(x,str)
P=spectrum(x,8000,0,hanning(300));
plot(10*log10(P(:,1)),str);
return;
第 9 页 共 9 页
展开阅读全文