在数字基带传输中,传输码的码型选择有以下几条原则:
(1)不含直流,且低频分量尽量少;
(2)应含有丰富的定时信息,以便于从接收码流中提取定时信号;
(3)功率谱主瓣宽度窄,以节省传输频带;
(4)不受信息源统计特性的影响,即能适应于信息源的变化;
(5)具有内在的检错能力,即码型具有一定的规律性,以便利用这一规律性进行宏观监测;
(6)编译码简单,以降低通信延时和成本。
本篇文章将介绍AMI码和HDB3码以及提供相应的MATLAB仿真代码。
一、AMI码
AMI(Alternative Mark Inversion)码的全称是传号交替反转码,其编码规则是将消息码的“1”(传号)地交替变换为“+1”和“-1”,而“0”(空号)保持不变。例如:
消息码:0 1 1 0 0 0 0 0 0 0 1 1 0 0 1 1
AMI码: 0 -1 +1 0 0 0 0 0 0 0 -1 +1 0 0 -1 +1
优点:没有直流成分,且高、低频分量少,能量集中在频率为1/2码速处;编解码电路简单,且可利用传号交替这一规律观察误码情况;如果它是AMI-RZ波形,接收后只要全波整流,就可变为单极性RZ波形,从中可以提取位定时分量。鉴于上述优点,AMI码成为较常用的传输码型之一。
缺点:当原信码出现长连“0”串时,信号的电平长时间不跳变,造成提取定时信号的困难。解决连“0”码问题的有效方法之一就是采用HDB3码。
以下是AMI码仿真。
clc;
clear all;
data_i = [1 0 1 0 1 0 1 1 0 0 0 0 1 0 0 0];
data_o = zeros(1,16);
cnt_oddoreven = 0;
for i = 1 : 16
if data_i(i) == 1
cnt_oddoreven = cnt_oddoreven + 1;
else if data_i(i) == 0
data_o(i) = 0;
end
end
if mod(cnt_oddoreven,2) == 0 && data_i(i) == 1
data_o(i) = 1;
else if mod(cnt_oddoreven,2) == 1 && data_i(i) == 1
data_o(i) = -1;
end
end
end
二、HDB3码
HDB3码的全称是三阶高密度双极性码。它是AMI码的一种改进型,改进目的是为了保持AMI的优点而克服其缺点,使连“0”个数不超过三个。其编码规则如下:
(1)先检查消息码的连“0”个数,当连“0”数目小于等于3时,则与AMI码的编码规则一样。
(2)当连“0”数目超过3个时,则将每4个连“0”化作一小节,用“000V”替代。V(取值+1或-1)应与其前一个相邻的非“0”脉冲的极性相同(因为这破坏了极性交替原则,所以V称为破坏脉冲)。
(3)相邻的V码极性必须交替。当V码取之能满足(2)中的要求但不能满足此要求时,则将“0000”用“B00V”代替。B的取值和V脉冲相同,用于解决此问题,所以B被称为调节脉冲。
(4)V码后面的传号码极性也要交替。例如:
消息码: 1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1
AMI码: -1 0 0 0 0 +1 0 0 0 0 -1 +1 0 0 0 0 0 0 0 0 -1 +1
HDB3码:-1 0 0 0 -V +1 0 0 0 +V -1 +1 -B 0 0 -V +B 0 0 +V -1 +1
其中,V和B的脉冲都和+1和-1相同。
HDB3码除了具有AMI的优点外,同时还将连“0”码限制在3个以内,使得接收时能保证定时信息的提取。因此,HDB3码是我国和欧洲等国家应用最为广泛的码型,A律PCM四次群以下的接口码型均为HDB3码。
clc;
clear all;
data_i = [1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 0 0 0 0 1 1];
data_o = zeros(1,22);
cnt_oddoreven = 0;%AMI码所需奇偶计数器
cnt_zeros = 0;%0计数
zeros_reg = zeros(1,4); %临时存放分组的4个0
V_signplus_flag = 0;
V_signminus_flag = 0;
%%先对信息序列做AMI编码
for i = 1 : 22
if data_i(i) == 1
cnt_oddoreven = cnt_oddoreven + 1;
else if data_i(i) == 0
data_o(i) = 0;
end
end
if mod(cnt_oddoreven,2) == 0 && data_i(i) == 1
data_o(i) = 1;
else if mod(cnt_oddoreven,2) == 1 && data_i(i) == 1
data_o(i) = -1;
end
end
end
%对AMI码进行连0的处理,需要将当前位和前一位比较,循环从第二位开始
for n = 2 :22
if data_o(n) || data_o(n-1) == 0
cnt_zeros = cnt_zeros + 1;
else
cnt_zeros = 0;
end
if cnt_zeros == 3
if data_o(n-4) < 0
data_o(n) = -2 ; %将理论中连0最后的V赋值为2或者-2方便后续检查V的极性是否交替,此时符号由前一个有符号正负1决定
else
data_o(n) = 2;
end
end
end
%检查V的极性是否交替,若出现一个2,则V_signplus_flag加1,且V_signminus_flag清0,出现一个-2,V_signminus_flag减1,且V_signplus_flag清0。
%理论上标志位不该出现绝对值大于1的情况,若出现说明V的极性没有交替,此时将V取反,并将000V中的第一个0取为和V极性相同的1,之后将计数器清0
for m = 1: 22
if data_o(m) == 2
V_signplus_flag = V_signplus_flag + 1;
V_signminus_flag = 0;
if V_signplus_flag == 2
data_o(m) = -2;
data_o(m-3) = -1;
V_signplus_flag = 0;
end
else if data_o(m) == -2
V_signminus_flag = V_signminus_flag - 1;
V_signplus_flag = 0;
if V_sign_flag == -2
data_o(m) = 2;
data_o(m-3) = 1;
V_signminus_flag = 0;
end
end
%最后将所有码字变为1
for i = 1: 22
if data_o(i) == 2
data_o(i) = 1;
else if data_o(i) == -2
data_o(i) = -1
end
end
end