以一幅灰度图像为例对通信系统的通信过程进行仿真,过程如下图所示:
1、不经过信道编码与译码,图像经过BSC信道传输后的误码率,此处的编码方法为霍夫曼编码。MATLAB仿真程序如下:
clear all
clc
I0=imread('Penguinshead3.jpg');
I1=rgb2gray(I0);
subplot(1,3,1),imshow(I0),title('原图')
subplot(1,3,2),imshow(I1),title('灰度图')
[m,n]=size(I1);
I=reshape(I1,m*n,1);
P_value=zeros(1,256);
%---------------------------------------概率;
for i=0:255
P_value(i+1)=length(find(I==i))/(m*n); %各像素值概率
end
f=numel(I); %频数
P_symbol=zeros(m*n,1);
for i=1:m
for j=1:n
P_symbol(i,j)=length(find(I==unique(i)))/f;%各信源符号概率矩阵
end
end
%--------------------------------霍夫曼编码
k=0:255;
dict=huffmandict(k,P_value); %生成编码字典
huffmancode=cell(length(I),2); %元胞数组存放对应编码
for i=1:m*n
huffmancode{i,1}=I(i);
end
for i=1:length(I)
for j=1:256
if huffmancode{i,1}==dict{j,1}
huffmancode{i,2}=dict{j,2};
end
end
end
%----------------------------通过BSC信道
bsc_code=huffmancode; %通过bsc信道后的编码
for i=1:length(I)
bsc_code{i,2}=bsc(huffmancode{i,2},0.001);
end
% --------------------------------译码
bsccode=bsc_code{1,2};
for i=2:length(I)
bsccode0=bsc_code{i,2};
L=length(bsccode0);
bsccode(end+1:end+L)=bsccode0; %转换为一串字符
end
deco=huffmandeco(bsccode',dict); %译码
%----------------------------------------译码后存在错误
rdeco=zeros(length(I),1); %错误处理
L=length(I)-length(deco);
if L<=0
rdeco=deco(1:end-abs(L)); %截断
else
a=ones(abs(L),1); %补足
rdeco(1:length(deco))=deco;
rdeco(length(deco)+1:end)=195*a;
end
Ideco=reshape(rdeco,m,n);
subplot(1,3,3),imshow(uint8(Ideco));title('经BSC信道传输后的图像');
error=length(find(Ideco~=I1));
fprintf('误码率:%.4f\n',error/length(I));
传输结果如下图所示:
上图表示的是仅经信源编码与译码,新宿的得到的结果。可以看到图像存在失真,此时的误码率为:
2、经过信道译码,此处的信道编码采用汉明码。MATLAB仿真程序如下:
clear all
clc
I0=imread('Penguinshead3.jpg');
subplot(1,3,1),imshow(I0),title('原图')
I1=rgb2gray(I0);
subplot(1,3,2);imshow(I1);title('信源发出的消息');
[m,n]=size(I1);
I=I1(:);
P=zeros(1,256);
%---------------------------------------概率;
for i=0:255
P(i+1)=length(find(I==i))/(m*n);
end
%---------------------------------------编码译码
k=0:255;
dict=huffmandict(k,P); %生成霍夫曼码字典
enco=huffmanenco(I,dict); %霍夫曼码信源编码
code=encode(enco,15,11); %汉明码信道编码
bsc_code=bsc(code,0.001); %通过BSC信道
rcvcode=decode(bsc_code,15,11); %汉明码信道译码
deco=huffmandeco(enco,dict); %霍夫曼码信源译码
Ireco=reshape(deco,m,n);
subplot(1,3,3);imshow(uint8(Ireco));title('信宿接收的消息');
error=length(find(Ireco~=I1)); %误码数
fprintf('误码率:%0.4f\n',error/length(I));
经信道传输后的图像如下图所示:
此时图像无失真,误码率为:
可以明显看到第二种方式的误码率远远小于第一种方式的误码率,由此可看出在通信过程中进行信道编码与译码的重要性。
而方式1的误码率高的原因有以下三点:
(1)传输图像较小,像素值少。图像越小,编码表的码字越少,经信道传输后,越容易出现非编码表码字。(2)对于编码表码字处理的译码译码方式简单,对于译码后的编码像素值采用舍弃译码后末尾的像素值与补足像素值(由于使用的图像右下角的像素值在195左右,因此对与译码后长度不足的像素值序列,补充像素值为195的像素)的方式存在较大的误差。(3)未经过信道编码与译码。
必须说明的是由于上述第(2)点原因,在BSC信道的转移概率比较大的时候(p>0.1)时,方式1能够运行通过的概率很低,当信道的转移概率很小时,该方式的误码率也会比较小。