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