function [lo, hi] = afb3_2D(x, af1, af2) % 2-D Analysis Filter Bank % % USAGE: % [lo, hi] = afb3_2D(x, af1, af2); % INPUT: % x - NxM matrix, where min(N,M) > 2*length(filter) % (N, M are even) % af1 - analysis filter for the columns % af2 - analysis filter for the rows % af(:, 1) - lowpass filter % af(:, 2) - first highpass filter % af(:, 3) - second highpass filter % OUTPUT: % lo - lowpass subband % hi - cell array containing the eight following hipass subbandshi1, hi2 - one lowpass and two highpass subbands % 1) hi{1} = 'lo hi1' subband % 2) hi{2} = 'lo hi2' subband % 3) hi{3} = 'hi1 lo' subband % 4) hi{4} = 'hi1 hi1' subband % 5) hi{5} = 'hi1 hi2' subband % 6) hi{6} = 'hi2 lo' subband % 7) hi{7} = 'hi2 hi1' subband % 8) hi{8} = 'hi2 hi2' subband % % FRAMELET SOFTWARE AT POLYTECHNIC UNIVERSITY, BROOKLYN, NY % if nargin < 3 af2 = af1; end % filter along columns [L, H1, H2] = afb3_2D_A(x, af1, 1); % filter along rows [lo, hi{1}, hi{2}] = afb3_2D_A(L, af2, 2); [hi{3}, hi{4}, hi{5}] = afb3_2D_A(H1, af2, 2); [hi{6}, hi{7}, hi{8}] = afb3_2D_A(H2, af2, 2); % LOCAL FUNCTION function [L, H1, H2] = afb3_2D_A(x, af, d) % 2-D Analysis Filter Bank % (along one dimension only) % % USAGE: % [lo, hi1, hi2] = afb3_2D_A(x, af, d); % INPUT: % x - NxM matrix, where min(N,M) > 2*length(filter) % (N, M are even) % af - analysis filter for the columns % af(:, 1) - lowpass filter % af(:, 2) - first highpass filter % af(:, 3) - second highpass filter % d - dimension of filtering (d = 1 or 2) % OUTPUT: % lo, hi1, hi2 - one lowpass and two highpass subbands % % EXAMPLE: % x = rand(32,64); % [af, sf] = filters1; % [lo, hi1, hi2] = afb3_2D_A(x, af, 1); % y = sfb2D_A(lo, hi1, hi2, sf, 1); % err = x - y; % max(max(abs(err))) lpf = af(:, 1); % lowpass filter hpf1 = af(:, 2); % first highpass filter hpf2 = af(:, 3); % second highpass filter if d == 2 x = x'; end N = size(x,1); len = size(af,1)/2; x = cshift2D(x,-len); L = upfirdn(x, lpf, 1, 2); L(1:len, :) = L(1:len, :) + L([1:len]+N/2, :); L = L(1:N/2, :); H1 = upfirdn(x, hpf1, 1, 2); H1(1:len, :) = H1(1:len, :) + H1([1:len]+N/2, :); H1 = H1(1:N/2, :); H2 = upfirdn(x, hpf2, 1, 2); H2(1:len, :) = H2(1:len, :) + H2([1:len]+N/2, :); H2 = H2(1:N/2, :); if d == 2 L = L'; H1 = H1'; H2 = H2'; end