RunMat
GitHub

fftshift — Shift zero-frequency components to spectrum centers in MATLAB and RunMat.

fftshift(X) circularly shifts FFT output so the zero-frequency component moves to the center of each shifted dimension. The default all-dimension behavior and optional dimension selection follow MATLAB semantics.

Syntax

Y = fftshift(X)
Y = fftshift(X, DIM)

Inputs

NameTypeRequiredDefaultDescription
XAnyYesNumeric, complex, logical, or gpuArray input.
DIMAnyNo[]Dimension selector (scalar, numeric vector, or logical mask vector).

Returns

NameTypeDescription
YAnyShifted array with the same size and type family as X.

Errors

IdentifierWhenMessage
RunMat:fftshift:ArgCountMore than two input arguments are supplied.fftshift: invalid argument count
RunMat:fftshift:InvalidDimensionsDIM argument is malformed or out of range.fftshift: invalid dimension argument
RunMat:fftshift:InvalidInputX is not a supported numeric/logical input type.fftshift: expected numeric or logical input

How fftshift works

  • When called without a dimension list, fftshift shifts along every dimension by floor(size(X, dim) / 2).
  • fftshift(X, dims) shifts only the specified dimensions. dims can be a scalar, vector, or logical mask.
  • Dimensions of length 0 or 1 are left unchanged.
  • Inputs can be real or complex and may already reside on the GPU (gpuArray).

Does RunMat run fftshift on the GPU?

RunMat asks the active acceleration provider to execute fftshift via the circshift hook (with predetermined offsets). If the provider cannot satisfy the request, the tensor is gathered exactly once, shifted on the host, and optionally re-uploaded. Scalars remain on their existing device.

GPU memory and residency

RunMat's auto-offload keeps FFT spectra on the GPU whenever the active provider exposes the circshift hook. In that case fftshift runs entirely on the device and downstream fused operations continue without a gather. If no GPU provider is registered—or it does not expose circshift—RunMat gathers the data once, performs the host shift, and uploads the result back to the device so subsequent work can still benefit from acceleration. You can always call gpuArray explicitly when you need MATLAB compatibility or want to guarantee a specific residency boundary.

Examples

Centering the spectrum of a 1-D FFT result with even length

x = [0 1 2 3 4 5 6 7];
fx = fft(x);
y = fftshift(fx)

Expected output:

y = [-4 -4-1.6569i -4-4i -4-9.6569i 28 -4+9.6569i -4+4i -4+1.6569i]

Handling odd-length vectors

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

Expected output:

y = [4 5 1 2 3]

Centering both axes of a 2-D FFT

A = [1 2 3; 4 5 6];
C = fftshift(A)

Expected output:

C =
     6     4     5
     3     1     2

Shifting only one dimension of a matrix

A = [1 2 3; 4 5 6];
rowCentered = fftshift(A, 1)   % shift rows only

Expected output:

rowCentered =
     4     5     6
     1     2     3

Applying fftshift to a gpuArray spectrum

G = gpuArray(0:7);
centered = fftshift(G);
H = gather(centered)

Expected output:

H = [4 5 6 7 0 1 2 3]

Using fftshift with coding agents

Open a RunMat example with live inputs, then ask the agent to explain how fftshift changes the result.

Run a small fftshift example, explain the result, then change one input and compare the output.

FAQ

When should I call fftshift?

Call fftshift whenever you need to center FFT outputs before visualising spectra, computing radial averages, or applying filters that expect zero frequency in the middle of the array.

Does fftshift modify the phase or magnitude of the FFT?

No. fftshift only reorders the samples. Magnitudes, phases, and the overall information content remain unchanged.

How do I undo fftshift?

Use ifftshift, which performs the inverse rearrangement. The sequence ifftshift(fftshift(X)) returns X for all supported inputs.

Can I apply fftshift to only one dimension?

Yes. Pass a dimension index or vector, e.g. fftshift(X, 2) to shift column channels only.

Does fftshift work with gpuArray inputs?

Yes. RunMat keeps data on the GPU whenever the provider exposes the circshift hook, matching MATLAB's gpuArray behaviour.

How does fftshift handle empty inputs?

Empty arrays are returned unchanged with identical shape metadata.

Can I use fftshift on logical arrays?

Yes. Logical arrays are shifted without changing their logical element type.

Fft

fft · fft2 · ifft · ifft2 · ifftshift

Elementwise

abs · angle · complex · conj · double · exp · expm1 · factorial · gamma · heaviside · hypot · imag · ldivide · log · log10 · log1p · log2 · minus · nextpow2 · plus · pow2 · power · rdivide · real · sign · single · sqrt · times

Trigonometry

acos · acosh · asin · asinh · atan · atan2 · atanh · cos · cosd · cosh · deg2rad · rad2deg · sin · sind · sinh · tan · tand · tanh

Reduction

all · any · cummax · cummin · cumprod · cumsum · cumtrapz · diff · gradient · max · mean · median · min · nnz · prod · std · sum · trapz · var

Rounding

ceil · fix · floor · mod · rem · round

Factor

chol · eig · lu · qr · svd

Solve

cond · det · inv · linsolve · norm · null · pinv · rank · rcond · rref

Symbolic

digits · int · limit · sym · syms · vpa

Interpolation

interp1 · interp2 · pchip · ppval · spline

Ode

ode15s · ode23 · ode45

Open-source implementation

Unlike proprietary runtimes, every RunMat function is open-source. Read exactly how fftshift is executed, line by line, in Rust.

About RunMat

RunMat is an open-source runtime that executes MATLAB-syntax code blazing on any GPU. It is licensed under the Apache 2.0 license.

  • RunMat automatically optimizes your math for GPU execution on Apple, Nvidia, and AMD hardware. No code changes needed. Simulations that took hours now take minutes.
  • Start running code in seconds. RunMat runs in the browser, on the desktop, or from the CLI. No license server, no IT ticket.

Getting started · Benchmarks · Pricing

Download RunMat

Download RunMat for full performance, or use RunMat in your browser for zero setup.