clear all
II=imread('kids.tif');
for i=1:128
for j=1:128
I(i,j)=II(i,j);
end
end%取128*128像素块
figure;
imshow(I);%显示被传输图像
QJ=[16 11 10 16 24 40 51 61;
12 12 14 19 26 58 60 55;
14 13 16 24 40 57 69 56;
14 17 22 29 51 87 80 62;
18 22 37 56 68 109 103 77;
24 35 55 64 81 104 113 92;
49 64 78 87 103 121 120 101;
72 92 95 98 112 100 103 99];%标量量化步长
H=zeros(128,128);
for p=0:8:120
for q=0:8:120
for i=1:8
for j=1:8
I1(i,j)=double(I(i+p,j+q));
end
end %分成8*8像素块
Q=mydct2(I1);%二维dct变换
Q=Q./QJ;%量化
Q=fix(Q);%取整
H=myfun3(H,Q,p,q);%组合成128*128矩阵
end
end
k=1;
for i=1:128
for j=1:128
HC(k)=H(i,j);
k=k+1;
end
end%组成一维行向量
%求序列中各元素出现的概率
a=min(HC);%求序列中的最小值
b=max(HC);%求序列中的最大值
n=length(HC);%序列长度
k=1;
for z=a:b
i=z-a+1;
q(1,i)=0;
for j=1:n
if HC(1,j)==z
q(1,i)=q(1,i)+1;
end
end
if q(1,i)~=0 %去除为0的概率
p(1,k)=q(1,i);
p(1,k)=p(1,k)/n;
HH(1,k)=z; %去除概率为0的元素
k=k+1;
end
end
l=length(p);%求概率点个数
h=huffman(p)%实现huffman编码
%序列编码
k=1;
for i=1:n
t=find(HH==HC(1,i));%一次寻找HH与HC相同点位置
for j=1:l
if (h(t,j)=='0')||(h(t,j)=='1')%当判断不是空格,而为‘0’或‘1’时对啊a(k)进行赋值
a(k)=h(t,j);
k=k+1;
a(k)=h(t,j);
k=k+1;
a(k)=h(t,j);
k=k+1;
a(k)=h(t,j);
k=k+1;
a(k)=h(t,j);%便于纠错,将一位码字进行五位传输
k=k+1;
end
end
end
a=a-48;%将字符变为0,1序列
ak=fft(a);
Na=length(ak);
mak=abs(ak);
k=(0:Na-1)*2*pi/Na;
nb=[0:1:Na-1];
b=a+0.05*randn(1,Na);
bk=fft(b);
mbk=abs(bk);
k=(0:Na-1)*2*pi/Na;
M=81;
n=1:1:81;
wp=0.35*pi;
ws=0.45*pi;
passrad=(wp+ws)/2;
bwn=myblackman_wn_lp(wp,ws,M);
hd=sin(passrad*(n-M/2))./(pi*(n-M/2));
hd((M+1)/2)=passrad/pi;
hh=hd.*bwn;
bwn1=[zeros(1,Na)];
bwn1=[hh,zeros(1,Na-M)];
b1k=fft(bwn1);
mb1k=abs(b1k);
k=(0:Na-1)*2*pi/Na;
b2=b1k.*bk;
b2k=ifft(b2);
mb2k=abs(b2k);
k=(0:Na-1)*2*pi/Na;
%接口对接
a=mb2k;
%序列纠错
n=length(a);
a=fix(a+0.5);%判决,a<0.5判为0,否则判为1
k=1;
for j=1:5:n
if length(find(a(1,j:j+4)==1))>2
b(k)=1;
else b(k)=0;
end
k=k+1;
end %实现纠错译码,当五位中1的个数大为2则判为1,否则判为0
b=b+48;%变为char型,实现译码要求
%序列译码
[i,l]=size(h);%求行列值
for i=1:l
c(i)=' ';
end %定义l长的全空格行向量
for i=1:l
for j=1:l
h1(i,j)=' ';
end
end%定义i行l列的全空格矩阵
k=1;
for i=1:l
k=1;
for j=1:l
if h(i,j)~=' '
h1(i,k)=h(i,j);
k=k+1;
end
end
end%实现将空格移位至字符后
d=c; %将全空格行向量赋给d
n=length(b);
m=1;
k=1;
for i=1:n
d(m)=b(i);%将接收码字依次赋给d
m=m+1;
for j=1:l
if d==h1(j,:)%寻找接收码字与huffman编码矩阵中哪行相同
H1(1,k)=HH(1,j);%相同则将对应值赋给译码学列
m=1;k=k+1;%m为标志位
end
if m==1
d=c;%译码成功,则进行下个码字的译码,重新赋给d全空格行向量
break;%译码成功退出本循环
end
end
end
k=1;
for i=1:128
for j=1:128
H2(i,j)=H1(k);
k=k+1;
end
end%将行向量转换为128*128矩阵
%恢复图像
H3=zeros(128,128);
for p=0:8:120
for q=0:8:120
for i=1:8
for j=1:8
I1(i,j)=double(H2(i+p,j+q));
end
end
Q=I1.*QJ;%反量化
Q=myidct2(Q);%逆dct变换
H3=myfun3(H3,Q,p,q);
end
end%重构128*128矩阵
figure;
imshow(uint8(H3));%输出恢复图像