matlab实现二元码编码(单极性非归零码、双极性非归零码,单极性归零码、双极性归零码、传号差分码、空号差分码、数字双相码、密勒码、传号反转码)

       

目录

1、单极性非归零码(NRZ码)

2、双极性非归零码

 3、单极性归零码(RZ)

4、双极性归零码

5、传号差分码

6、空号差分码

8、数字双向码

9、密勒码

10、传号反转码(CMI)

11、完整代码


        二元码基带信号的波形为矩形波,幅度取值只有两种电平,分别对应与二进制码1和0。接下来将介绍常用的二元码的编码方式以及对应的matlab代码。
        进行编码之前要先对要编码的二进制码进行定义:

% 定义二进制信码
code = [1 1 1 0 1 0 0 0 1 1 0 0 1 0];
% 创建时间轴数据
t = 0:0.5:(length(code)*100-1)*0.5;

length_t = length(t);
%查看t的长度
disp(length_t);

        其中,时间轴数据可以任意创建,但是要保证后期绘图时plot函数的前两个参数长度相等。

1、单极性非归零码(NRZ码)

        最简单最常用的码型,用高电平和低电平(常为零电平)两种取值表示二进制码1和0。即用高电平表示1,用低电平表示0。

% 单极性非归零码
NRZ = [];%存储单极性非归零码
for i = 1:length(code)
    if code(i) == 1
        %使用方括号拼接两个向量[]
        NRZ = [NRZ ones(1, 100)];%为了和t长度一样,一次的跨度也要为100
    else
        NRZ = [NRZ zeros(1, 100)];
    end
end

2、双极性非归零码

        用正电平和负电平分别表示1和0。与单极性归零码相比只是将0修改成-1.

% 双极性非归零码
polar_NRZ = [];
for i = 1:length(code)
    if code(i) == 1
        polar_NRZ = [polar_NRZ ones(1, 100)];
    else
        polar_NRZ = [polar_NRZ -1*ones(1, 100)];
    end
end

 3、单极性归零码(RZ)

        在发送1时,在整个码元期间。高电平只持续一段时间,其余时间归零,即返回到零电平,高电平与整个码元周期的比值叫做占空比。发送0时,则用零电平表示。
        假设占空比为50%

% 单极性归零码:1的时候分一半为0(归零),0的时候为0
RZ = [];
for i = 1:length(code)
    if code(i) == 1
        RZ = [RZ ones(1, 50) zeros(1, 50)];%从高电平到低电平过渡
    else
        RZ = [RZ zeros(1, 100)];
    end
end

4、双极性归零码

        用正极性的归零码和负极性的归零码分别用1和0表示。简单来说,1用10表示,0用-10表示。

% 双极性归零:在双极性非归零码的基础上,给1和-1均加入过渡值,即一半归零
polar_RZ = [];
for i = 1:length(code)
    if code(i) == 1
        polar_RZ = [polar_RZ ones(1, 50) zeros(1, 50)];
    else
        polar_RZ = [polar_RZ -1*ones(1, 50) zeros(1, 50)];
    end
end

5、传号差分码

        电平发生跳变用1表示,故需要定义前一个二元码的值才好进行比较

%传号差分码:波形跳变取值为1
NRZ_M = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i = 1:length(code)
    if code(i) == 1
        bit_value = xor(previous_bit, 1); % 当前位与前一位异或运算,相同为0,不同为1
    else
        bit_value = previous_bit;
    end
    NRZ_M = [NRZ_M ones(1, 100)*bit_value];
    
    previous_bit = bit_value; % 更新前一位比特的数值
end

6、空号差分码

        电平发生跳变用0表示,与传号差分码只有细微差别

% 空号差分码:波形跳变取值为0
NRZ_S = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i = 1:length(code)
    if code(i) == 1
        bit_value = previous_bit;
    else   
        bit_value = xor(previous_bit, 1); % 当前位与前一位异或运算
    end
    NRZ_S = [NRZ_S ones(1, 100)*bit_value];
    
    previous_bit = bit_value; % 更新前一位比特的数值
end

8、数字双向码

        用两位码表示想象中的一位码。一种规定是用10表示0,用01表示1

%数字双向码
manchester_code  = [];
for i = 1:length(code)
    if code(i) == 1
        manchester_code = [manchester_code -1*ones(1,50) ones(1,50)];
    else
        manchester_code = [manchester_code ones(1,50) -1*ones(1,50)];
    end
end

9、密勒码

        1用10和01交替表示。0有两种情况:单0时在码元间隔内不出现电平跃变,而且在与相邻码元的边界处也无跃变;出现连0时,在两个0的边界处出现电平跃变,即00与11交替。

        所以需要一个flag实现10和01交替表示,用计数变量count存储连0出现的次数,判断是否出现连0的情况。(在代码中,负电平表示0)

%密勒码
miler_code = [];
flag = 1;
count_0 = 0;%存储连0的个数
for i=1:length(code)
    if code(i) == 1
        count_0 = 0;%清空连0个数
        miler_code = [miler_code -1*flag*ones(1,50) flag*ones(1,50)]
        if flag == 1
            flag = -1;
        else
            flag = 1;
        end
    else  %等于0
        count_0 = count_0+1;
        if(count_0 < 2)%不连零的情况
            miler_code = [miler_code -flag*ones(1,100)]
        else%连零
            miler_code = [miler_code flag*ones(1,100)]
            flag = -flag;
        end
    end
end

10、传号反转码(CMI)

        1交替的用00和11表示,0固定的用01表示

%传号反转码
CMI=[];
flag = 1; % 初始极性为正
for i = 1:length(code)
    if code(i) == 1
        CMI = [CMI ones(1, 100)*flag];
       if flag==1
           flag=-1;
       else
           flag=1;
       end
    else
        CMI = [CMI ones(1, 50)*-1 ones(1, 50)]; % 0:交替极性
    end
end

11、完整代码

% 定义二进制信码
code = [1 1 1 0 1 0 0 0 1 1 0 0 1 0];
% 创建时间轴数据
t = 0:0.5:(length(code)*100-1)*0.5;

length_t = length(t);
%查看t的长度
disp(length_t);

% 单极性非归零码:1的时候为1,0的时候为0
NRZ = [];%存储单极性非归零码
for i = 1:length(code)
    if code(i) == 1
        %使用方括号拼接两个向量[]
        NRZ = [NRZ ones(1, 100)];%为了和t长度一样,一次的跨度也要为100
    else
        NRZ = [NRZ zeros(1, 100)];
    end
end

% 双极性非归零码:1的时候为1,0的时候为-1
polar_NRZ = [];
for i = 1:length(code)
    if code(i) == 1
        polar_NRZ = [polar_NRZ ones(1, 100)];
    else
        polar_NRZ = [polar_NRZ -1*ones(1, 100)];
    end
end

% 单极性归零码:1的时候分一半为0(归零),0的时候为0
RZ = [];
for i = 1:length(code)
    if code(i) == 1
        RZ = [RZ ones(1, 50) zeros(1, 50)];%从高电平到低电平过渡
    else
        RZ = [RZ zeros(1, 100)];
    end
end

% 双极性归零:在双极性非归零码的基础上,给1和-1均加入过渡值,即一半归零
polar_RZ = [];
for i = 1:length(code)
    if code(i) == 1
        polar_RZ = [polar_RZ ones(1, 50) zeros(1, 50)];
    else
        polar_RZ = [polar_RZ -1*ones(1, 50) zeros(1, 50)];
    end
end

%传号差分码:波形跳变取值为1
NRZ_M = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i = 1:length(code)
    if code(i) == 1
        bit_value = xor(previous_bit, 1); % 当前位与前一位异或运算,相同为0,不同为1
    else
        bit_value = previous_bit;
    end
    NRZ_M = [NRZ_M ones(1, 100)*bit_value];
    
    previous_bit = bit_value; % 更新前一位比特的数值
end


% 空号差分码:波形跳变取值为0
NRZ_S = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i = 1:length(code)
    if code(i) == 1
        bit_value = previous_bit;
    else   
        bit_value = xor(previous_bit, 1); % 当前位与前一位异或运算
    end
    NRZ_S = [NRZ_S ones(1, 100)*bit_value];
    
    previous_bit = bit_value; % 更新前一位比特的数值
end

%数字双向码
%0:用10表示;1:用01表示
manchester_code  = [];
for i = 1:length(code)
    if code(i) == 1
        manchester_code = [manchester_code -1*ones(1,50) ones(1,50)];
    else
        manchester_code = [manchester_code ones(1,50) -1*ones(1,50)];
    end
end


%密勒码
miler_code = [];
flag = 1;
count_0 = 0;%存储连0的个数
for i=1:length(code)
    if code(i) == 1
        count_0 = 0;%清空连0个数
        miler_code = [miler_code -1*flag*ones(1,50) flag*ones(1,50)]
        if flag == 1
            flag = -1;
        else
            flag = 1;
        end
    else  %等于0
        count_0 = count_0+1;
        if(count_0 < 2)%不连零的情况
            miler_code = [miler_code -flag*ones(1,100)]
        else%连零
            miler_code = [miler_code flag*ones(1,100)]
            flag = -flag;
        end
    end
end
            

%传号反转码
%1交替的用00和11表示,0固定用01表示
CMI=[];
flag = 1; % 初始极性为正
for i = 1:length(code)
    if code(i) == 1
        CMI = [CMI ones(1, 100)*flag];
       if flag==1
           flag=-1;
       else
           flag=1;
       end
    else
        CMI = [CMI ones(1, 50)*-1 ones(1, 50)]; % 0:交替极性
    end
end

figure(1)
subplot(9,1,1)
plot(t, NRZ, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -0.5 1.5])
title('单极性非归零码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,2)
plot(t, polar_NRZ, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1.5 1.5])
title('双极性非归零码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,3)
plot(t, RZ, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -0.5 1.5])
title('单极性归零码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,4)
plot(t, polar_RZ, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1.5 1.5])
title('双极性归零码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,5)
plot(t, NRZ_M, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -0.5 1.5])
title('传号差分码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,6)
plot(t, NRZ_S, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('空号差分码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,7)
plot(t, manchester_code, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('数字双相码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,8)
plot(t, miler_code, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('密勒码')
xlabel('时间')
ylabel('幅度')
grid on;

subplot(9,1,9)
plot(t, CMI, 'LineWidth', 2)
axis([0 (length(code)*100-1)*0.5 -1 1.5])
title('传号反转码')
xlabel('时间')
ylabel('幅度')
grid on;

具体实现:

  • 7
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MATLAB语音编码是指使用MATLAB软件对语音信号进行压缩或加密处理的过程。语音编码的目的是减小语音信号的数据量,同时尽可能保持语音质量。MATLAB提供了一系列算法和函数,用于实现不同的语音编码技术。 常见的MATLAB语音编码技术包括线性预测编码(LPC)、自适应差分脉冲编码调制(ADPCM)、自适应编码/解器(ACELP)等。这些技术通过对语音信号进行数学建模和压缩处理,可以达到较高的压缩比和保真度。 在MATLAB中,可以使用MATLAB语音处理工具箱提供的函数和工具,例如lpc函数实现LPC编码,adhocde函数实现ADPCM编码,vocoder函数实现ACELP编码等。通过调用这些函数和工具,可以对语音信号进行编码和解处理。 使用MATLAB进行语音编码的主要步骤包括:首先,对语音信号进行预处理,例如去除静音段、分帧、加窗等;然后,选择合适的编码算法和参数,对分帧后的语音信号进行编码;最后,将编码后的数据恢复为原始语音信号,可以进行解和播放。 MATLAB语音编码在语音通信、语音压缩等领域有广泛的应用。通过合理选择编码算法和参数,可以实现在保持较低数据传输率的同时,保证语音质量。同时,使用MATLAB进行语音编码也可以进行语音加密处理,保护语音信息的安全性。 总之,MATLAB语音编码是一种将语音信号进行压缩或加密处理的技术,通过使用MATLAB提供的函数和工具实现。它在语音通信、语音压缩以及语音加密等领域具有广泛的应用前景。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Flying778

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

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

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

打赏作者

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

抵扣说明:

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

余额充值