View all functions

CategoryMath: Fft
GPUYes

What does the ifftshift function do in MATLAB / RunMat?

ifftshift(X) circularly shifts data so that the DC (zero-frequency) component returns to index 1 along each transformed dimension. It is the inverse of fftshift and is commonly used immediately before calling ifft.

How does the ifftshift function behave in MATLAB / RunMat?

  • When no dimensions are specified, every axis is shifted by ceil(size(X, dim) / 2).
  • Passing a list of dimensions restricts shifting to those axes; zeros and ones are treated as no-ops.
  • Odd-length dimensions shift by one additional element compared with fftshift, matching MATLAB's ifftshift parity rules.
  • Works for real, complex, logical, and GPU-resident tensors.
  • Empty arrays and scalars are returned unchanged.

ifftshift Function GPU Execution Behaviour

RunMat first attempts to execute the shift entirely on the GPU using the provider's circshift hook. If that is unavailable, RunMat gathers the data exactly once, performs the reorder on the host, and uploads the result so downstream computations can continue on the device. Scalars remain on their current device to avoid unnecessary transfers.

Examples of using the ifftshift function in MATLAB / RunMat

Undoing fftshift on an even-length spectrum

x = 0:7;
y = ifftshift(x);

Expected output:

y = [4 5 6 7 0 1 2 3];

Undoing fftshift on an odd-length spectrum

x = 1:5;
y = ifftshift(x);

Expected output:

y = [3 4 5 1 2];

Preparing data for inverse FFT

fx = fft(rand(1, 8));
centered = fftshift(fx);
restored = ifftshift(centered);
signal = ifft(restored);

Expected behaviour: restored matches fx and signal equals the original time-domain data (within floating-point tolerance).

Shifting only selected dimensions

A = reshape(1:12, 3, 4);
rowsShifted = ifftshift(A, 1);   % shift rows only
colsShifted = ifftshift(A, 2);   % shift columns only

Expected output:

rowsShifted =
     2     5     8    11
     3     6     9    12
     1     4     7    10

colsShifted =
     7    10     1     4
     8    11     2     5
     9    12     3     6

Using ifftshift with gpuArray data

G = gpuArray(0:7);
shifted = ifftshift(G);
host = gather(shifted);

Expected output:

host = [4 5 6 7 0 1 2 3];

GPU residency in RunMat (Do I need gpuArray?)

You can rely on RunMat's auto-offload to keep FFT data on the GPU. When a provider exposes circshift, ifftshift executes entirely on the device and the result remains GPU-resident. If no provider is registered—or it lacks circshift—RunMat gathers once, applies the host reorder, and uploads the result so the rest of the computation can still run accelerated. You can call gpuArray explicitly when you need MATLAB parity or to enforce a residency boundary.

FAQ

When should I call ifftshift?

Call ifftshift right before ifft (or ifftn) after you have applied fftshift-based processing in the frequency domain. It restores the DC component to index 1.

Is ifftshift always the inverse of fftshift?

Yes. For any supported input, ifftshift(fftshift(X)) returns X, including odd-length dimensions where the shift counts differ.

Does ifftshift modify data values?

No. It only reorders elements. Magnitudes, phases, and overall content stay the same.

Can I restrict ifftshift to specific axes?

Yes. Pass a dimension index, vector of indices, or logical mask exactly like in MATLAB.

Does ifftshift support gpuArray inputs?

Yes. RunMat keeps GPU data on-device whenever possible and falls back to a single gather/upload cycle otherwise.

See Also

fftshift, fft, ifft, circshift, gpuArray, gather

Source & Feedback