matlab 树状链表,多级树集合分裂(SPIHT)算法的过程详解和Matlab实现(5)编码过程——精细扫描...
本文給出SPIHT編碼的精細掃描程序,其中包括一個能夠將帶小數的十進制數轉換為二進制表示的函數,這個轉換函數可以實現任意精度的二進制轉換,特別是將小數部分轉換為二進制表示。希望對有需要的朋友有所幫助。下一篇文章將給出SPIHT的解碼程序。請關注后續文章,歡迎 Email 聯系交流。
4、精細掃描程序
function Rn=refinement(N,LSP_Old)
% 函數 REFINEMENT()為精細編碼程序,對上一級編碼產生的重要系數列表LSP_Old,讀取每個
% 表項相應小波系數絕對值的二進制表示,輸出其中第N個重要的位,即相應于 2^N 處的碼數
% 輸入參數:N —— 本級編碼閾值的指數
% LSP_Old —— 上一級編碼產生的重要系數列表
% 輸出參數:Rn —— 精細掃描輸出位流
global Mat
% Mat是輸入的小波分解系數矩陣,作為全局變量,在編碼的相關程序中使用
Rn=[];
% 每級精細掃描開始時,Rn 均為空表
% LSP_Old 非空時才執行精細掃描程序
if ~isempty(LSP_Old)
rlsp=size(LSP_Old,1);
% 獲取 LSP_Old 的表項個數,對每個表項進行掃描
for r=1:rlsp
tMat=Mat(LSP_Old(r,1),LSP_Old(r,2));
% 讀取該表項對應的小波系數值
[biLSP,Np]=fracnum2bin(abs(tMat),N);
% 函數 FRACNUM2BIN() 根據精細掃描對應的權位 N ,將任意的十進制正數轉換為二進制數,
% 輸出參數為二進制表示列表 biLSP 和 權位N與最高權位的距離 Np 。
Rn=[Rn,biLSP(Np)];
% biLSP(Np)即為小波系數絕對值的二進制表示中第N個重要的位
end
end
(1)十進制數轉換為二進制表示的程序
function [binlist,qLpoint]=fracnum2bin(num,qLevel)
% 函數 FRACNUM2BIN() 根據精細掃描對應的權位 N ,將任意的十進制正數轉換為二進制數,
% 包括帶有任意位小數的十進制數。Matlab中的函數 dec2bin()、dec2binvec()只能將十
% 進制數的整數部分轉換為二進制表示,對小數部分則不轉換。
%
% 輸入參數:num —— 非負的十進制數
% qLevel —— 量化轉換精度,也可以是精細掃描對應的權位 N
% 輸出參數:biLSP —— 二進制表示列表
% Np —— 權位N與最高權位的距離,N 也是本級編碼閾值的指數
intBin=dec2binvec(num);
% 首先用Matlab函數dec2binvec()獲取整數部分的二進制表示intBin,低位在前,高位在后
intBin=intBin(end:-1:1);
% 根據個人習慣,將二進制表示轉換為高位在前,低位在后
lenIB=length(intBin);
% 求出二進制表示的長度
decpart=num-floor(num);
% 求出小數部分
decBin=[];
% 小數部分的二進制表示初始化為空表
% 根據量化精度要求輸出總的二進制表示列表
if (qLevel+1)>lenIB
% 如果量化精度高于整數部分的二進制碼長,則輸出為零值列表
binlist=zeros(1,qLevel+1);
qLpoint=1;
elseif qLevel>=0
% 如果量化精度在整數權位,則輸出整數部分的二進制表示intBin
% 不需轉換小數部分,同時輸出量化精度與最高權位的距離Np
binlist=intBin;
binlist(lenIB-qLevel+1:end)=0;
qLpoint=lenIB-qLevel;
elseif qLevel<0
% 如果量化精度在小數權位,則需轉換小數部分
N=-1;
while N>=qLevel
% 小數部分的轉換只需進行到量化精度處
res=decpart-2^N;
if res==0
decBin=[decBin,1];
decBin(end+1:-qLevel)=0;
% 如果小數部分的轉換完成時仍未達到量化精度所在的權位,則補零
break;
elseif res>0
decBin=[decBin,1];
decpart=res;
N=N-1;
else
decBin=[decBin,0];
N=N-1;
end
end
binlist=[intBin,decBin];
qLpoint=lenIB-qLevel;
% 輸出整數部分和小數部分的二進制表示intBin,decBin,以及量化精度與最高權位的距離Np
end
至此,SPIHT算法的編碼程序就介紹完畢啦!以后有時間的話會增加熵編碼的功能(例如Huffman編碼)。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的matlab 树状链表,多级树集合分裂(SPIHT)算法的过程详解和Matlab实现(5)编码过程——精细扫描...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 迷你世界烈焰剑怎么做(24期迷你世界一)
- 下一篇: matlab人脸追踪,求大神帮助我这个菜