AMI码和HDB3码仿真(MATLAB) 您所在的位置:网站首页 ami码怎么画图 AMI码和HDB3码仿真(MATLAB)

AMI码和HDB3码仿真(MATLAB)

2024-06-12 09:47| 来源: 网络整理| 查看: 265

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

(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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有