AMI码和HDB3码仿真(MATLAB)

        在数字基带传输中,传输码的码型选择有以下几条原则:

(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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值