clear all; % 清除所有变量
close all; % 关闭所有窗口
clc; % 清屏
%% 基本参数
M=20; % 产生码元数
L=100; % 每个码元采样次数
Ts=0.001; % 每个码元的宽度,即码元的持续时间为0.001秒
Rb=1/Ts; % 码元速率1kHz
dt=Ts/L; % 采样间隔
TotalT=M*Ts; % 总时间=码元数*每个码元持续时间
t=0:dt:TotalT-dt; % 时间
Fs=1/dt; % 采样间隔的倒数即采样频率.此处为100kHz
%% 产生单极性波形
code=randi([0,1],1,M); % 产生M个二进制随机码
% code=[0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1]; % 测试编码
%% HDB3编码
% Encode = [0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1]; % 测试编码
Encode = code; % 原二进制码
count = 0; % 用来记录连0 的个数
% 将四个连0用B00V取代
for i = 1:M
if(Encode(i) == 1)
count = 0; % 遇到1,连0的计数器清零
else
count = count + 1;
if count == 4 % 将四个连0(0000)转成取代节,2代表V,3代表B
Encode(i) = 2; % 将连0码转换为B00V取代节
Encode(i-3) = 3;
count = 0; % 计数器清零
end
end
end
count_1 = 0; % 计数V,B之间的1的个数
pV = 0; % 存储V的位置
pB = 0; % 存储B的位置
flagB = 1;
for i = 1:M
if (Encode(i) == 3) && (flagB == 1) %flagB的作用为仅对第一个B生效
Encode(i) = 0; % 将第一个B置0,避免干扰取代节选择
flagB = 0;
end
if Encode(i) == 2 % 找到前一个取代节的V
pV = i;
else if Encode(i) == 3 % 找到后一个取代节的B
pB = i;
end
end
if(pB > pV) % 判断取代节选择B00V还是000V
for j = pV+1 : pB-1 % 不要将B和V的值包含进去
count_1 = count_1 + Encode(j); % 计算两个传号之间1的个数
end
if mod(count_1 , 2) == 1 % 奇数个,B为0
Encode(pB) = 0; % 即使用000V作为取代节
else
Encode(pB) = 1; % 偶数个,B为1,仍使用B00V作为取代节
end
pV = 0;
pB = 0;
count_1 = 0; % 将变量归零,等待下一次找两个取代节的成功
end
end
even = 0; % 用来翻转1的极性
evenV = 0; % 用来翻转V的极性
for i = 1:M % 统一确定极性
if Encode(i) == 1
Encode(i) = -1; % 第一个1转成-1
break;
end
end
for i = 1:M
if Encode(i) == 1 % 将1的极性正负翻转
if even == 0
Encode(i) = 1;
else
Encode(i) = -1;
end
even = ~even;
else if Encode(i) == 2 % 将V的极性正负翻转,同时变回数值1
evenV = even; % 第一个V的极性与前一个非零符号相同
if evenV == 0
Encode(i) = -1;
else
Encode(i) = 1;
end
evenV = ~evenV;
end
end
end
%% 绘制波形
fz=ones(1,L); % 定义复制的次数L,L为每码元的采样点数
x1=code(fz,:); % 将原来code的第一行复制L次,称为L*M的矩阵
jidai=reshape(x1,1,L*M); % 产生单极性不归零矩形脉冲波形,将刚得到的L*M矩阵,
% 按列重新排列形成1*(L*M)的矩阵
x2=Encode(fz,:); % 将原来Encode的第一行复制L次,称为L*M的矩阵
x2(50:100,:)=0; % 将L*M的矩阵的后M/2行清零,形成半占空比波形
hdb3=reshape(x2,1,L*M); % 将刚得到的L*M矩阵,按列重新排列形成1*(L*M)的矩阵
figure(1); % 绘制第1幅图
subplot(311); % 窗口分割成3*1的,当前是第1个子图
plot(t,jidai,'LineWidth',2);% 绘制基带码元波形,线宽为2
title('基带信号波形'); % 标题
xlabel('时间/s'); % x轴标签
ylabel('幅度'); % y轴标签
axis([0,TotalT,-0.1,1.1]) % 坐标范围限制
subplot(312) % 窗口分割成3*1的,当前是第2个子图
plot(t,hdb3,'LineWidth',2); % 绘制HDB3的波形
title('HDB3信号波形') % 标题
xlabel('时间/s'); % x轴标签
ylabel('幅度'); % y轴标签
axis([0,TotalT,-1.1,1.1]); % 坐标范围限制
%% HDB3解码部分
Decode = Encode; % 输入HDB3码
count = 0;
for j = 1 : M
if Decode(j) == 0
count = count + 1;
if count == 3 % 若3连0前后非零脉冲同极性,则将最后一个非零元素译为零
if Decode(j + 1) * Decode(j - 3) == 1
Decode(j + 1) = 0;
end
end
if count == 2 % 若2连0前后非零脉冲极性相同,则两零前后都译为零
if Decode(j+1) * Decode(j-2) == 1
Decode(j - 2) = 0;
Decode(j + 1) = 0;
end
end
else
count = 0;
end
end
for n = 1 : M %极性变换
if Decode(n) == -1 %再将所有的-1变换成+1后,就可以得到原消息代码
Decode(n) = 1;
end
end
x3=Decode(fz,:); % 将原来Decode的第一行复制L次,称为L*M的矩阵
hdb3_jiema=reshape(x3,1,L*M);% 将刚得到的L*M矩阵,按列重新排列形成1*(L*M)的矩阵
subplot(313) % 窗口分割成3*1的,当前是第3个子图
plot(t,hdb3_jiema,'LineWidth',2); % 绘制经过解码后的信号
axis([0,TotalT,-0.1,1.1]); % 设置坐标范围
title('HDB3解码波形'); % 标题
xlabel('时间/s'); % x轴标签
ylabel('幅度'); % y轴标签
MATLABHDB3码的编码和解码
本文详细介绍了如何使用Matlab编程实现HDB3编码,包括产生单极性波形、进行HDB3编码处理(如替换连0和极性调整),以及随后的HDB3解码过程。通过实例展示了从随机二进制码到编码波形再到解码波形的完整流程。
摘要由CSDN通过智能技术生成