Frequency-Selective Structured Noise (FSS)
Keep the Shape, Replace the Texture
- PHASE
- MAGNITUDE
- PHASE
Here's a neat trick you can do with latents that you can't easily do in pixel space: keep everything slow about an image and replace everything fast with fresh random noise. That's frequency-selective structured noise, and it's the whole identity of this node. It's a genuinely clever frequency-domain tool - and it's also one of the least-documented nodes in the pack, absent from the README's node index entirely. You found it by searching, so here's the manual.
The idea comes from how an FFT splits an image: low frequencies carry the broad composition, high frequencies carry texture and detail. This node generates a new random field, FFTs it, and then builds an output where the magnitude comes entirely from the noise - but the phase is a mix of your reference latent's phase (below a cutoff radius) and the noise's phase (above it). Phase is the subtle part: it encodes where edges and structures sit, so preserving low-frequency phase keeps the composition recognizable while replacing the magnitude with noise rewrites the texture.
How it works
You feed it the PHASE output of the pack's SplitLatentPhaseMagnitude node (the one that converts a latent into FFT magnitude and phase latents). It generates Gaussian noise, FFTs it, and computes a radial mask: inside cutoff_radius_r the reference phase wins, outside it fades to noise phase over a smooth Gaussian transition whose softness is set by sigma. The two outputs - MAGNITUDE and PHASE - are both latents, and you feed them both into CombineLatentPhaseMagnitude to get back a spatial latent. Low cutoff = mostly original structure; high cutoff = mostly noise.
The inputs that matter
PHASE- the reference phase latent fromSplitLatentPhaseMagnitude.cutoff_radius_r- frequency radius below which reference phase is preserved (default 16).sigma- smoothness of the transition. Higher = less visible seam between original and replaced frequencies.seed- reproducibility of the noise.
Outputs: MAGNITUDE and PHASE (both LATENT).
Installing it
Part of Skoogeer-Noise. Manager → search "Skoogeer-Noise", or:
cd ComfyUI/custom_nodes
git clone https://github.com/ttulttul/Skoogeer-Noise
Restart ComfyUI. Only torch, numpy>=1.26, einops, pyyaml>=6.0.3 - no model files.
Common gotchas
The workflow is a chain: SplitLatentPhaseMagnitude → FrequencySelectiveStructuredNoise → CombineLatentPhaseMagnitude, and the magnitude/phase shapes must match or the combine node raises an error. It's also FFT work on latents, which means it operates on the 4D (B, C, H, W) layout - if your latent is a weird spatial size, keep the round trip in mind. And because the output magnitude is all noise, a high cutoff can wash out recognizable content faster than you'd think; start with a small radius and grow it. Not documented in the README, but the node ships and works - treat the source as the spec.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| PHASE | LATENT | Reference phase latent (from SplitLatentPhaseMagnitude). | |
| cutoff_radius_r | INT | 160–512 | Frequency radius below which the reference phase is preserved. |
| sigma | FLOAT | 2.00.1–10 | Smoothness of the cutoff transition (higher = smoother). |
| seed | INT | 00–18446744073709550000 | Seed for reproducible noise generation. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| MAGNITUDE | LATENT | — |
| PHASE | LATENT | — |