使用Matlab绘制四种基本的信源编码格式
序言
本人小白一枚,这也是本人的第一篇博客,希望大家可以多多交流。这篇文章是学习物联网课程时老师布置的一个作业:要求输入一个二进制字符串,同时输出NRZ编码、曼彻斯特编码、DBP编码、PIE编码四种编码的方波图。
考虑到图像绘制的方便性,我是在MATLAB编译环境下进行代码编写和调试的。
正文
本次作业代码的核心部分只有两个:解码和图像绘制。解码就是根据各个编码的原理将输入的二进制字符串转换成表示高低电平的二进制数值数组(0代表低电平“0”,1代表高电平“1”);图像绘制主要是通过MATLAB中的“plot”函数将转换后的二进制数组绘制成方波图。本次作业的 高电平为“1”,低电平为“0”,周期 T 为 1 。
四种经典编码格式
反向不归零编码(NRZ编码)
NRZ编码解码原理: 用高电平表示二进制的 1 ,用低电平表示二进制的0 ,而实际上图形中高电平为“1”,低电平为“0”,故输入的字符串的数值与图形中的数值一一对应。
曼彻斯特编码(Manchester编码)
曼彻斯特编码解码原理: 曼彻斯特编码中,0 和 1 用来表示电平的跳变。输入中的 1表示下降沿,在一个周期 T中由“1”跳变到“0”;输入中的0表示上升沿,在一个周期 T中由“0”跳变到“1”。因此,输入中的 1 表示图像(输出)中的“10”,输入中的 0 表示图像(输出)中的“01”。
差动双向编码(DBP编码)
DBP编码解码原理: 在半个比特周期中的任意的边沿表示二进制“0”,而没有边沿就是二进制“1”。此外在每个比特周期开始时,电平都要反相。因此DBP的解码除了与输入的数值有关,还与前一周期的图像的高低电平状态有关。
PIE编码
PIE编码解码原理: PIE编码符号有4个,分别是数据0、数据1、数据帧开始SOF和数据帧结束EOF。每个符号的解码有固定的标准,如下图1所示。PIE解码有点类似于数据帧,每段编码前必定有数据开始标志SOF,我们输入的二进制字符串相当于数据,之后必定有数据结束标志EOF。
模块说明
- 字符输入模块
说明: 定义输入字符串变量input;array是将字符串变量转换后的数值数组,用于之后的循环判断。
- NRZ编码解码及图像绘制
说明: 根据上面的原理说明可知,输入的字符串的数值与图形中的数值一一对应,故不用对输入进行处理,只需考虑图像绘制。plot函数是根据输入的坐标x和y在窗口上绘制对应的坐标点。而方波图在边沿(下降沿和上升沿)处是两个坐标,且
x
x
x 坐标相等;在持续电平中(高、低电平)也是两个坐标,且
y
y
y 坐标相等。例如输入10110,则输出的
x
x
x 坐标数组为[1 2 2 3 3 4 4 5 5 6],输出的
y
y
y 坐标为[1 1 0 0 1 1 1 1 0 0]。在程序中
x
1
x1
x1 ,
y
1
y1
y1 就是通过上述的原理将原来的坐标扩展成一个
2
∗
l
e
n
g
t
h
(
i
n
p
u
t
)
2*length(input)
2∗length(input)(输入字符串长度)的数组,
x
2
x2
x2,
y
2
y2
y2 是输出
x
1
x1
x1 和
y
1
y1
y1 的值。
注: x 2 = x 1 ( : ) x2=x1(:) x2=x1(:) 是根据 x 1 x1 x1 循环赋值的顺序给 x 2 x2 x2 数值,虽然 x 1 x1 x1 是一个 2 ∗ l e n g t h ( i n p u t ) 2*length(input) 2∗length(input)(输入字符串长度)的数组,但是赋值的顺序是先 “ x ” “x” “x” 后 “ x ( 2 : e n d ) , x ( e n d ) + 1 ” “x(2:end),x(end)+1” “x(2:end),x(end)+1”,是数组的元素依次赋给 x 1 x1 x1 而不是整个数组赋给 x 1 x1 x1(顺序: x ( 1 ) ; x ( 2 ) , x ( 2 ) ; x ( 3 ) . . . x ( e n d ) ; x ( e n d ) + 1 x(1);x(2),x(2);x(3) ... x(end);x(end)+1 x(1);x(2),x(2);x(3)...x(end);x(end)+1)。 y 2 y2 y2 同理。
之后的绘图原理同上,除不同外,其与不再赘述。
- 曼彻斯特编码解码及图像绘制
说明: 由于输入中的 1 表示图像中的“10”,输入中的 0 表示图像中的“01”,故解码后的二进制码长度变成之前的两倍,即定义的MCoutput为原来字符串的2倍。由于判断次数与输入的二进制字符串长度一样,而每次判断指针都要移两位,故我将循环的范围扩大两倍且每次循环的步进数变成2,这样就避免了之前判断的值被之后判断的值覆盖。图像绘制如NRZ所示,只是不同的是边沿触发是在半个周期内完成的,故我将步进数改成了0.5。
- DBP编码解码及图像绘制
说明: DBP编码与前一个时刻的电平状态有关,故我定义了DBPoutput使用了randint函数(后续版本randint函数被删除,改用randi,使用方法可以用help查看),让其随机生成一个元素只有0,1的数组,以第一个元素为判断标准,依次修改之后的值。这样后面会多出一个数值,只需将其删除即可。由于其随机性,故每次输出的图像可能不一样,取决于第一个元素是0还是1。绘制图像除了步进数为0.5外,其余与NRZ编码绘图原理相同。
- PIE编码解码及图像绘制
说明: PIE编码由于0和1代表的电平图长度不一样,故引用了MATLAB中的胞元数组cell(可以理解为字符串数组),这里的PIEoutput要先预留第一位和最后一位由于输入SOF和EOF。num是用来记录周期数Tari的,方便之后的绘图。绘制图像除了步进数为0.5外,其余与NRZ编码绘图原理相同。
MATLAB代码
function IOT( input )
%IOT 输入一个二进制字符串,输出四种编码的电平图
%% 定义输入字符
char input;
array = input-'0'; %将字符串转换成数值数组
%% NRZ编码图像绘制
x=1:length(input);
x1=[x;x(2:end),x(end)+1];
x2=x1(:);
y1=[array;array];
y2=y1(:);
figure(1)
plot(x2,y2);
ylim([0,2]);
title('NRZ编码输出图像')
%% 曼彻斯特编码解码
MCoutput=zeros(1,2.*length(input));
for i=2:2:2*length(input)
if array(i./2)==1
MCoutput(i-1)=1;
MCoutput(i)=0;
else if array(i./2)==0
MCoutput(i-1)=0;
MCoutput(i)=1;
end
end
end
MCoutput
%% 曼彻斯特编码图像绘制
x=0.5:0.5:length(input);
x1=[x;x(2:end),x(end)+0.5];
x2=x1(:);
y1=[MCoutput;MCoutput];
y2=y1(:);
figure(2)
plot(x2,y2);
ylim([0,2]);
title('曼彻斯特编码输出图像')
%% DBP编码解码
DBPoutput=randi([0,1],1,2.*length(input));
for i=2:2:2*length(input)
if array(i./2)==1
DBPoutput(i)=DBPoutput(i-1);
if DBPoutput(i)==1
DBPoutput(i+1)=0;
else if DBPoutput(i)==0
DBPoutput(i+1)=1;
end
end
else if array(i./2)==0
if DBPoutput(i-1)==1
DBPoutput(i)=0;
DBPoutput(i+1)=1;
else if DBPoutput(i-1)==0
DBPoutput(i)=1;
DBPoutput(i+1)=0;
end
end
end
end
end
%% DBP编码图像绘制
DBPoutput = DBPoutput(1:length(DBPoutput)-1)
x=0.5:0.5:length(input);
x1=[x;x(2:end),x(end)+0.5];
x2=x1(:);
y1=[DBPoutput;DBPoutput];
y2=y1(:);
figure(3)
plot(x2,y2);
ylim([0,2]);
title('DBP编码输出图像')
%% PIE编码解码
num=8; %SOF和EOF一共占8个Tari
PIEoutput = cell(1,length(input)+2);
PIEoutput{1,1}='01011111';
PIEoutput{1,length(input)+2}='01111111';
for i=1:1:length(input)
if array(i)==0
PIEoutput{1,i+1}='01';
num=num+1;
else if array(i)==1
PIEoutput{1,i+1}='0111';
num=num+2;
end
end
end
%% PIE编码图像绘制
A = cell2mat(PIEoutput);
PIEoutput=A-'0'
x=0.5:0.5:num;
x1=[x;x(2:end),x(end)+0.5];
x2=[0.5;x1(:)];
y1=[PIEoutput;PIEoutput];
y2=[1;y1(:)];
figure(4)
plot(x2,y2);
ylim([0,2]);
title('PIE编码输出图像')
end
程序测试
测试输入
命令行窗口输入“IOT(‘10110010100’)”
输出结果
输出解码后的数组MCoutput(曼彻斯特编码)、DBPoutput、PIEoutput(NRZ由于跟输入一致就没有输出),在对应行加“;”可取消输出
输出图像