1、代码功能
- 输入:一个字符串
- 输出:
- codeword(码值)
- codeword所占的位数
2、代码框图
3、代码超详解
b=unique(str1);
for i=1:length(b)
a(i)=length(strfind(str1,b(i)));
end
- 排序,形成对应关系的数组。排序后,若数组b中的第一个元素为字符‘a’, 则数组a中的第一个元素为字符‘a’,出现的次数
for i=1:length(a)-1
for 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;
end
end
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==1
high(i)=frequency(i);
else
low(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;
end
ii=ii+1;
end
end
end
%把ave_str值赋给codeword
codeword=ave_str
%计算codeword占用的位数
bits=-log2(range)
Matlab实现算术编码
4、代码缺点
算术编码(arithmetic coding)的underflow问题