Spectral Blur — User Guide

Global FFT magnitude smoothing with phase preservation, repeated binomial kernels, two tail strategies and multichannel wet/dry rendering.

Author: Shai Cohen Affiliation: Department of Music, Bar-Ilan University, Israel Version: 2.4 (2026) License: MIT License Repo: https://github.com/ShaiCohen-ops/Praat-plugin_AudioTools
Contents:

What this does

Spectral Blur smooths the magnitude of each channel's global FFT spectrum while preserving that spectrum's phase. Repeated binomial smoothing passes spread energy across neighbouring frequency bins, softening narrow peaks and valleys while retaining the complex phase angles used for inverse transformation.

Important: this is a whole-sound FFT blur, not a frame-by-frame spectrogram blur. The magnitude smoothing is therefore global for each processed channel. The two Tail modes differ mainly in whether extra silence is included before that FFT is computed.

What is spectral blur?

A complex FFT spectrum has a magnitude and a phase at each frequency bin. The script computes the original magnitude, repeatedly smooths it with a symmetric binomial kernel, then multiplies both the real and imaginary spectrum rows by the same ratio:

ratio[k] = smoothedMagnitude[k] / originalMagnitude[k] Re'[k] = Re[k] × ratio[k] Im'[k] = Im[k] × ratio[k]

Because the same positive ratio scales both complex components, the phase angle of each non-zero bin is preserved. The audible change comes from redistributing spectral magnitude across neighbouring bins.

The script reports an approximate blur width in Hz using the accumulated variance of the repeated binomial kernels. More passes and wider kernels increase that effective frequency-domain smoothing.

Quick start

  1. Select exactly one Sound.
  2. Run Spectral_Blur.praat.
  3. Start with Standard Blur or Metallic Sheen.
  4. Use Blur_passes for depth and Blur_type for local kernel width.
  5. Choose Stable core when you want the blur inside the original duration to be independent of the requested tail; choose Extended FFT tail for the older long-tail character.

Presets

PresetPassesKernelWet
Standard Blur10Medium (5-bin)100%
Ethereal Pad30Wide (7-bin)100%
Underwater20Wide (7-bin)85%
Metallic Sheen5Narrow (3-bin)70%
Extreme Wash50Wide (7-bin)100%
CustomUses the values entered in the form.

Presets do not replace Tail_seconds, Tail_behavior, Fade_out_seconds or Scale_peak.

Controls

ControlDefaultMeaning
Blur_passes10Number of repeated smoothing passes; internally clamped to 1…100.
Blur_typeMediumNarrow = [1 2 1]/4; Medium = [1 4 6 4 1]/16; Wide = 7-bin Pascal/binomial kernel.
Wet_dry_percent100Linear blend of processed and original signal; clamped to 0…100.
Tail_seconds1.0Requested extra output duration, interpreted differently by the two Tail modes.
Tail_behaviorExtended FFT tailSelects explicit pre-FFT padding or stable-core use of Praat's internal FFT padding.
Fade_out_seconds0.5Raised-cosine fade at the final output ending.
Scale_peak0.95Final target peak; must be >0 and ≤1.

Tail behaviour

Extended FFT tail (v2.2 character)

The source channel is explicitly extended with Tail_seconds of silence before the FFT. This guarantees the requested tail length, but it changes the FFT size and bin lattice. Because the blur itself works in FFT bins, changing Tail_seconds can therefore change the texture heard even inside the original source duration.

Stable core

The FFT input remains exactly the original channel length. Praat's FFT already introduces internal zero-padding to an efficient transform size; after inverse FFT, the script retains up to the requested Tail_seconds from that existing padding. The retained tail can therefore be shorter than requested, but Tail_seconds cannot alter the core FFT lattice or the blur heard inside the source.

In Stable core mode, when a positive tail was requested, the final fade is limited to the actually retained tail so it does not reach backward into the original source region.

Processing pipeline

  1. Process every source channel independently.
  2. Construct the FFT input according to the selected Tail behaviour.
  3. Convert the complete channel to a complex Spectrum.
  4. Extract the magnitude and repeatedly smooth it with the selected binomial kernel using ping-pong buffers.
  5. Scale the original complex bins by smoothed/original magnitude, preserving phase.
  6. Transform back to Sound and trim to the requested/available duration.
  7. Recombine all processed mono channels into a multichannel Sound.
  8. Blend the original dry signal over the source portion; the added tail is wet-only (or silence at 0% wet).
  9. Apply the final fade, then target-normalize the whole result to Scale_peak.

Channels, mix and level

Output name: <source>_blur_<preset>.

Visualization