1、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码的功率谱变化情况; 【基本思路】 采用调用
2、子函数的方法,在掌握了各种码的编码规律之后实现编码功能。具体实现了AMI码、HDB3码以及密勒码的编码。而且调用了功率谱函数spectrum对各种码的功率谱以及不同信源概率下的功率谱进行了比较。下面就详细介绍各种码形的变换思路: 1. AMI码 AMI码中信息码“0”对应着三元码序列中的“0”,信息码“1”则交替地变换为“+1”和“-1”的归零码。 2. HDB3码 在AMI码的基础上,当出现多于3个零的情况,利用其检错能力,使用异常代替长连零,以平衡码中的极性使得直流分量为0。 3. 密勒码 密勒码中使用码元周期中点的跳变来代表“1”,当出现连续的“0”时出现电平跳变,否
3、则码元周期内不出现跳变。 【程序清单】 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)码的波形即为原始的
4、序列信息码 对应的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
5、 可以看出:编码结果完全正确! 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
6、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
7、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)*
8、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; %否则,
9、使得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*
10、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; HD
11、B3(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(
12、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(
13、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;
14、 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 页






