Code covered by the BSD License  

Highlights from
Interpolation Utilities

Interpolation Utilities

by

 

22 May 2012 (Updated )

A variety of interpolation utilities

said(x, y, xi, chi, eta, c)
function [yi, ypi] = said(x, y, xi, chi, eta, c)

% SAID 1-D piecewise Said interpolation
%    SAID(X,Y,XI,CHI,ETA,C) interpolates to find YI, the values of the
%    underlying function Y at the points in the array XI, using
%    piecewise Said interpolation.  X and Y must be vectors 
%    of length N.
%
%    C specifies the number of data points to use in the
%    interpolation.  The default is to use all points.
%
%    CHI and ETA specify functional parameters.  Parameters to finely
%    approximate popular interpolation kernels are:
%        Kernel                         chi      eta
%        ------                         -----    ----
%        Sinc                           -        0
%        Lanczos, M=2                   0.414    0.61
%        Lanczos, M=3                   0.284    0.64
%        Lanczos, M=4                   0.212    0.65
%        Lanczos, M=5                   0.170    0.65
%        Blackman-Harris, N=6           0.411    0.23
%        Cubic B-Spline                 0.310    0
%        Mitchell-Netravali, B=C=1/3    0.550    0.32

% Joe Henning - Fall 2012

% New Filters for Image Interpolation and Resizing
% Amir Said
% Media Technologies Laboratory
% HP Laboratories Palo Alto
% HPL-2007-179
% November 2, 2007

if (nargin < 6)
   c = 0;
end

n = length(x);

if (n < c)
   fprintf('??? Bad c input to said ==> c <= length(x)\n');
   yi = [];
   ypi = [];
   return
end

% Find the period of the undersampled signal
T = x(2) - x(1);

for i = 1:length(xi)
   % Find the right place in the table by means of a bisection.
   klo = 1;
   khi = n;
   while (khi-klo > 1)
      k = fix((khi+klo)/2.0);
      if (x(k) > xi(i))
         khi = k;
      else
         klo = k;
      end
   end
   
   h = x(khi) - x(klo);
   if (h == 0.0)
      fprintf('??? Bad x input to said ==> x values must be distinct\n');
      yi(i) = NaN;
      ypi(i) = NaN;
      continue;
   end

   % Evaluate Said function
   yi(i) = 0;
   ypi(i) = 0;
   if (c == 0)
      for k = 1:n
         t = xi(i)-x(k);
         a = sqrt(2*eta)*pi*chi/T/(2-eta);
         b = pi*chi/T/(2-eta);
         yi(i) = yi(i) + y(k)*sinc(t/T)*cosh(a*t)*exp(-b*t*b*t);
         ypi(i) = ypi(i) + y(k)*(cosc(t/T)/T*cosh(a*t)*exp(-b*t*b*t) + ...
                  sinc(t/T)*(sinh(a*t)*a*exp(-b*t*b*t) - 2*b*t*b*cosh(a*t)*exp(-b*t*b*t)));
      end
   else
      if (mod(c,2) == 0)   % even
         c2 = c/2;
         if (klo < c2)
            klo = c2;
         end
         if (klo > n-c2)
            klo = n-c2;
         end
         khi = klo + 1;
         for k = klo-(c2-1):klo+c2
            t = xi(i)-x(k);
            a = sqrt(2*eta)*pi*chi/T/(2-eta);
            b = pi*chi/T/(2-eta);
            yi(i) = yi(i) + y(k)*sinc(t/T)*cosh(a*t)*exp(-b*t*b*t);
            ypi(i) = ypi(i) + y(k)*(cosc(t/T)/T*cosh(a*t)*exp(-b*t*b*t) + ...
                     sinc(t/T)*(sinh(a*t)*a*exp(-b*t*b*t) - 2*b*t*b*cosh(a*t)*exp(-b*t*b*t)));
         end
      else   % odd
         c2 = floor(c/2);
         if (klo < c2+1)
            klo = c2+1;
         end
         if (klo > n-c2)
            klo = n-c2;
         end
         khi = klo + 1;
         for k = klo-c2:klo+c2
            t = xi(i)-x(k);
            a = sqrt(2*eta)*pi*chi/T/(2-eta);
            b = pi*chi/T/(2-eta);
            yi(i) = yi(i) + y(k)*sinc(t/T)*cosh(a*t)*exp(-b*t*b*t);
            ypi(i) = ypi(i) + y(k)*(cosc(t/T)/T*cosh(a*t)*exp(-b*t*b*t) + ...
                     sinc(t/T)*(sinh(a*t)*a*exp(-b*t*b*t) - 2*b*t*b*cosh(a*t)*exp(-b*t*b*t)));
         end
      end
   end
end

function y = sinc(x)
% normalized sinc function
i = find(x == 0);
x(i) = 1;   % Don't need this if divide-by-zero warning is off
y = sin(pi*x)./(pi*x);
y(i) = 1;

function y = cosc(x)
% derivative of normalized sinc function
i = find(x == 0);
x(i) = 1;   % Don't need this if divide-by-zero warning is off
%y = (pi*pi*x.*cos(pi*x) - pi*sin(pi*x))./(pi*x*pi.*x);
y = cos(pi*x)./x - sin(pi*x)./(pi*x.*x);
y(i) = 0;

Contact us