Mercurial > hg > octave-lyh
diff scripts/signal/fftshift.m @ 4844:9f7ef92b50b0
[project @ 2004-04-02 17:26:53 by jwe]
author | jwe |
---|---|
date | Fri, 02 Apr 2004 17:26:54 +0000 |
parents | b5267e631ba8 |
children | 4c8a2e4e0717 |
line wrap: on
line diff
--- a/scripts/signal/fftshift.m +++ b/scripts/signal/fftshift.m @@ -19,6 +19,7 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {} fftshift (@var{v}) +## @deftypefnx {Function File} {} fftshift (@var{v}, @var{dim}) ## Perform a shift of the vector @var{v}, for use with the @code{fft} ## and @code{ifft} functions, in order the move the frequency 0 to the ## center of the vector or matrix. @@ -31,32 +32,55 @@ ## f = ((1:N) - ceil(N/2)) / N / Dt ## @end example ## -## If @var{v} is a matrix, the same holds for rows and columns. +## If @var{v} is a matrix, the same holds for rows and columns. If +## @var{v} is an array, then the same holds along each dimension. +## +## The optional @var{dim} argument can be used to limit the dimension +## along which the permutation occurs. ## @end deftypefn ## Author: Vincent Cautaerts <vincent@comf5.comm.eng.osaka-u.ac.jp> ## Created: July 1997 ## Adapted-By: jwe -function retval = fftshift (V) +function retval = fftshift (V, dim) retval = 0; - if (nargin != 1) - usage ("usage: fftshift (X)"); + if (nargin != 1 && nargin != 2) + usage ("usage: fftshift (X, dim)"); endif - if (isvector (V)) - x = length (V); - xx = ceil (x/2); - retval = V([xx+1:x, 1:xx]); - elseif (ismatrix (V)) - [x, y] = size (V); - xx = ceil (x/2); - yy = ceil (y/2); - retval = V([xx+1:x, 1:xx], [yy+1:y, 1:yy]); + if (nargin == 2) + if (!isscalar (dim)) + error ("fftshift: dimension must be an integer scalar"); + endif + nd = ndims (V); + sz = size (V); + sz2 = ceil (sz(dim) / 2); + idx = cell (); + for i=1:nd + idx {i} = 1:sz(i); + endfor + idx {dim} = [sz2+1:sz(dim), 1:sz2]; + retval = V (idx{:}); else - error ("fftshift: expecting vector or matrix argument"); + if (isvector (V)) + x = length (V); + xx = ceil (x/2); + retval = V([xx+1:x, 1:xx]); + elseif (ismatrix (V)) + nd = ndims (V); + sz = size (V); + sz2 = ceil (sz ./ 2); + idx = cell (); + for i=1:nd + idx{i} = [sz2(i)+1:sz(i), 1:sz2(i)]; + endfor + retval = V (idx{:}); + else + error ("fftshift: expecting vector or matrix argument"); + endif endif endfunction