buildSCFpyrLevs.m 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. % [PYR, INDICES] = buildSCFpyrLevs(LODFT, LOGRAD, XRCOS, YRCOS, ANGLE, HEIGHT, NBANDS)
  2. %
  3. % Recursive function for constructing levels of a steerable pyramid. This
  4. % is called by buildSCFpyr, and is not usually called directly.
  5. % Original code: Eero Simoncelli, 5/97.
  6. % Modified by Javier Portilla to generate complex bands in 9/97.
  7. function [pyr,pind] = buildSCFpyrLevs(lodft,log_rad,Xrcos,Yrcos,angle,ht,nbands);
  8. if (ht <= 0)
  9. lo0 = ifft2(ifftshift(lodft));
  10. pyr = real(lo0(:));
  11. pind = size(lo0);
  12. else
  13. bands = zeros(prod(size(lodft)), nbands);
  14. bind = zeros(nbands,2);
  15. % log_rad = log_rad + 1;
  16. Xrcos = Xrcos - log2(2); % shift origin of lut by 1 octave.
  17. lutsize = 1024;
  18. Xcosn = pi*[-(2*lutsize+1):(lutsize+1)]/lutsize; % [-2*pi:pi]
  19. order = nbands-1;
  20. %% divide by sqrt(sum_(n=0)^(N-1) cos(pi*n/N)^(2(N-1)) )
  21. %% Thanks to Patrick Teo for writing this out :)
  22. const = (2^(2*order))*(factorial(order)^2)/(nbands*factorial(2*order));
  23. %
  24. % Ycosn = sqrt(const) * (cos(Xcosn)).^order;
  25. %
  26. % analityc version: only take one lobe
  27. alfa= mod(pi+Xcosn,2*pi)-pi;
  28. Ycosn = 2*sqrt(const) * (cos(Xcosn).^order) .* (abs(alfa)<pi/2);
  29. himask = pointOp(log_rad, Yrcos, Xrcos(1), Xrcos(2)-Xrcos(1), 0);
  30. for b = 1:nbands
  31. anglemask = pointOp(angle, Ycosn, Xcosn(1)+pi*(b-1)/nbands, Xcosn(2)-Xcosn(1));
  32. banddft = ((-i)^(nbands-1)) .* lodft .* anglemask .* himask;
  33. band = ifft2(ifftshift(banddft));
  34. % bands(:,b) = real(band(:));
  35. % analytic version: full complex value
  36. bands(:,b)=band(:);
  37. bind(b,:) = size(band);
  38. end
  39. dims = size(lodft);
  40. ctr = ceil((dims+0.5)/2);
  41. lodims = ceil((dims-0.5)/2);
  42. loctr = ceil((lodims+0.5)/2);
  43. lostart = ctr-loctr+1;
  44. loend = lostart+lodims-1;
  45. log_rad = log_rad(lostart(1):loend(1),lostart(2):loend(2));
  46. angle = angle(lostart(1):loend(1),lostart(2):loend(2));
  47. lodft = lodft(lostart(1):loend(1),lostart(2):loend(2));
  48. YIrcos = abs(sqrt(1.0 - Yrcos.^2));
  49. lomask = pointOp(log_rad, YIrcos, Xrcos(1), Xrcos(2)-Xrcos(1), 0);
  50. lodft = lomask .* lodft;
  51. [npyr,nind] = buildSCFpyrLevs(lodft, log_rad, Xrcos, Yrcos, angle, ht-1, nbands);
  52. pyr = [bands(:); npyr];
  53. pind = [bind; nind];
  54. end