Frequency Shifter — User Guide
Moves every spectral component by the same number of hertz using single-sideband frequency shifting.
What this does
Frequency Shifter moves every frequency component up or down by a fixed amount in hertz. A 440 Hz component shifted by +100 Hz moves to 540 Hz; a 1000 Hz component moves to 1100 Hz. The spacing between harmonics therefore changes, which can turn harmonic material into metallic, bell-like, robotic or strongly inharmonic spectra.
This is different from conventional pitch shifting. A pitch shifter multiplies frequencies by a ratio, so an octave up maps 440 Hz to 880 Hz and 880 Hz to 1760 Hz. This tool instead adds the same number of hertz to every component.
The processor uses single-sideband modulation built from the original signal and its Hilbert-transform quadrature component. Processing is performed in overlapping Hann-windowed grains and reconstructed with weighted overlap-add. All input channels are processed and preserved.
Quick start
- In Praat, select exactly one Sound.
- Run
Frequency Shifter.praat. - Choose a preset, or use Custom and set Shift_hz, Direction and Dry_wet_mix.
- For upward shifts, consider enabling Pre_limit_to_avoid_aliasing when important source energy extends close to Nyquist.
- Choose the desired output-level behavior, then click OK.
Presets
| Preset | Shift | Dry/Wet | Character |
|---|---|---|---|
| Custom | Uses the form values | Uses the form value | Manual control. |
| Subtle Detune (15 Hz) | +15 Hz | 25% wet | Small frequency offset blended under the source. |
| Chorus Thick (8 Hz) | +8 Hz | 40% wet | Slow beating and spectral thickening. |
| Metallic Ring (200 Hz) | +200 Hz | 100% wet | Clearly inharmonic, metallic transformation. |
| Robot Voice (150 Hz) | +150 Hz | 80% wet | Strong inharmonic vocal coloration with some dry structure retained. |
| Horror Alien (666 Hz) | +666 Hz | 100% wet | Large spectral displacement. |
| Deep Sub (-100 Hz) | −100 Hz | 70% wet | Downward shift with low-frequency reflection when components cross 0 Hz. |
| Bell Shimmer (1200 Hz) | +1200 Hz | 80% wet | Large upward shift; aliasing protection becomes especially relevant. |
Presets set the shift, direction and Dry/Wet amount. The anti-alias pre-limit, output-level mode, ceiling, visualization and playback choices remain under the user's control.
Parameters
| Control | Default | What it changes |
|---|---|---|
| Preset | Custom | Selects one of the prepared shift/mix combinations above. |
| Shift_hz | 100 | Magnitude of the fixed frequency displacement in hertz. The selected Direction determines its sign. |
| Direction | Up | Up makes the shift positive; Down makes it negative. |
| Dry_wet_mix | 1.0 | 0 = original signal only; 1 = shifted signal only. Intermediate values blend the two. |
| Pre_limit_to_avoid_aliasing | Off | For upward shifts, low-passes the wet source only before shifting so energy that would cross Nyquist is reduced. It never filters the dry path. |
| Output_level_mode | Natural level | Chooses whether the result keeps its natural level, is attenuated by a safety ceiling, is matched to the input RMS, or is peak-normalized. |
| Ceiling_peak | 0.95 | Peak target used by Safety ceiling and Peak normalize. |
| Draw_visualization | On | Draws the original and shifted spectrograms plus a processing summary. |
| Play_after_processing | On | Plays the result after processing. If the stored output exceeds 1.0, playback uses a temporary scaled copy; the stored Sound is not changed. |
The script requires a shift magnitude smaller than Nyquist. With the standard internal 100 ms grain and 50 ms hop, the selected Sound must be at least about 150 ms long.
How the shift works
For the wet signal, each overlapping grain is converted into an analytic-style pair: the original grain and a 90° quadrature version produced with a Hilbert transform. They are combined with a sinusoidal carrier whose phase follows global time. The result keeps one modulation sideband and suppresses the other, producing a true fixed-Hz frequency displacement rather than ring-modulation sidebands.
output frequency ≈ input frequency + signed shiftGrains are Hann-windowed on analysis and again on synthesis. A Hann² weight buffer is used during overlap-add so the reconstructed level remains stable across grain boundaries. The padded result is then trimmed back to the original sample span.
The same signed shift is applied independently to every channel. Channel count, sample rate and duration are preserved, and the original Sound start time is restored before the final object is named.
Aliasing and low-frequency reflection
Upward shifts
An upward shift can push source components beyond Nyquist. Without protection, those components fold back into the audible spectrum as aliases. The boundary is approximately:
highest safe source frequency = Nyquist − shiftIf Pre_limit_to_avoid_aliasing is enabled and more than 100 Hz remains below Nyquist, the wet source is low-passed at that boundary before it enters the shifter. The dry signal remains untouched, so 0% wet at Natural level is a true sample-for-sample bypass.
If the requested upward shift leaves 100 Hz or less below Nyquist, there is not enough room for the script's pre-filter transition. In that case the script reports that the pre-limit is unavailable and aliasing can remain.
Downward shifts
A downward shift does not encounter the Nyquist boundary in the same way, but components that cross 0 Hz cannot remain at negative physical frequency. They reflect back upward. For example, 440 Hz shifted by −666 Hz appears at 226 Hz. This low-frequency reflection is part of the frequency-shifting operation, not pitch transposition.
Visualization
When enabled, the Picture window shows:
- an Original spectrogram;
- a Shifted spectrogram using the same displayed frequency range, up to 5 kHz or Nyquist;
- a summary with the signed shift, grain/hop geometry, Dry/Wet amount, aliasing or pre-limit status, input/output peak, input RMS, level action and number of processed channels.
For multichannel Sounds, the spectrograms display one real input channel chosen by highest RMS rather than folding channels to mono. This avoids a misleading display when channels contain anti-phase material. The audio processing itself still preserves and processes every channel.
Output behavior
- Object name:
<source>_shift+NHzor<source>_shift-NHz, where the displayed shift in the name is rounded to a whole hertz. - Channels: preserved; every channel is shifted independently.
- Sample rate: preserved.
- Duration: preserved.
- Start time: the original
xminis restored. - Randomness: none; the same input and settings produce the same result.
Output level modes
| Mode | Behavior |
|---|---|
| Natural level | No automatic gain change after the frequency shift and Dry/Wet mix. |
| Safety ceiling | Attenuates only when the result exceeds Ceiling_peak; otherwise leaves the level unchanged. |
| Match input RMS | Scales the final result so its RMS matches the input RMS. This mode does not subsequently enforce the safety ceiling. |
| Peak normalize | Scales every non-silent result so its peak equals Ceiling_peak. |
If Natural level, Safety ceiling or Match input RMS leaves a stored peak above 1.0, the script reports a clipping warning. Playback uses a temporary 0.95-peak copy in that situation, while the stored result remains unchanged.