Affine Ring Noise Noise Options
Targeting one frequency band with Affine's ring noise
- noise_options
WASRingNoiseOptions is the config node for Affine's ring_noise pattern, and it's the most surgical knob in the whole WAS Affine pack. Where most patterns spread an effect everywhere or everywhere-organic, ring noise isolates a single band of frequencies in the image and aims the transform only at the detail at that scale. Think of it as telling the affine step: "there's a specific texture size I want to push, and everything else - the flat tones, the fine grain, the big shapes - leave alone."
That makes it the pattern to reach for when you know the exact problem. Detail in the 0.85-of-Nyquist frequency band looks burned or mushy? Ring noise lets you nudge exactly that, rather than firing a broad-spectrum enhancement that also sharpens noise and hardens gradients.
How it works
The mask is generated in the frequency domain as a narrow annulus - a thin ring in 2D frequency space - then transformed back. Two inputs control it, and that's the whole node:
ring_center_frac(default 0.85, 0–1) - where the ring sits, as a fraction of the Nyquist radius. Nyquist is the highest representable frequency (the pixel grid's own limit), so 0.85 is close to the fine-detail edge. Lower it toward 0.3–0.5 and you're targeting mid-scale structures instead.ring_bandwidth_frac(default 0.06, 0.005–1) - how thick the ring is. A small value like the default means a very narrow frequency slice: precision. Widen it and the effect bleeds into neighboring scales.
A useful mental model: frequency = feature size. High frequency = fine detail and noise; low frequency = broad tone and composition. Ring noise picks a specific feature size and modulates only that. The README's own guidance files ring_noise under "fine detail work," and that's the honest use case - it's a detail-enhancement scalpel, not a general polish tool.
Wiring it up
Like every Affine options node, it outputs a single noise_options DICT. Connect it to the noise_options input of Latent Affine, KSampler Affine Advanced, or the Ultimate Affine KSampler variants, and set that node's pattern to ring_noise. Per the source, noise_options overrides the base options dict (from WASLatentAffineCommonOptions) where keys collide, so you can layer a common base with this as the pattern-specific layer.
The same catch as the rest of the family applies: if the consuming node's pattern isn't ring_noise, this node is decoration.
Installing it
It ships inside WAS Affine (WASasquatch/was_affine). Install via Manager - search "WAS Affine" - or clone:
cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/was_affine.git
Restart after installing. No models to download; dependencies are just torch/numpy (plus matplotlib in the shipped requirements, used by the schedule visualization). The pack explicitly does not require UltimateSDUpscale nodes even though the samplers borrow the name.
Gotchas worth knowing
- Default 0.85 sits right at the edge of noise. At that center fraction, "fine detail" and "image noise" are neighbors, so you can end up amplifying sensor-like grain instead of real structure. If your result gets crunchy, pull the center down toward 0.6–0.7.
- Bandwidth too narrow (default 0.06 is already narrow) can make the mask look like faint interference rather than enhancement. If you see rippling, widen it.
- Ring noise is deterministic per
affine_seedlike the other procedural patterns - if you want the same mask across a batch or across frames, keep that seed fixed (or use theaffine_seed_incrementtoggle to vary it deliberately).
Thin node, sharp effect. If you want "enhance exactly this scale of detail and nothing else," this is the one.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| ring_center_frac | FLOAT | 0.850–1 | Ring center as a fraction of Nyquist radius (0-1). |
| ring_bandwidth_frac | FLOAT | 0.0600.005–1 | Fractional bandwidth (thickness) of the ring. |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| noise_options | DICT | — |