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

实验内容

采用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

 

  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南崔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值