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

您所在的位置:网站首页 matlab生成16进制随机序列 matlab实现二元码编码(单极性非归零码、双极性非归零码,单极性归零码、双极性归零码、传号差分码、空号差分码、数字双相码、密勒码、传号反转码)

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

2024-06-20 05:01| 来源: 网络整理| 查看: 265

       

目录

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;

具体实现:



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3