?? lis_decode.m
字號:
function [LSP,LIP,LIS,LisFlag,DecodeMat,N]=lis_decode(DecodeMat,N,Sn,LSP,LIP,LIS,LisFlag)
% 函數 LIS_DECODE() 根據排序位流 Sn,更新列表LIP、LSP和重構系數矩陣 DecodeMat
% 輸入參數:DecodeMat —— 本級 LIP 掃描后更新的重構系數矩陣
% N —— 本級解碼閾值的指數
% Sn —— 經本級 LIP 掃描截取后的排序位流
% LSP —— 經本級 LIP 掃描后更新的重要系數列表
% LIP —— 經本級 LIP 掃描后更新的不重要系數列表
% LIS —— 上一級編碼生成的不重要子集列表
% LisFlag —— 上一級編碼生成的不重要子集表項類型列表
% 輸出參數:LSP —— 本級 LIS 掃描后更新的重要系數列表
% LIP —— 經本級 LIS 掃描處理后更新的不重要系數列表
% LIS —— 本級 LIS 掃描后更新的不重要子集列表
% LisFlag —— 本級 LIS 掃描后更新的不重要子集表項類型列表
% DecodeMat —— 本級 LIS 掃描后更新的重構系數矩陣
% N —— 下一級解碼閾值的指數
global rMat cMat
% rMat、cMat是Mat的行、列數,作為全局變量,在編碼、解碼的相關程序中使用
% 讀入當前 LIS 的表長
rlis=size(LIS,1);
% ls 是指向 LIS 當前表項位置的指針,初始位置為1
ls=1;
while ls<=rlis
% 讀入當前 LIS 表項的類型
switch LisFlag(ls)
% ‘D’類表項,包含孩子和非直系子孫
case 'D'
% 讀入該表項的坐標值
rP=LIS(ls,1);
cP=LIS(ls,2);
% 根據 Sn 判斷該表項‘D’型子孫樹是否重要
if Sn(1)==1
% 每次判斷都是讀入 Sn 的首位數,判斷后立即刪除這一位數
Sn(1)=[];
% 生成該表項的孩子樹
chO=coef_DOL(rP,cP,'O');
% 分別判斷每個孩子的重要性
for r=1:4
% 讀入孩子的坐標值
rO=chO(r,1);
cO=chO(r,2);
% 判斷該孩子的重要性
if Sn(1)==1
Sn(1)=[];
% 判斷該孩子的正負符號
if Sn(1)==1
Sn(1)=[];
% 生成該孩子的系數值
DecodeMat(rO,cO)=1.5*2^N;
else
Sn(1)=[];
DecodeMat(rO,cO)=-1.5*2^N;
end
% 將該孩子添加到重要系數列表 LSP
LSP=[LSP;chO(r,:)];
else
% 如果不重要,則這個孩子的系數值為 0
DecodeMat(rO,cO)=0;
Sn(1)=[];
% 將該孩子添加到不重要系數列表 LIP
% 本級閾值下不重要的系數在下一級解碼中可能是重要的
LIP=[LIP;chO(r,:)];
end
end
% 生成該表項的非直系子孫樹
chL=coef_DOL(rP,cP,'L');
if ~isempty(chL)
% 如果‘L’型樹非空,則將該表項添加到列表 LIS 的尾端等待掃描
LIS=[LIS;LIS(ls,:)];
% 表項類型更改為‘L’型
LisFlag=[LisFlag,'L'];
% 至此,該表項的‘D’型LIS掃描結束,在LIS中刪除該項及其類型符
LIS(ls,:)=[];
LisFlag(ls)=[];
else
% 如果‘L’型樹為空集
% 則該表項的‘D’型LIS掃描結束,在LIS中刪除該項及其類型符
LIS(ls,:)=[];
LisFlag(ls)=[];
end
else
% 如果該表項的‘D’型子孫樹不重要,則先刪除讀入的 Sn 值
Sn(1)=[];
% 然后將指針指向下一個 LIS 表項
ls=ls+1;
end
% 更新當前 LIS 的表長,轉入下一表項的掃描
rlis=size(LIS,1);
case 'L'
% 對‘L’類表項,不需判斷孩子的重要性
% 讀入該表項的坐標值
rP=LIS(ls,1);
cP=LIS(ls,2);
% 判斷該表項的‘L’型子孫樹是否重要
if Sn(1)==1
% 如果該子孫樹重要
Sn(1)=[];
% 則生成該表項的孩子樹
chO=coef_DOL(rP,cP,'O');
% 將該‘L’類表項從 LIS 中刪除
LIS(ls,:)=[];
LisFlag(ls)=[];
% 將表項的四個孩子添加到 LIS 的結尾,標記為‘D’類表項
LIS=[LIS;chO(1:4,:)];
LisFlag(end+1:end+4)='D';
else
% 如果該表項的‘L’型子孫樹不重要,則先刪除讀入的 Sn 值
Sn(1)=[];
% 然后將指針指向下一個 LIS 表項
ls=ls+1;
end
% 更新當前 LIS 的表長,轉入下一表項的掃描
rlis=size(LIS,1);
end
end
% 對 LIS 的掃描結束,將本級閾值的指數減1,準備進入下一級編碼
N=N-1;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -