Nodes/Skoogeer-Noise/Conditioning (Frequency Split)
ComfyUI Node

Conditioning (Frequency Split)

Pull a Prompt Apart by Frequency to Rebalance Its Grip

By ttulttul·Created 9 months ago·Updated 3 months ago· 14
Conditioning (Frequency Split)
  • conditioning
  • low_pass
  • high_pass
sigma0.75

Most people think of a prompt as a list of words. ComfyUI thinks of it as an embedding - a tensor where each token is a row of features. Conditioning Frequency Split does something most prompt tools never let you do: it splits that embedding into a low-frequency band and a high-frequency band, so you can treat the prompt's "gist" and its "details" as separate signals.

The mechanism is delightfully simple. It blurs the embedding along the token dimension with a Gaussian kernel, and that blurred version is the low_pass output - the smooth, global summary of what the prompt is about. The high_pass output is literally the original minus the blur: the per-token, per-feature detail that the smoothing erased. sigma is the cutoff - bigger sigma means a wider blur and more energy pushed into the high band. Blurring "along the token axis" means adjacent tokens (adjacent words in the prompt) get averaged together, which is what makes low-pass a "gist" and high-pass a "detail" channel.

The practical move is to split, re-weight, and merge back with the pack's Conditioning (Frequency Merge) node - that's a four-node chain that lets you, say, double the high-frequency band to make a prompt bite harder on details, or boost the low band to make it act more as a global mood-setter. You can also just use the high_pass output as a conditioning on its own, which is a shortcut to a prompt that's all edge and no structure - weird, but a fun way to find out what your text encoder's sharpest features actually are.

Inputs are just conditioning and sigma (default 0.75). Outputs are low_pass and high_pass, both CONDITIONING, and both keep the metadata dict (including pooled_output) intact - the high band zeros the pooled output, since a pooled vector has no token dimension to split.

Installing

This is part of the Skoogeer-Noise pack by ttulttul:

cd ComfyUI/custom_nodes
git clone https://github.com/ttulttul/Skoogeer-Noise

Restart, or install via ComfyUI Manager ("Skoogeer-Noise"). Only torch/numpy/einops/pyyaml as dependencies, no models to fetch, and the whole thing is a conv1d on CPU - instant on any setup.

Gotchas

The main trap is treating the split like an image split. In image-land, low-pass looks blurry; here, both outputs are full-precision embeddings, and if you feed either band to a sampler on its own you get something that is decidedly not "the prompt with the detail removed." It's a reweighting tool - use it with the merge node, or accept that solo bands are an experimental look. Also, sigma <= 0 makes the split degenerate (low = copy, high = zeros), so leave it at a sane positive value. Conditioning operates on the embedding tensor, so this is model-agnostic - SD, SDXL, Flux, it doesn't care what encoded it.

Categoryconditioning/filter

Inputs (2)

NameTypeDefaultDescription
conditioningCONDITIONINGConditioning list to separate into low/high bands.
sigmaFLOAT0.750–10Cutoff for the Gaussian low-pass applied along the token axis.

Outputs (2)

NameTypeDescription
low_passCONDITIONING
high_passCONDITIONING