www.pudn.com > SPIHT_bandelet.rar > func_SPIHT_Enc.m


function out = func_MySPIHT_Enc(m, max_bits, block_size, level) 
% Matlab implementation of SPIHT (without Arithmatic coding stage) 
% 
% Encoder 
% 
% input:    m : input image in wavelet domain 
%           max_bits : maximum bits can be used 
%           block_size : image size 
%           level : wavelet decomposition level 
% 
% output:   out : bit stream 
% 
% Jing Tian 
% Contact me : scuteejtian@hotmail.com 
% This program is part of my undergraduate project in GuangZhou, P. R. China. 
% April - July 1999 
 
 
%-----------   Initialization  ----------------- 
bitctr = 0; 
out = 2*ones(1,max_bits - 14); 
n_max = floor(log2(abs(max(max(m)')))); 
Bits_Header = 0; 
Bits_LSP = 0; 
Bits_LIP = 0; 
Bits_LIS = 0; 
 
%-----------   output bit stream header   ---------------- 
% image size, number of bit plane, wavelet decomposition level should be 
% written as bit stream header. 
out(1,[1 2 3]) = [size(m,1) n_max level]; bitctr = bitctr + 24; 
index = 4; 
Bits_Header = Bits_Header + 24; 
 
%-----------   Initialize LIP, LSP, LIS   ---------------- 
temp = []; 
bandsize = 2.^(log2(size(m, 1)) - level + 1); 
temp1 = 1 : bandsize; 
for i = 1 : bandsize 
    temp = [temp; temp1]; 
end 
LIP(:, 1) = temp(:); 
temp = temp'; 
LIP(:, 2) = temp(:); 
LIS(:, 1) = LIP(:, 1); 
LIS(:, 2) = LIP(:, 2); 
LIS(:, 3) = zeros(length(LIP(:, 1)), 1); 
pstart = 1; 
pend = bandsize / 2; 
for i = 1 : bandsize / 2 
    LIS(pstart : pend, :) = []; 
    pdel = pend - pstart + 1; 
    pstart = pstart + bandsize - pdel; 
    pend = pend + bandsize - pdel; 
end 
LSP = []; 
 
n = n_max; 
 
%-----------   coding   ---------------- 
while(bitctr < max_bits) 
         
    % Sorting Pass 
    LIPtemp = LIP; temp = 0; 
    for i = 1:size(LIPtemp,1) 
        temp = temp+1; 
        if (bitctr + 1) >= max_bits 
            if (bitctr < max_bits) 
                out(length(out))=[]; 
            end 
            return 
        end 
        if abs(m(LIPtemp(i,1),LIPtemp(i,2))) >= 2^n % 1: positive; 0: negative 
            out(index) = 1; bitctr = bitctr + 1; 
            index = index +1; Bits_LIP = Bits_LIP + 1; 
            sgn = m(LIPtemp(i,1),LIPtemp(i,2))>=0; 
            out(index) = sgn; bitctr = bitctr + 1; 
            index = index +1; Bits_LIP = Bits_LIP + 1; 
            LSP = [LSP; LIPtemp(i,:)]; 
            LIP(temp,:) = []; temp = temp - 1; 
        else 
            out(index) = 0; bitctr = bitctr + 1; 
            index = index +1; 
            Bits_LIP = Bits_LIP + 1; 
        end 
    end 
     
    LIStemp = LIS; temp = 0; i = 1; 
    while ( i <= size(LIStemp,1)) 
        temp = temp + 1; 
        if LIStemp(i,3) == 0 
            if bitctr >= max_bits 
                return 
            end 
            max_d = func_MyDescendant(LIStemp(i,1),LIStemp(i,2),LIStemp(i,3),m); 
            if max_d >= 2^n 
                out(index) = 1; bitctr = bitctr + 1; 
                index = index +1; Bits_LIS = Bits_LIS + 1; 
                x = LIStemp(i,1); y = LIStemp(i,2); 
                 
                if (bitctr + 1) >= max_bits 
                    if (bitctr < max_bits) 
                        out(length(out))=[]; 
                    end 
                    return 
                end 
                if abs(m(2*x-1,2*y-1)) >= 2^n 
                    LSP = [LSP; 2*x-1 2*y-1]; 
                    out(index) = 1; bitctr = bitctr + 1; 
                    index = index +1; Bits_LIS = Bits_LIS + 1; 
                    sgn = m(2*x-1,2*y-1)>=0; 
                    out(index) = sgn; bitctr = bitctr + 1; 
                    index = index +1; Bits_LIS = Bits_LIS + 1; 
                else 
                    out(index) = 0; bitctr = bitctr + 1; 
                    index = index +1; Bits_LIS = Bits_LIS + 1; 
                    LIP = [LIP; 2*x-1 2*y-1]; 
                end 
                 
                if (bitctr + 1) >= max_bits 
                    if (bitctr < max_bits) 
                        out(length(out))=[]; 
                    end 
                    return 
                end 
                if abs(m(2*x-1,2*y)) >= 2^n 
                    LSP = [LSP; 2*x-1 2*y]; 
                    out(index) = 1; bitctr = bitctr + 1; 
                    index = index +1; Bits_LIS = Bits_LIS + 1; 
                    sgn = m(2*x-1,2*y)>=0; 
                    out(index) = sgn; bitctr = bitctr + 1; 
                    index = index +1; Bits_LIS = Bits_LIS + 1; 
                else 
                    out(index) = 0; bitctr = bitctr + 1; 
                    index = index +1; Bits_LIS = Bits_LIS + 1; 
                    LIP = [LIP; 2*x-1 2*y]; 
                end 
                 
                if (bitctr + 1) >= max_bits 
                    if (bitctr < max_bits) 
                        out(length(out))=[]; 
                    end 
                    return 
                end 
                if abs(m(2*x,2*y-1)) >= 2^n 
                    LSP = [LSP; 2*x 2*y-1]; 
                    out(index) = 1; bitctr = bitctr + 1; 
                    index = index +1; Bits_LIS = Bits_LIS + 1; 
                    sgn = m(2*x,2*y-1)>=0; 
                    out(index) = sgn; bitctr = bitctr + 1; 
                    index = index +1; Bits_LIS = Bits_LIS + 1; 
                else 
                    out(index) = 0; bitctr = bitctr + 1; 
                    index = index +1; Bits_LIS = Bits_LIS + 1; 
                    LIP = [LIP; 2*x 2*y-1]; 
                end 
                 
                if (bitctr + 1) >= max_bits 
                    if (bitctr < max_bits) 
                        out(length(out))=[]; 
                    end 
                    return 
                end 
                if abs(m(2*x,2*y)) >= 2^n 
                    LSP = [LSP; 2*x 2*y]; 
                    out(index) = 1; bitctr = bitctr + 1; 
                    index = index +1; Bits_LIS = Bits_LIS + 1; 
                    sgn = m(2*x,2*y)>=0; 
                    out(index) = sgn; bitctr = bitctr + 1; 
                    index = index +1; Bits_LIS = Bits_LIS + 1; 
                else 
                    out(index) = 0; bitctr = bitctr + 1; 
                    index = index +1; Bits_LIS = Bits_LIS + 1; 
                    LIP = [LIP; 2*x 2*y]; 
                end 
                 
                if ((2*(2*x)-1) < size(m) & (2*(2*y)-1) < size(m)) 
                    LIS = [LIS; LIStemp(i,1) LIStemp(i,2) 1]; 
                    LIStemp = [LIStemp; LIStemp(i,1) LIStemp(i,2) 1]; 
                end 
                LIS(temp,:) = []; temp = temp-1; 
                 
            else 
                out(index) = 0; bitctr = bitctr + 1; 
                index = index +1; Bits_LIS = Bits_LIS + 1; 
            end 
        else 
            if bitctr >= max_bits 
                return 
            end 
            max_d = func_MyDescendant(LIStemp(i,1),LIStemp(i,2),LIStemp(i,3),m); 
            if max_d >= 2^n 
                out(index) = 1; bitctr = bitctr + 1; 
                index = index +1; 
                x = LIStemp(i,1); y = LIStemp(i,2); 
                LIS = [LIS; 2*x-1 2*y-1 0; 2*x-1 2*y 0; 2*x 2*y-1 0; 2*x 2*y 0]; 
                LIStemp = [LIStemp; 2*x-1 2*y-1 0; 2*x-1 2*y 0; 2*x 2*y-1 0; 2*x 2*y 0]; 
                LIS(temp,:) = []; temp = temp - 1; 
            else 
                out(index) = 0; bitctr = bitctr + 1; 
                index = index +1; Bits_LIS = Bits_LIS + 1; 
            end 
        end 
        i = i+1; 
    end 
     
    % Refinement Pass 
    temp = 1; 
    value = floor(abs(2^(n_max-n+1)*m(LSP(temp,1),LSP(temp,2)))); 
    while (value >= 2^(n_max+2) & (temp <= size(LSP,1))) 
        if bitctr >= max_bits 
            return 
        end 
        s = bitget(value,n_max+2); 
        out(index) = s; bitctr = bitctr + 1; 
        index = index +1; Bits_LSP = Bits_LSP + 1; 
        temp = temp + 1; 
        if temp <= size(LSP,1) 
            value = floor(abs(2^(n_max-n+1)*m(LSP(temp,1),LSP(temp,2)))); 
        end 
    end 
     
    n = n - 1; 
end