MATLABHDB3码的编码和解码

本文详细介绍了如何使用Matlab编程实现HDB3编码,包括产生单极性波形、进行HDB3编码处理(如替换连0和极性调整),以及随后的HDB3解码过程。通过实例展示了从随机二进制码到编码波形再到解码波形的完整流程。
摘要由CSDN通过智能技术生成
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轴标签

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值