reconSFpyrLevs.m 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. % RESDFT = reconSFpyrLevs(PYR,INDICES,LOGRAD,XRCOS,YRCOS,ANGLE,NBANDS,LEVS,BANDS)
  2. %
  3. % Recursive function for reconstructing levels of a steerable pyramid
  4. % representation. This is called by reconSFpyr, and is not usually
  5. % called directly.
  6. % Eero Simoncelli, 5/97.
  7. function resdft = reconSFpyrLevs(pyr,pind,log_rad,Xrcos,Yrcos,angle,nbands,levs,bands);
  8. lo_ind = nbands+1;
  9. dims = pind(1,:);
  10. ctr = ceil((dims+0.5)/2);
  11. % log_rad = log_rad + 1;
  12. Xrcos = Xrcos - log2(2); % shift origin of lut by 1 octave.
  13. if any(levs > 1)
  14. lodims = ceil((dims-0.5)/2);
  15. loctr = ceil((lodims+0.5)/2);
  16. lostart = ctr-loctr+1;
  17. loend = lostart+lodims-1;
  18. nlog_rad = log_rad(lostart(1):loend(1),lostart(2):loend(2));
  19. nangle = angle(lostart(1):loend(1),lostart(2):loend(2));
  20. if (size(pind,1) > lo_ind)
  21. nresdft = reconSFpyrLevs( pyr(1+sum(prod(pind(1:lo_ind-1,:)')):size(pyr,1)),...
  22. pind(lo_ind:size(pind,1),:), ...
  23. nlog_rad, Xrcos, Yrcos, nangle, nbands,levs-1, bands);
  24. else
  25. nresdft = fftshift(fft2(pyrBand(pyr,pind,lo_ind)));
  26. end
  27. YIrcos = sqrt(abs(1.0 - Yrcos.^2));
  28. lomask = pointOp(nlog_rad, YIrcos, Xrcos(1), Xrcos(2)-Xrcos(1), 0);
  29. resdft = zeros(dims);
  30. resdft(lostart(1):loend(1),lostart(2):loend(2)) = nresdft .* lomask;
  31. else
  32. resdft = zeros(dims);
  33. end
  34. if any(levs == 1)
  35. lutsize = 1024;
  36. Xcosn = pi*[-(2*lutsize+1):(lutsize+1)]/lutsize; % [-2*pi:pi]
  37. order = nbands-1;
  38. %% divide by sqrt(sum_(n=0)^(N-1) cos(pi*n/N)^(2(N-1)) )
  39. const = (2^(2*order))*(factorial(order)^2)/(nbands*factorial(2*order));
  40. Ycosn = sqrt(const) * (cos(Xcosn)).^order;
  41. himask = pointOp(log_rad, Yrcos, Xrcos(1), Xrcos(2)-Xrcos(1),0);
  42. ind = 1;
  43. for b = 1:nbands
  44. if any(bands == b)
  45. anglemask = pointOp(angle,Ycosn,Xcosn(1)+pi*(b-1)/nbands,Xcosn(2)-Xcosn(1));
  46. band = reshape(pyr(ind:ind+prod(dims)-1), dims(1), dims(2));
  47. banddft = fftshift(fft2(band));
  48. resdft = resdft + (sqrt(-1))^(nbands-1) * banddft.*anglemask.*himask;
  49. end
  50. ind = ind + prod(dims);
  51. end
  52. end