matlab实现二元码编码(单极性非归零码、双极性非归零码,单极性归零码、双极性归零码、传号差分码、空号差分码、数字双相码、密勒码、传号反转码)
目录
二元码基带信号的波形为矩形波,幅度取值只有两种电平,分别对应与二进制码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;
具体实现: