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

12 Downloads

Updated

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);

Matthias

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

Matthias

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

Benjamin

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;
return;
end;

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

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

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

% 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;
end;

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

switch (dim)
case 1, subData = data(lo(1):hi(1));
case 2, subData = data(lo(1):hi(1),...
lo(2):hi(2));
case 3, subData = data(lo(1):hi(1),...
lo(2):hi(2),...
lo(3):hi(3));
case 4, subData = data(lo(1):hi(1),...
lo(2):hi(2),...
lo(3):hi(3),...
lo(4):hi(4));
case 5, subData = data(lo(1):hi(1),...
lo(2):hi(2),...[]
lo(3):hi(3),...
lo(4):hi(4),...
lo(5):hi(5));
otherwise,
% 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 ','];
else
str = [str ');'];
end;
end;
eval(str);
end;

return;

Updates

1.5

Bug fixes and improved efficiency

1.4

Fixed bug that caused problems with odd dimensions and simplified code

1.3

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