1、代码功能
- 输入:一个字符串
- 输出:
- codeword(码值)
- codeword所占的位数
2、代码框图
3、代码超详解
- 统计字符串中的字符种类,调用函数,放入数组b中。
b=unique(str1);
- 统计每种字符的个数,放入数组a中。
for i=1:length(b)a(i)=length(strfind(str1,b(i)));
end
- 排序,形成对应关系的数组。排序后,若数组b中的第一个元素为字符‘a’, 则数组a中的第一个元素为字符‘a’,出现的次数
for i=1:length(a)-1for j=i+1:length(a)if(a(i)<a(j))t1=a(i);a(i)=a(j);a(j)=t1;t2=b(i);b(i)=b(j);b(j)=t2;endend
end
- 统计每种字符出现的频率,放入数组frequency中。
for i=1:length(a)frequency(i) = a(i)/sum(a);
end
根据频率分配概率范围,范围高值放入数组high中,范围低值放入数组low中。
low(1)=0;
for i = 1:length(frequency)if i==1high(i)=frequency(i);elselow(i)=frequency(i-1)+low(i-1);high(i)=low(i)+frequency(i);end
end
编码
%编码
low_value=0; %初始化
high_value=1; %初始化
range=high_value-low_value; %初始化
for i = 1:length(str1) %遍历字符串中的每一个元素,使用for循环语句。d=strfind(b,str1(i)); %找到字符串中的字符,在数组d中的角标%算术编码high_value = low_value+ range*high(d);low_value = low_value+range*low(d);range=high_value-low_value;%编码后数据处理if i==length(str1)ave=(high_value+low_value)/2;ave_str=num2str(ave,length(str1)); %把数字转成字符串low_value_str=num2str(low_value,length(str1)); %把数字转成字符串high_value_str=num2str(high_value,length(str1)); %把数字转成字符串%当ave_str与low_value_str对应位的元素不一样时%截去ave_str不一样元素后面的字符for ii= 3: length(low_value_str)if low_value_str(ii) ~= high_value_str(ii)ave_str((ii+1):end)=[];break;endii=ii+1; endend
end%把ave_str值赋给codeword
codeword=ave_str
%计算codeword占用的位数
bits=-log2(range)
-
整个代码地址
Matlab实现算术编码
4、代码缺点
-
这个代码可以实现短字符串的编码,对于长字符串的编码,会出现underflow。如何解决underflow, 这篇博客有专题研究
算术编码(arithmetic coding)的underflow问题