File Exchange

image thumbnail

N-dimensional Fourier interpolation

version 1.5 (2.35 KB) by

Performs N-D FFT interpolation with upsampling, downsampling, or mixed up- and downsampling



View License

Performs N-D FFT interpolation on any data for which fftn works. Will upsample by zero-filling, downsample by truncating high frequencies, or combine both up- and downsampling by dimension to allow arbitrary reshaping.

Comments and Ratings (7)

Kevin - I think the following one-line function (added to the bottom of the code) should do the trick.

   function i = odd(x)
   i = (floor(x/2)~=(x/2));

Kevin Sharp

This fails with ...

??? Undefined function or method 'odd' for input arguments of type 'double'.

Error in ==> fftInterpolate at 61
centeru = floor(newsz/2)+1+odd(newsz);


Dear author

please find
rng = [ceil(newsz/2)-ceil(sz/2)+1;ceil(newsz/2)-ceil(sz/2)+sz]';

and replace it with
rng = [ceil(newsz/2)-floor(sz/2)+1;ceil(newsz/2)-floor(sz/2)+sz]';

then the code also works with odd dimesions.

Matthias Wurm


code works excellent for data with even dimensions. In case of odd dimensions the code fails.


Matthias, I cannot get this to work. The example image posted seems to interpolate the peaks dataset by a factor of two. But when I run the following code, I don't get the same result:
>>> figure; subplot(1,2,1); imagesc(peaks);
>>> subplot(1,2,2); imagesc(fftInterpolate(peaks,2));
what's going on?

Matthias Schabel

This code is needed as well (append on to end of fftInterpolate.m file):

function subData = subRange(data,rng)

if (isempty(rng))
    subData = data;

sz = size(data);
dim = length(sz);

lo = rng(:,1)';
hi = rng(:,2)';

if (length(lo) ~= dim || length(hi) ~= dim)
    error('subRange :: dimension mismatch');

% replace zeros with lower/upper limit
for i=1:dim
    if (lo(i) == 0) lo(i) = 1; end;
    if (hi(i) == 0) hi(i) = sz(i); end;

if (any(lo<1) | any(hi > sz))
    error('subRange :: sub-range out of bounds');

switch (dim)
    case 1, subData = data(lo(1):hi(1));
    case 2, subData = data(lo(1):hi(1),...
    case 3, subData = data(lo(1):hi(1),...
    case 4, subData = data(lo(1):hi(1),...
    case 5, subData = data(lo(1):hi(1),...
            % generate string and use eval
            str = 'subData = data(';
            for i=1:dim
                str = [str 'lo(' num2str(i) '):hi(' num2str(i) ')'];
                if (i~=dim)
                    str = [str ','];
                    str = [str ');'];



Bug fixes and improved efficiency


Fixed bug that caused problems with odd dimensions and simplified code


fixed so it works correctly with odd sizes and mixed sizes, substantially simplified code

MATLAB Release
MATLAB 7 (R14)

Download apps, toolboxes, and other File Exchange content using Add-On Explorer in MATLAB.

» Watch video