ComfyUI Node

Noise Floor Lifter

Subtract the spectral noise floor the way audio engineers have for forty years

By EdoardoGuerriero·Created 2 months ago·Updated 2 months ago· 0
Noise Floor Lifter
  • image
  • image
floor_percentile10.0
strength0.70
over_subtraction1.00
preserve_dctrue
tile_size0
tile_overlap64

AI-generated images and heavily compressed sources share a spectral fingerprint: the noise floor is elevated. Natural photographs have a spectrum that falls off smoothly and quietly; a generation or a brutal JPEG pass leaves a flat, raised bed of energy underneath everything. That bed is nearly invisible in pixels but it reads as grain, sparkle, and "AI-ish" texture once the VAE encoder and diffusion model get their hands on it. NoiseFloorLifter is the node in ComfyUI-Spectral-Preprocessing-Nodes that simply subtracts that bed.

It's the direct translation of spectral subtraction - the same technique audio noise-reduction plugins have used for decades. Estimate the noise floor, subtract it from the spectrum, keep the signal. The README's positioning is that it's particularly effective on AI-generated images and compressed sources, where the floor is measurably higher than in natural photos.

How it works

The node looks at the distribution of all FFT magnitude coefficients and takes a low percentile of that distribution as the noise-floor estimate - floor_percentile at 10.0 means the 10th percentile coefficient is the floor. It then subtracts that estimate (times over_subtraction, times strength) from the magnitude spectrum and IFFTs back.

The key design virtue: because the subtraction is global and uniform - one number, applied everywhere - it introduces zero spatial ringing. Other approaches that carve the spectrum adaptively can ring; this one can't, because it never makes a per-coefficient decision. It just lifts the whole floor.

The inputs that matter

  • floor_percentile (default 10.0) - the percentile of the magnitude distribution used as the floor estimate. Lower = more conservative (smaller floor estimate, less subtraction). The README's tuning guide suggests 5–15 for AI-upscale noise specifically.
  • strength (default 0.7) - the fraction of the floor estimate to actually subtract. This is your blend-into-original knob.
  • over_subtraction (default 1.0) - a multiplier on the floor estimate. Values above 1 subtract more aggressively, which the tooltip recommends for strongly contaminated images - with the warning that high values can remove weak genuine signal.
  • preserve_dc (default True) - keep the DC coefficient (mean brightness) untouched. Leave it on; you don't want the node shifting overall brightness.

Plus the pack-standard tile_size / tile_overlap for images above ~2048px, where the tooltip suggests 512–1024 tiles with 64–128 overlap. One output, image.

Installing it

Ships in ComfyUI-Spectral-Preprocessing-Nodes - install the pack once, all sixteen nodes appear under Spectral Preprocessing. ComfyUI Manager (search "ComfyUI-Spectral-Preprocessing-Nodes"), or:

cd ComfyUI/custom_nodes
git clone https://github.com/EdoardoGuerriero/ComfyUI-Spectral-Preprocessing-Nodes

Restart. Only numpy and scipy - both bundled with ComfyUI. No models, no downloads.

Where people get burned

The failure mode is subtracting too much. Because the floor estimate is percentile-based, it rides up with the actual content - a noisy or textured image has a higher 10th percentile, so the node subtracts more. If the output starts looking flat or like fine detail is vanishing, back off over_subtraction toward 1.0 and lower strength rather than chasing it with the percentile. And the useful mental model from the pack's README: this node is a prerequisite-adjacent step for the whole chain, since a raised noise floor makes every other spectral statistic (radial profiles, spike z-scores) noisier to estimate. Clean the floor first - the README's recommended stacking puts it third, after Spike Suppressor and DirectionalArtifactSuppressor - and the rest of the nodes have better statistics to work with.

CategorySpectral Preprocessing

Inputs (7)

NameTypeDefaultDescription
imageIMAGE
floor_percentileFLOAT10.01–49Percentile of the magnitude distribution used as the noise floor estimate. 10 = the 10th percentile of all FFT coefficients. Lower = more conservative estimate.
strengthFLOAT0.700–1Fraction of the noise floor estimate to subtract.
over_subtractionFLOAT1.001–3Multiplier on the floor estimate. Values > 1 subtract more aggressively, useful for strongly contaminated images, but may remove weak genuine signal at high values.
preserve_dcBOOLEANtrueLeave the DC coefficient (mean brightness) untouched.
tile_sizeINT00–2048Tile size for large images. 0 = process whole image at once. Use 512–1024 for images larger than 2048px.
tile_overlapINT640–512Overlap in pixels between adjacent tiles (used only when tile_size > 0).

Outputs (1)

NameTypeDescription
imageIMAGE