Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1649282
  • 博文数量: 13833
  • 博客积分: 1041400
  • 博客等级: 大元帅
  • 技术积分: 127080
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-13 10:12
文章分类

全部博文(13833)

文章存档

2008年(13833)

我的朋友

分类:

2008-06-13 10:25:51

 本文给出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个重要的位    endend(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,以及量化精度与最高权位的距离Npend    至此,SPIHT算法的编码程序就介绍完毕啦!以后有时间的话会增加熵编码的功能(例如Huffman编码)。
阅读(59) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~