📄 lip_decode.m
字号:
function [DecodeMat,Sn,LSP,LIP]=lip_decode(DecodeMat,Sn,N,LSP,LIP)
% 函数 LIP_DECODE() 根据排序位流 Sn,更新列表LIP、LSP和重构系数矩阵 DecodeMat
% 输入参数:DecodeMat —— 上一级解码后生成的重构系数矩阵
% Sn —— 本级解码排序位流
% N —— 本级解码阈值的指数
% LSP —— 上一级解码生成的重要系数列表
% LIP —— 上一级解码生成的不重要系数列表
% 输出参数:DecodeMat —— 本级LIP扫描后更新的重构系数矩阵
% Sn —— 对LIP列表扫描后更新的排序位流
% LSP —— 对LIP列表扫描后更新的重要系数列表
% LIP —— 本级LIP扫描后更新的不重要系数列表
rlip=size(LIP,1);
% r 是指向 LIP 当前读入表项位置的指针
r=1;
% 解码路径与编码路径基本一致,不过解码是根据排序位流 Sn 来判断系数是否重要
while r<=rlip
% 读入当前表项的坐标值
rN=LIP(r,1);
cN=LIP(r,2);
% 根据 Sn 判断该表项是否重要
% 根据 Sn 的生成原理,每次判断都是读入 Sn 的首位数,判断后立即删除这一位数
if Sn(1)==1
% 若Sn(1)=1,则表示当前表项是重要的
Sn(1)=[];
% 读入后即删除该位 Sn 数据,使 Sn(2)变为 Sn(1),进入下一次判断
% 这时的 Sn(1) 是正负符号位
if Sn(1)==1
% Sn(1)=1,则相应的系数为正数,其值为本级解码阈值的1.5倍
DecodeMat(rN,cN)=1.5*2^N;
Sn(1)=[];
else
% Sn(1)=0,则相应的系数为负数
DecodeMat(rN,cN)=-1.5*2^N;
Sn(1)=[];
end
% 将该表项添加到重要系数列表 LSP
LSP=[LSP;LIP(r,:)];
% 将该表项从 LIP 中删除
LIP(r,:)=[];
else
% 若不重要,则相应的系数值为 0
DecodeMat(rN,cN)=0;
Sn(1)=[];
% 将指针指向下一个表项
r=r+1;
end
% 判断当前 LIP 的表长
rlip=size(LIP,1);
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -