实验三:MATLAB实现MH编码

实验原理/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,

  • 14
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值