(Matlab源码)Matlab实现算术编码(Arithmetic coding)超级详解(每一段代码都可以看懂)
生活随笔
收集整理的這篇文章主要介紹了
(Matlab源码)Matlab实现算术编码(Arithmetic coding)超级详解(每一段代码都可以看懂)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、代碼功能
- 輸入:一個(gè)字符串
- 輸出:
- ? codeword(碼值)
- ?codeword所占的位數(shù)
2、代碼框圖
3、代碼超詳解
- ?統(tǒng)計(jì)字符串中的字符種類,調(diào)用函數(shù),放入數(shù)組b中。
- 統(tǒng)計(jì)每種字符的個(gè)數(shù),放入數(shù)組a中。
- ?排序,形成對應(yīng)關(guān)系的數(shù)組。排序后,若數(shù)組b中的第一個(gè)元素為字符‘a(chǎn)’, 則數(shù)組a中的第一個(gè)元素為字符‘a(chǎn)’,出現(xiàn)的次數(shù)
- 統(tǒng)計(jì)每種字符出現(xiàn)的頻率,放入數(shù)組frequency中。
?根據(jù)頻率分配概率范圍,范圍高值放入數(shù)組high中,范圍低值放入數(shù)組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) %遍歷字符串中的每一個(gè)元素,使用for循環(huán)語句。d=strfind(b,str1(i)); %找到字符串中的字符,在數(shù)組d中的角標(biāo)%算術(shù)編碼high_value = low_value+ range*high(d);low_value = low_value+range*low(d);range=high_value-low_value;%編碼后數(shù)據(jù)處理if i==length(str1)ave=(high_value+low_value)/2;ave_str=num2str(ave,length(str1)); %把數(shù)字轉(zhuǎn)成字符串low_value_str=num2str(low_value,length(str1)); %把數(shù)字轉(zhuǎn)成字符串high_value_str=num2str(high_value,length(str1)); %把數(shù)字轉(zhuǎn)成字符串%當(dāng)ave_str與low_value_str對應(yīng)位的元素不一樣時(shí)%截去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%把a(bǔ)ve_str值賦給codeword codeword=ave_str %計(jì)算codeword占用的位數(shù) bits=-log2(range)?
-
整個(gè)代碼地址
? ? ? ?Matlab實(shí)現(xiàn)算術(shù)編碼
4、代碼缺點(diǎn)
-
這個(gè)代碼可以實(shí)現(xiàn)短字符串的編碼,對于長字符串的編碼,會出現(xiàn)underflow。如何解決underflow, 這篇博客有專題研究
? ? ? ?算術(shù)編碼(arithmetic coding)的underflow問題
總結(jié)
以上是生活随笔為你收集整理的(Matlab源码)Matlab实现算术编码(Arithmetic coding)超级详解(每一段代码都可以看懂)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: labelme标注文件转coco jso
- 下一篇: PyTorch框架学习十四——学习率调整