Touch the wave.
See the transform.

Two small experiments built on two different models: a time-domain wave you can poke, and a Fourier-optics bench for apertures and filters. Nothing here is precomputed.

Ripple tank

A ripple tank for light: a 2D scalar wave equation on an optical table. The slit jaws absorb by default, like the tungsten blades of an X-ray slit; switch them to reflecting to see the standing waves an ideal mirror sends back. Click to ripple. Double-click to pin a source, double-click it again to remove it. Drag the barrier by its mount on the rail, a slit up or down by its opening, or a jaw's knife edge to change the gap. With the lattice in place, drag its middle to move it and its rim to rotate it, and watch for the angle where the detector lights up: that is the Bragg condition. At the right edge a film strip darkens where intensity arrives; click it for fresh film. Beside it, the thin line is the intensity arriving now and the heavy one its running average.

Fourier bench

A separate model: a monochromatic complex field and its 2D Fourier transform, not a time-domain wave. Pick an aperture, drag on the panels, and watch the far-field intensity and the filtered field respond.

APERTURE t(x,y) · drag to resize
|F|² · log display · drag = cutoff
|IFFT(H·F)|² · γ 0.5 display

How it works

The aperture is a transmission function t(x,y) on a 256 × 256 grid, lit by a uniform coherent plane wave, so the exit wave is U = t. Under the scalar, paraxial, coherent Fraunhofer approximation the far-field amplitude is proportional to the 2D Fourier transform of U; the middle panel shows log(1 + α|F|²) purely for visibility.

The filter multiplies the complex spectrum by a mask H — like a stop in the Fourier plane of a 4f lens system — and the right panel is the intensity of the inverse transform. Because the phase of F is kept, an unfiltered round trip returns the aperture exactly. Inverting the intensity |F|² alone would not: recovering the lost phase is the phase-retrieval problem, which this page does not solve.

Frequencies are in cycles per sample; the edge of the panel is 0.5. Propagation distance is not modeled here (that needs a Fresnel transfer function, not a bigger FFT).