实验原理/MH编码规则:
MATLAB实验代码:
clc, close all; clear;
%MH编码实现
%以0代表白,1代表黑
%MH编码码表
%结尾码
MH_WHITE_64 = ["00110101","000111","0111","1000","1011","1100","1110","1111","10011","10100","00111","01000","001000","000011","110100","110101","101010","101011","0100111","0001100","0001000","0010111","0000011","0000100","0101000","0101011","0010011","0100100","0011000","00000010","00000011","00011010","00011011","00010010","00010011","00010100","00010101","00010110","00010111","00101000","00101001","00101010","00101011","00101100","00101101","00000100","00000101","00001010","00001011","01010010","01010011","01010100","01010101","00100100","00100101","01011000","01011001","01011010","01011011","01001010","01001011","00110010","00110011","00110100"];
MH_BLACK_64 = ["0000110111","010","11","10","011","0011","0010","00011","000101","000100","0000100","0000101","0000111","00000100","00000111","000011000","0000010111","0000011000","0000001000","00001100111","00001101000","00001101100","00000110111","00000101000","00000010111","00000011000","000011001010","000011001011","000011001100","000011001101","000001101000","000001101001","000001101010","000001101011","000011010010","000011010011","000011010100","000011010101","000011010110","000011010111","000001101100","000001101101","000011011010","000011011011","000001010100","000001010101","000001010110","000001010111","000001100100","000001100101","000001010010","000001010011","000000100100","000000110111","000000111000","000000100111","000000101000","000001011000","000001011001","000000101011","000000101100","000001011010","000001100110","000001100111"];
%组合基干码
MH_WHITE_27 = ["11011","10010","010111","0110111","00110110","00110111","01100100","01100101","01101000","01100111","011001100","011001101","011010010","011010011","011010100","011010101","011010110","011010111","011011000","011011001","011011010","011011011","010011000","010011001","010011010","011000","010011011"];
MH_BLACK_27 = ["0000001111","000011001000","000011001001","000001011011","000000110011","000000110100","000000110101","0000001101100","0000001101101","0000001001010","0000001001011","0000001001100","0000001001101","0000001110010","000000111001","0000001110100","0000001110101","0000001110110","0000001110111","0000001010010","0000001010011","0000001010100","0000001010101","0000001011010","0000001011011","0000001100100","0000001100101"];
%结尾码黑白一致
EOL ="000000000001";
%传真文件
inpu=[zeros(1,70), ones(1,10), zeros(1,15), ones(1,18), zeros(1,780), ones(1,1000)];%存储数据类型为double
%定义MH编码
temp=0;%用于记录上一个游程最后一个元素的位置
tempnum = 1;%tempnum表示当前存储码字的位置
judge=true;%judge为true代表当前为白游程,false代表为黑游程
MH_Code = [" "];%创建字符串数组用于保存数据
if inpu(1, 1) == 1
%如果第一游程为黑游程,则在行首加上长度为0的白游程
MH_Code(1, tempnum) = MH_WHITE_64(1); tempnum=tempnum+1; judge=~judge;
disp(MH_Code(1, 1))
end
for i=1:length(inpu)-1
%如果当前字符和下一个字符相同,继续搜寻下一个字符,直到字符不同
if inpu(1, i)==inpu(1, i+1)
continue
end
%以i为当前游程最后一个元素的位置,开始进行操作
temp_now=i-temp+1;
temp=i;
%游程长度在0~63时,直接以结尾码表示
if temp_now<=64
if judge
MH_Code(1, tempnum)=MH_WHITE_64(temp_now);
tempnum=tempnum+1;
judge=~judge;
else
MH_Code(1,tempnum)=MH_BLACK_64(temp_now);
tempnum=tempnum+1;
judge=~judge;
end
%游程长度大于63时,用基干码和结尾码共同表示
elseif temp_now>64
if judge
MH_WHITE_27(floor(temp_now/64))+MH_WHITE_64(rem(temp_now,64)),
MH_Code(1, tempnum)=MH_WHITE_27(floor(temp_now/64))+MH_WHITE_64(rem(temp_now,64));
tempnum=tempnum+1;
judge=~judge;
else
MH_Code(1, tempnum)=MH_BLACK_27(floor(temp_now/64))+MH_BLACK_64(rem(temp_now,64));
tempnum=tempnum+1;
judge=~judge;
end
end
end
temp_now=length(inpu)-temp+1;
if judge
MH_Code(1, tempnum)=MH_WHITE_27(floor(temp_now/64))+MH_WHITE_64(rem(temp_now,64)); tempnum=tempnum+1; judge=~judge;
else
MH_Code(1, tempnum)=MH_BLACK_27(floor(temp_now/64))+MH_BLACK_64(rem(temp_now,64));tempnum=tempnum+1; judge=~judge;
end
%循环结束后最终再加一个EOL结束码
MH_Code(1, tempnum)=EOL;tempnum=0;judge=true;
disp(MH_Code,'all');
%计算编码后的总比特数,压缩比
total_MHbit=sum(strlength(MH_Code)),
total_sourcebit=sum(length(inpu)),
comp_ratio=total_sourcebit/total_MHbit,