MATLAB设计通信原理基带传输的常用码型AMI和HDB3

您所在的位置:网站首页 matlab码型变换 MATLAB设计通信原理基带传输的常用码型AMI和HDB3

MATLAB设计通信原理基带传输的常用码型AMI和HDB3

2024-06-18 10:15| 来源: 网络整理| 查看: 265

实验内容

采用MATLAB产生长度为16位的随机二进制序列进行HDB3编码和解码,并打印出原始码元、HDB3编码、解码波形。

先用seq = randi([0, 1], 1, 16)生成16位的随机二进制序列,再进行AMI编码得到AMI,在AMI编码的基础上判断0的个数和非0元素的极性,进行HDB3的编码。解码过程是先把HDB3解码为AMI,再通过decode = abs(decode);解码为原始二进制序列。流程如图1所示。

098860c3b2a74551af41fdd162f5d968.png

 1.AMI

将消息码的“1”(传号)交替地变换为“+1”和“-1”,而“0”(空号)保持不变。

例如:消息码:0  1  1  0  0  0  0  0  0  0  1  1  0  0  1……

         AMI码:0  -1 +1  0  0  0  0  0  0  0 -1 +1  0  0 -1……

AMI码对应的波形是具有正、负、零三种电平的脉冲序列。

%% AMI部分 seq = randi([0, 1], 1, 16);% 生成随机二进制序列 % AMI码 polarity = 1; % 初始符号 AMI=zeros(1,length(seq)); % 初始化 for i = 1:length(seq) if seq(i) == 1 polarity = -polarity; AMI(i) = polarity; end end 2.HDB3

HDB3是AMI码的一种改进型,使连“0”个数不超过三个。

(1)检查消息码中“0”的个数。当连“0”数目小于等于3时HDB码与AMI码一样,+1与-1交替;

(2)当连“0”数目超过3个时,将每4个连“0”化作一小节定义为 BOOV,称为破坏节,其中V称为破坏脉冲,而B称为调节脉冲;

(3)V与前一个相邻的非“0”脉冲的极性相同,并且要求相邻的V码之间极性必须交替。V的取值为+1或-1;

(4)B的取值可选0+1或-1,以使V同时满足(3)中的两个要求

(5)V码后面的传号码极性也要交替。

2d9fcb4f829a41488d365a95c2664be6.png

%% HDB3 count=0; % 连0计数器初始化 HDB3=AMI; % HDB3初始化 sign=0; % 极性标志初始化为0 V=zeros(1,length(AMI)); % V脉冲位置记录变量 B=zeros(1,length(AMI)); % B脉冲位置记录变量 for i = 1:length(AMI) if AMI(i) == 0 count = count + 1; %连0个数 if count == 4 % 如果4连0 count = 0; % 计数器清0 if i==4 %前四位都为0 HDB3(1:4)=[1 0 0 1]; else %先让0000--0001或者000-1 HDB3(i)=1*HDB3(i-4); end V(i)=HDB3(i); % V脉冲位置记录 if HDB3(i)==sign % 如果当前V符号与前一个V符号极性相同 HDB3(i)=-1*HDB3(i); % 进行V符号反转 HDB3(i-3)=HDB3(i); % 添加B符号,与V符号同极性 B(i-3)=HDB3(i); % B脉冲位置记录 V(i)=HDB3(i); % V脉冲位置记录 HDB3(i+1:length(AMI))=-1*HDB3(i+1:length(AMI)); %让后面的符号重新交替变化 end sign=HDB3(i);%记录前一个V符号的极性 end else % AMI(i) == 1或-1 count=0; end end 3.解码

遇到与前面相同的级数,将其和之前的3位(共4位)清零。

input=HDB3; % HDB3码输入 decode=input; % 解码初始化 sign=0; % 极性标志初始化 for i=1:length(HDB3) if input(i)~=0 if sign==HDB3(i) % 当前码与前一个非零码的极性相同 decode(i-3:i)=[0 0 0 0]; % 则判断该码为V码,将B00V清0 end sign=input(i); if input(i) == -1 decode(i) = 1; end end end decode = abs(decode); % AMI解码 整体代码 % seq=[1 0 0 1 0 0 0 0 0 0 0 0]; seq = randi([0, 1], 1, 16);% 生成随机二进制序列 %% 编码 % AMI码 polarity = 1; % 初始符号为负 AMI=zeros(1,length(seq)); % 初始化 for i = 1:length(seq) if seq(i) == 1 polarity = -polarity; AMI(i) = polarity; end end % HDB3码,在AMI的基础上 count=0; % 连0计数器初始化 HDB3=AMI; % HDB3初始化 sign=0; % 极性标志初始化为0 V=zeros(1,length(AMI)); % V脉冲位置记录变量 B=zeros(1,length(AMI)); % B脉冲位置记录变量 for i = 1:length(AMI) if AMI(i) == 0 count = count + 1; % 连0个数计数 if count == 4 % 如果4连0 count = 0; % 计数器清0 if i==4 % 特殊情况:前四位都为0 HDB3(1:4)=[1 0 0 1]; else %否则,先让0000--0001或者000-1 HDB3(i)=1*HDB3(i-4); end V(i)=HDB3(i); % V脉冲位置记录 if HDB3(i)==sign % 如果当前V符号与前一个V符号极性相同 HDB3(i)=-1*HDB3(i); % 进行V符号反转 HDB3(i-3)=HDB3(i); % 添加B符号,与V符号同极性 B(i-3)=HDB3(i); % B脉冲位置记录 V(i)=HDB3(i); % V脉冲位置记录 HDB3(i+1:length(AMI))=-1*HDB3(i+1:length(AMI));%让后面的符号重新交替变化 end sign=HDB3(i);%记录前一个V符号的极性 end else % AMI(i) == 1或-1 count=0; end end fprintf('原始码元: %s\n', num2str(seq)); fprintf('AMI码元: %s\n', num2str(AMI)); fprintf('HDB3码元: %s\n', num2str(HDB3)); %% 解码 input=HDB3; % HDB3码输入 decode=input; % 解码初始化 sign=0; % 极性标志初始化 for i=1:length(HDB3) if input(i)~=0 if sign==HDB3(i) % 当前码与前一个非零码的极性相同 decode(i-3:i)=[0 0 0 0]; % 则判断该码为V码,将B00V清0 end sign=input(i); if input(i) == -1 decode(i) = 1; end end end decode = abs(decode); fprintf('解码码元: %s\n', num2str(decode)); %% 绘制波形 subplot(4,1,1); stairs(0:length(seq)-1,seq); ylim([-2,2]); title('原码'); subplot(4,1,2); stairs(0:length(seq)-1,AMI); ylim([-2,2]); title('AMI'); subplot(4,1,3); stairs(0:length(seq)-1,HDB3); ylim([-2,2]); title('HDB3'); subplot(4,1,4); stairs(0:length(seq)-1,decode); ylim([-2,2]); title('解码'); 实验结果

原始码元: 1  0  0  1  0  0  0  0  0  0  0  1  1  1  0  1

AMI码元: -1  0  0  1  0  0  0  0  0  0  0 -1  1 -1  0  1

HDB码元: -1  0  0  1  0  0  0  1  0  0  0 -1  1 -1  0  1

                -1  0  0  1  0  0  0  V  0  0  0  -1  1  -1  0  1

解码码元: 1  0  0  1  0  0  0  0  0  0  0  1  1  1  0  1

3747f112accc4851a020ecdb899a61ba.png

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3