实验二 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译码信号。
总结
本实验到这里就结束了,后续实验教程笔者会依次上传到本专栏中,实验过程中如有操作不当之处,欢迎留言指正。