Frequency Modulation WIP | GlitchNodes
FM radio, but for your image
- image
- image
FrequencyModulation treats your image like a broadcast signal: it modulates the pixel data onto a carrier wave, runs it through low-pass filters, and demodulates it back - the visual equivalent of picking up a station through static. It's one of the two nodes in GlitchNodes that aren't even listed in the pack README (ASCII is the other), and its display name says it plainly: WIP. Which is to say: expect rough edges, but the effect is genuinely unlike anything else in the pack - wavy, radio-static distortions that ripple through the whole frame.
The math is straight out of a signals textbook. The image is phase-modulated onto a cosine carrier (carrier_frequency sets the wave), then the demodulated result passes through up to three cascaded low-pass filters with independent cutoffs (lowpass1_cutoff, lowpass2_cutoff, lowpass3_cutoff, each 0.01–1.0). Lower cutoffs = more aggressive smoothing = more visible smear. There's also a bandwidth control for how much of the spectrum survives. It runs in RGB or YUV colorspace - YUV is worth trying because modulating luma separately from chroma gives you that distinct broadcast-decay color bleeding.
The inputs that matter
- carrier_frequency (0.01–100, default 10) - the wave everything rides on. Low values give big, slow undulations; high values get into fine moiré territory.
- bandwidth (0.1–100, default 10) - how much frequency content passes through.
- lowpass1/2/3_on and their cutoffs - the filter stack. Defaults (0.25, 0.1, 0.05) already produce a strong effect; turn filters off if you want the raw modulated mess.
- quantization (0–255, default 0) - bit-depth reduction on the way through; 0 is off.
- negate - inverts the signal phase, which flips the artifact pattern.
- blend_mode -
NONE,ADD,SUBTRACT,MULTIPLY,SCREEN, orOVERLAY. This blends the modulated result back with the original - the single most useful control for keeping the output usable.SCREENandOVERLAYlet you keep the image recognizable while the static plays over it. - first_channel_only - process just the first channel and leave the rest alone.
Output is image (IMAGE) → PreviewImage/SaveImage.
Installing it
One pack install covers it: ComfyUI Manager → Install Custom Nodes → search "GlitchNodes", or:
cd ComfyUI/custom_nodes
git clone https://github.com/pxl-pshr/GlitchNodes
# restart ComfyUI
Dependencies are the standard GlitchNodes set - numpy, torch, Pillow, opencv-python, scipy. No models to fetch.
Gotchas
Where people get burned: everything at default can flatten your image into a smear, because three stacked low-pass filters are a lot of filtering. Before you decide it's broken, drop bandwidth, raise the cutoffs, or switch blend_mode off NONE to a blend that preserves the original. And remember it's WIP - the node's own README entry doesn't exist, and the pack's global disclaimer is that anything may "break or even error." Tinker in small steps, keep the original wired to a PreviewImage alongside it, and you'll be fine.
Inputs (14)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| carrier_frequency | FLOAT | 10.000.01–100 | — |
| bandwidth | FLOAT | 10.00.1–100 | — |
| quantization | INT | 00–255 | — |
| colorspace | COMBO | 2 options: RGB, YUV | |
| first_channel_only | BOOLEAN | false | — |
| lowpass1_on | BOOLEAN | true | — |
| lowpass2_on | BOOLEAN | true | — |
| lowpass3_on | BOOLEAN | true | — |
| lowpass1_cutoff | FLOAT | 0.250.01–1 | — |
| lowpass2_cutoff | FLOAT | 0.100.01–1 | — |
| lowpass3_cutoff | FLOAT | 0.050.01–1 | — |
| negate | BOOLEAN | false | — |
| blend_mode | COMBO | 6 options: NONE, ADD, SUBTRACT, MULTIPLY, SCREEN, OVERLAY |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |