FreSca (Ray)
The frequency-scaling guidance trick that sharpens wan output
- ray_actors
- ray_actors
FreSca (Ray) is raylight's port of frequency scaling, a guidance trick that picked up real community buzz in 2025 - the kind of thing that shows up in workflow share posts next to TeaCache and CFG-Zero. If you've ever run a video model and thought "the output is fine but the details look soft, almost airbrushed," FreSca is aimed squarely at that complaint.
The mechanism is elegant and cheap. During sampling, CFG computes the difference between the conditional and unconditional predictions - that difference is the "guidance signal" that pushes the output toward your prompt. FreSca runs that signal through a Fourier transform and scales its low-frequency and high-frequency components differently before it's added back. High-frequency content is detail: edges, texture, fine motion. Low-frequency is structure: composition, lighting, overall shape. By default the node scales low frequencies down (1.0) and high frequencies up (1.25), which means more detail, without blasting up the whole CFG strength and blowing out the image. It's frequency separation as a sampling-time intervention instead of a Photoshop step.
The three inputs that matter
- scale_low - multiplier for the low-frequency (structure) component. Default 1.0. Lower it if you want less structural amplification.
- scale_high - multiplier for the high-frequency (detail) component. Default 1.25, the whole point of the node. Push higher for crisper detail, but past ~1.5–2 you start inviting noise and artifacts.
- freq_cutoff - the boundary between "low" and "high" frequency, in FFT bins (default 20). Leave it unless you have a specific reason; the default splits things where it generally works.
It hooks in as a pre-CFG function on the model, so it composes with the normal CFG flow rather than replacing it - and it needs an unconditional pass to work. The code short-circuits if there's no negative/uncond conditioning (conds_out <= 1), which is worth remembering: run it with a real CFG > 1 and a negative prompt, not with CFG 1, or it quietly does nothing.
Practical take
Start at the defaults. The common failure is cranking scale_high too far and getting grainy, overcooked output - 1.25 exists because it's the value that adds crispness without turning everything into noise. If you want more punch, raise scale_high a little before you touch freq_cutoff; if output starts looking crunchy, the fix is usually backing scale_high down, not fiddling with the cutoff.
Same install as everything else in the pack: ComfyUI Manager → "raylight", or clone + pip install -r requirements.txt. No model downloads. It's a raylight-only node (the "Ray" in the name is real - it patches the model inside the distributed workers), so if you're on single-GPU ComfyUI you'd use the community FreSca nodes instead; here it's built in so your multi-GPU run doesn't lose the trick.
Inputs (4)
| Name | Type | Default | Description |
|---|---|---|---|
| ray_actors | RAY_ACTORS | — | |
| scale_low | FLOAT | 1.000–10 | — |
| scale_high | FLOAT | 1.250–10 | — |
| freq_cutoff | INT | 201–10000 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| ray_actors | RAY_ACTORS | — |