feTurbulence draws a Perlin-noise-like random pattern. On its own it just looks like colourful static, but feed it into feDisplacementMap as in2 and it becomes a push-map: "shift each source pixel in x/y by however much this noise's R/G channels say." The result is the original content wobbling along the noise's contours.
baseFrequency controls how fine the noise is (smaller = big, smooth swells; larger = tight, jittery ripples), and feDisplacementMap's scale controls how hard it pushes. This demo oscillates both on a sine wave every frame for a continuous underwater-style wobble.
The catch is cost — noise generation and displacement are recomputed across the whole filter region every frame, so it gets noticeably heavy over a large area or the full page. Keep it scoped to small elements like text or a logo.
When to use
Scope it to one small element — a headline, a logo — for an underwater or heat-haze feel. Keep numOctaves around 2 to hold down the cost.