通信原理软件实验(2)

实验二 AMI和HDB3编码与译码

        本实验的目的是用MATLAB实现AMI码和HDB3码的编译码。其中AMI码的编码规则是将“1”变为“+1”和“-1”交替的序列,“0”不变,这样的编码方式虽然简单,但当基带出现连续的多个“0”时,AMI码中就不能提取出同步信号。

        由于AMI码存在这样的缺点,HDB3码就由此而来,虽然编码方式较为繁琐(这里附上知乎上一个介绍HDB3码编码方式的网址:链接),但是其译码却非常简单,只需在HDB3码中找到与前一个非零码极性相同的破坏码V,然后将其与之前面的三个码全部变成0,最后对整个序列取绝对值,即可得到原始序列。

        话不多说,直接上代码。

1.AMI编码与译码的实现

        实现此功能的代码如下:

close all;
clear all;
clc;
in = [1 0 0 0 0 1 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1];
num = 0;
len = length(in);
AMI = zeros(1, len); % AMI编码结果
for i = 1:len
	if in(i) == 1
        num = num+1;
        if num / 2 == fix(num / 2)
            AMI(i) = 1;
        else
            AMI(i) = -1;
        end
	end
end
decodeAMI = abs(AMI); % AMI译码结果
figure(1);
subplot(3, 1, 1);stairs([0:length(in) - 1], in);axis([0 length(in) -2 2]);
subplot(3, 1, 2);stairs([0:length(in) - 1],AMI);axis([0 length(in) -2 2]);
subplot(3, 1, 3);stairs([0:length(in) - 1],decodeAMI);axis([0 length(in) -2 2]);

        这里直接参考了实验指导书上的代码,做了一点微小的改动,该代码的思路就是在编码过程中对输入信号的“1”进行模为2的计数,将奇次的“1”变为“-1”,偶次的“1”变为“+1”。对编码结果取绝对值就得到译码结果。

        将这段代码复制进MATLAB脚本文件后便可直接运行,运行后生成的波形如下:

        最上方的图是输入信号,中间的图是AMI编码信号,最下方的图是AMI译码信号。

2.HDB3编码与译码的实现

        在上述代码后方添加如下代码段实现HDB3的编码和译码:

HDB3 = AMI; % HDB3编码结果
num = 0;
last1 = 0;
lastV = 0;
for i = 1:len
    if HDB3(i) == 0
        num = num + 1;
        if num == 4
            if lastV == last1
                HDB3(i) = -last1;
                HDB3(i - 3) = -last1;
            else
                HDB3(i) = last1;
            end
            lastV = HDB3(i);
            last1 = lastV;
            num = 0;
        end
    else
        if HDB3(i) == last1
            HDB3(i) = -last1;
        end
        last1 = HDB3(i);
        num = 0;
    end
end
decodeHDB3 = HDB3; % HDB3译码结果
last1 = 0;
for i = 1:len
    if decodeHDB3(i) ~= 0
        if decodeHDB3(i) == last1
            last1 = decodeHDB3(i);
            for j = 0:3
                decodeHDB3(i - j) = 0;
            end
        else
            last1 = decodeHDB3(i);
        end
    end
end
decodeHDB3 = abs(decodeHDB3);
figure(2);
subplot(3, 1, 1);stairs([0:length(in) - 1], in);axis([0 length(in) -2 2]);
subplot(3, 1, 2);stairs([0:length(in) - 1],HDB3);axis([0 length(in) -2 2]);
subplot(3, 1, 3);stairs([0:length(in) - 1],decodeHDB3);axis([0 length(in) -2 2]);

        该代码段是笔者拍脑袋写的,主要分为两个模块:HDB3的编码和HDB3的译码,先简单讲解一下实现的思路:

  • HDB3的编码

        该段代码利用了之前编好的AMI码,设置了两个新的变量last1和lastV,其中last1用于记录上一个非零数据的极性,lastV用于记录上一个破坏码V的极性。

        第5行到第26行的for循环就是对HDB3编码的具体实现,首先对整个输入数据进行遍历,出现0就将变量num的值+1,如果出现连续的4个0,num的值变为4,就进入第6行的if语句,根据变量last1和lastV的值对这连续4个0进行HDB3规则的编码,编码完成后更新last1和lastV的数据,同时将num置0。

        出现非0的数据就进入第19行的else语句,判断当前数据和变量last1的极性是否相反,如果不是相反就将它设置成相反,设置完成后更新last1的值并将num置0.

  • HDB3的译码

        第27行到第41行是对HDB3译码的具体实现,其中last1变量仍然是用于记录上一个非零数据的极性,第29行到第40行的for循环用于寻找HDB3码中的破坏码V,找到后将其和前面的3个数据全部置为0。随后对处理后的序列取绝对值就得到译码结果。

        将这段代码添加完成后运行就能得到如下结果:

        最上方的图是输入信号,中间的图是HDB3编码信号,最下方的图是HDB3译码信号。

总结

        本实验到这里就结束了,后续实验教程笔者会依次上传到本专栏中,实验过程中如有操作不当之处,欢迎留言指正。

  • 4
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值