matlab实现二元码解码(单极性非归零码、双极性非归零码,单极性归零码、双极性归零码、传号差分码、空号差分码、数字双相码、密勒码、传号反转码)
目录
之前已经实现用matlab实现二元码编码
matlab实现二元码编码(单极性非归零码、双极性非归零码,单极性归零码、双极性归零码、传号差分码、空号差分码、数字双相码、密勒码、传号反转码)_Flying778的博客-CSDN博客
现在实现用matlab解码。解码比编码简单很多,解码的前提是先编码。
由于编码的跨度为100,解码的时候for循环也往往是以100为跨度。
1、单极性非归零码解码
直接解码即可,遇1解1,遇0解0。
% 单极性非归零码: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解码为0
decode_NRZ = [];
for i = 1:100:length(NRZ)
if NRZ(i) == 0
decode_NRZ = [decode_NRZ 0];
else
decode_NRZ = [decode_NRZ 1];
end
end
2、双极性非归零码
与单极性非归零码解码类似,1解码为1,-1解码为0。
% 双极性非归零码: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解码为1,-1解码为0
decode_polar_NRZ = [];
for i = 1:100:length(polar_NRZ)
if polar_NRZ(i) == -1
decode_polar_NRZ = [decode_polar_NRZ 0];
else
decode_polar_NRZ = [decode_polar_NRZ 1];
end
end
3、单极性归零码
每100第一个元素与单极性非归零码相同
% 单极性归零码: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
%解码
decode_RZ = [];
for i=1:100:length(RZ)
if RZ(i) == 1
decode_RZ = [decode_RZ 1]
else
decode_RZ = [decode_RZ 0]
end
end
4、双极性归零码
% 双极性归零:在双极性非归零码的基础上,给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
%解码
decode_polar_RZ = []
for i= 1:100:length(polar_RZ)
if polar_RZ(i) == 1
decode_polar_RZ = [decode_polar_RZ 1]
else
decode_polar_RZ = [decode_polar_RZ 0]
end
end
5、传号差分码
设变量previous_bit表示前一码元的值,NRZ_M(i)与前一位码元相同为0,否则为1.
%传号差分码:波形跳变取值为1
NRZ_M = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i = 1:length(code)
if code(i) == previous_bit
bit_value = 0; % 当前位与前一位异或运算,相同为0,不同为1
else
bit_value = 1;
end
NRZ_M = [NRZ_M ones(1, 100)*bit_value];
previous_bit = bit_value; % 更新前一位比特的数值
end
%解码
decoded_NRZ_M = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i=1:100:length(NRZ_M)
if NRZ_M(i) == previous_bit
decoded_NRZ_M = [decoded_NRZ_M 0]
else
decoded_NRZ_M = [decoded_NRZ_M 1]
end
previous_bit = NRZ_M( i )
end
6、空号差分码
与传号差分码类似,只是波形跳变为0。
% 空号差分码:波形跳变取值为0
NRZ_S = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i = 1:length(code)
if code(i) == previous_bit
bit_value = 1;
else
bit_value = 0; % 当前位与前一位异或运算
end
NRZ_S = [NRZ_S ones(1, 100)*bit_value];
previous_bit = bit_value; % 更新前一位比特的数值
end
%解码
decoded_NRZ_S = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i=1:100:length(NRZ_S)
if NRZ_S(i) == previous_bit
decoded_NRZ_S = [decoded_NRZ_S 1]
else
decoded_NRZ_S = [decoded_NRZ_S 0]
end
previous_bit = NRZ_S( i )
end
7、数字双向码
以100为跨度,判断第一位元素即可
%数字双向码
%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
%解码
decode_manchester_code = [];
for i = 1:100:length(manchester_code)
if manchester_code(i) == 1
decode_manchester_code = [decode_manchester_code 0]
else
decode_manchester_code =[decode_manchester_code 1]
end
end
7、密勒码
100周期内,码元全部相同为0,否则为1。
%密勒码
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
%密勒码解码
decode_miler_code = []
for i=1:100:length(miler_code)
if miler_code(i+49) == miler_code(i+99)
decode_miler_code = [decode_miler_code 0]
else
decode_miler_code = [decode_miler_code 1]
end
end
8、传号反转码
与密勒码解码规则相同。
%传号反转码
%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
%解码
decode_CMI = []
for i = 1:100:length(CMI)
if CMI(i+49) * CMI(i+99) == -1
decode_CMI = [decode_CMI 0]
else
decode_CMI = [decode_CMI 1]
end
end
9、实现效果
10、完整代码
clc
clear
% 定义二进制信码
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;
% 单极性非归零码: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解码为0
decode_NRZ = [];
for i = 1:100:length(NRZ)
if NRZ(i) == 0
decode_NRZ = [decode_NRZ 0];
else
decode_NRZ = [decode_NRZ 1];
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解码为1,-1解码为0
decode_polar_NRZ = [];
for i = 1:100:length(polar_NRZ)
if polar_NRZ(i) == -1
decode_polar_NRZ = [decode_polar_NRZ 0];
else
decode_polar_NRZ = [decode_polar_NRZ 1];
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
%解码,不管是否归零,以100为跨度,只看第一个
decode_RZ = [];
for i=1:100:length(RZ)
if RZ(i) == 1
decode_RZ = [decode_RZ 1]
else
decode_RZ = [decode_RZ 0]
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
%解码
decode_polar_RZ = []
for i= 1:100:length(polar_RZ)
if polar_RZ(i) == 1
decode_polar_RZ = [decode_polar_RZ 1]
else
decode_polar_RZ = [decode_polar_RZ 0]
end
end
%******************************************************************************
%传号差分码:波形跳变取值为1
NRZ_M = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i = 1:length(code)
if code(i) == previous_bit
bit_value = 0; % 当前位与前一位异或运算,相同为0,不同为1
else
bit_value = 1;
end
NRZ_M = [NRZ_M ones(1, 100)*bit_value];
previous_bit = bit_value; % 更新前一位比特的数值
end
%解码
decoded_NRZ_M = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i=1:100:length(NRZ_M)
if NRZ_M(i) == previous_bit
decoded_NRZ_M = [decoded_NRZ_M 0]
else
decoded_NRZ_M = [decoded_NRZ_M 1]
end
previous_bit = NRZ_M( i )
end
%******************************************************************************
% 空号差分码:波形跳变取值为0
NRZ_S = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i = 1:length(code)
if code(i) == previous_bit
bit_value = 1;
else
bit_value = 0; % 当前位与前一位异或运算
end
NRZ_S = [NRZ_S ones(1, 100)*bit_value];
previous_bit = bit_value; % 更新前一位比特的数值
end
%解码
decoded_NRZ_S = [];
previous_bit = 0; % 初始值为0,用于表示前一个比特的数值
for i=1:100:length(NRZ_S)
if NRZ_S(i) == previous_bit
decoded_NRZ_S = [decoded_NRZ_S 1]
else
decoded_NRZ_S = [decoded_NRZ_S 0]
end
previous_bit = NRZ_S( i )
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
%解码
decode_manchester_code = [];
for i = 1:100:length(manchester_code)
if manchester_code(i) == 1
decode_manchester_code = [decode_manchester_code 0]
else
decode_manchester_code =[decode_manchester_code 1]
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
%密勒码解码
decode_miler_code = []
for i=1:100:length(miler_code)
if miler_code(i+49) == miler_code(i+99)
decode_miler_code = [decode_miler_code 0]
else
decode_miler_code = [decode_miler_code 1]
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
%传号反转码解码
decode_CMI = []
for i = 1:100:length(CMI)
if CMI(i+49) * CMI(i+99) == -1
decode_CMI = [decode_CMI 0]
else
decode_CMI = [decode_CMI 1]
end
end
disp("源码:")
disp(code)
disp("单极性非归零码解码")
disp(decode_NRZ)
disp("双极性非归零码解码")
disp(decode_polar_NRZ)
disp("单极性归零码解码")
disp(decode_RZ)
disp("双极性归零码解码")
disp(decode_polar_RZ)
disp("传号差分码解码")
disp(decoded_NRZ_M);
disp("空号差分码解码")
disp(decoded_NRZ_S)
disp("数字双相码解码")
disp(decode_manchester_code)
disp("密勒码解码")
disp(decode_miler_code)
disp("传号反转码解码")
disp(decode_CMI)