IR Analysis — User Guide
Measure the decay and clarity of a recorded impulse response, prepare it as a convolution kernel, reshape the measured space into creative IR material, and audition that space on another Sound — entirely inside Praat.
What this does
IR Analysis has two deliberately separated roles. First, it analyzes the selected Sound as a measured impulse response using decay and clarity measures. Second, if requested, it derives new Sound objects from that measurement: a trimmed convolution-ready IR, complementary early/late components, a creatively sculpted IR, and an audition result produced by convolving the IR with another open Sound.
The measurement is always completed before preparation or creative processing begins. The selected Sound itself is never modified by the creative stage, and all reported room-acoustic figures refer to the original analyzed response.
<source>_IRart is a derived artistic object. If it is analyzed again, the resulting figures describe that sculpture, not the original room.Measurement → sculpture
The stages are intentionally one-way. Creative processing never feeds back into the measurement engine.
Quick start
- Select exactly one Sound containing the impulse response or impulse-like room response to analyze.
- Run
IR_Analysis.praat. Channel 1 is analyzed by default. - Keep Lundeby (recommended) truncation unless you specifically want raw integration to the end of the Sound.
- Choose Broadband + octave bands when comparative band information is useful; choose broadband only for a faster, simpler run.
- Enable Prepare_convolution_ready_IR to create a trimmed kernel aligned to the direct sound by default.
- Enable Creative_IR_processing to choose a creative starting point and then edit the six sculpting controls.
- Enable Audition_on_another_Sound to hear the prepared or creative IR convolved with another Sound that is already open in Praat.
Acoustic analysis
The broadband measurement follows an ISO 3382-1-style decay workflow implemented entirely with native Praat operations.
| Measure / stage | Implementation |
|---|---|
| Start point | By default, the first sample reaching −20 dB relative to the peak. Advanced settings can instead use the peak sample or the start of the Sound. |
| Noise & truncation | Iterative Lundeby crosspoint estimation. If the crosspoint search fails but a noise estimate exists, the script falls back to the first smoothed point approximately 5 dB above the estimated noise. |
| Noise handling | Chu-style noise-energy subtraction in each decay block plus analytic late-tail compensation when a valid fitted slope is available. |
| Decay curve | Schroeder backward energy integration. |
| EDT | Least-squares decay fit over 0 to −10 dB, extrapolated to 60 dB. |
| T20 | Least-squares fit over −5 to −25 dB. |
| T30 | Least-squares fit over −5 to −35 dB. |
| Validity | A converged fit is refused when the available peak-to-noise range is insufficient: 20 dB for EDT, 25 dB for T20, and 35 dB for T30. |
| Curvature | 100 × (T30 / T20 − 1), reported only when both T20 and T30 are valid. |
| C50 / C80 | Direct energy ratios around 50 ms and 80 ms boundaries relative to the detected start point. |
| D50 | Percentage of total analyzed energy arriving within the first 50 ms. |
| Ts | Centre time from sample-domain integration of (t − t0) × h²(t); it is not read from the block grid. |
Octave-band analysis
Optional octave bands use Praat's zero-phase Filter (pass Hann band). For each requested band, the script also measures the filter's own decay from a unit impulse. A band RT is accepted only when it is more than ten times longer than that self-decay. Bands more than 60 dB below the strongest measured band are treated as filter leakage and their decay/clarity values are refused.
Convolution-ready IR
When any downstream processing is requested, the script builds a prepared base from a copy of the measured response. The end point is derived from the measured truncation rather than from a fixed duration: the Lundeby crosspoint is backed off by the selected tail margin along the fitted decay.
- Start alignment. By default, the direct sound is aligned to 0. Choose Preserve measured timing to retain the pre-arrival timing from the original Sound.
- Measured tail cut. The kernel ends according to the measured decay/truncation logic.
- Final fade. A short raised-cosine fade is applied only at the very end, leaving the preceding measured decay unchanged.
- Peak protection. Generated IRs are never normalized upward. If a peak exceeds 0.99, the whole derived IR is attenuated by one scalar so the internal early/late energy relationship is preserved.
If Prepare_convolution_ready_IR is enabled, the prepared Sound is kept as <source>_IRprepared. When preparation is needed only internally for sculpting or audition, the temporary prepared base is removed at the end.
Early / late decomposition
The preparation dialog can split the prepared IR into two full-length complementary Sounds:
<source>_IRearly— direct sound and early reflections;<source>_IRlate— late reverberant field.
The boundary is measured from the detected direct sound and can be 50 ms, 80 ms, or custom. A raised-cosine crossfade is applied around the boundary. The early and late windows are complementary, so the two components sum back to the prepared IR without a level bump or discontinuity.
Creative IR sculpting
Creative processing works only on the prepared copy and produces <source>_IRart. The controls deliberately target properties that are meaningful for an impulse response rather than turning the tool into a general effects processor.
| Control | Range | Effect |
|---|---|---|
| Early_gain_dB | −24 to +12 dB | Changes the weight of the direct/early component before the late field. |
| Late_gain_dB | −24 to +12 dB | Changes the overall prominence of the late reverberant component. |
| Tail_decay_shaping_dB_per_s | −30 to +30 dB/s | Applies an exponential amplitude envelope after the early/late split. The internal gain change is limited to +12 dB and −80 dB for safety. |
| Spectral_tilt_dB_per_octave | −6 to +6 dB/oct | Applies one broad spectral tilt around a 1 kHz pivot. Per-bin gain is limited to ±12 dB. Negative values darken the IR; positive values brighten it. |
| Reverse_late_tail | Off / On | Preserves the causal onset and early reflections while reversing only the late field. The reversed content is windowed after reversal, with a fresh complementary boundary fade and an end fade. |
| Additional_predelay_ms | 0 to 2000 ms | Adds silence before the derived creative response. |
Tail_decay_shaping_dB_per_s changes the derived kernel's amplitude envelope; it does not claim that the measured room has a different reverberation time.Creative presets
Presets are starting points, not hidden modes. Choosing one fills the six creative controls on the following dialog; every value remains visible and editable before processing.
| Preset | Early | Late | Decay shape | Tilt | Reverse | Pre-delay |
|---|---|---|---|---|---|---|
| Custom — keep current values | current | current | current | current | current | current |
| Natural — no change | 0 dB | 0 dB | 0 dB/s | 0 dB/oct | No | 0 ms |
| Close / percussive | +3 dB | −8 dB | −8 dB/s | +1 dB/oct | No | 0 ms |
| Distant bloom | −6 dB | +5 dB | +5 dB/s | −1 dB/oct | No | 40 ms |
| Dark resonance | −3 dB | +6 dB | +3 dB/s | −3 dB/oct | No | 20 ms |
| Reverse bloom | −4 dB | +5 dB | +2 dB/s | −1 dB/oct | Yes | 30 ms |
Preset philosophy
The names describe transformations of the recorded space, not simulated room types. A stairwell remains that recorded stairwell; the preset changes how its measured response is weighted, colored, shaped, or reversed.Audition by convolution
Audition_on_another_Sound is a quick perceptual check, not a replacement for the library's dedicated convolution tools. It convolves another already-open Sound with either the prepared IR or, when available and requested, the creative IR.
- The script finds the named dry Sound among the Sounds that were open when the run began.
- If the dry Sound is multichannel, channel 1 is used for audition.
- If the IR and dry Sound have different sampling frequencies, the IR audition copy is resampled to the dry Sound's rate.
- Praat convolution is performed, followed by optional preview-only wet-level matching.
- The wet result and dry Sound are mixed according to
Wet_percent. - Final peak protection attenuates only when the audition output exceeds 0.99.
Wet-level matching
A clap-derived IR carries the arbitrary gain of the recording chain, so a raw wet percentage is not necessarily perceptually meaningful. With Match_wet_level_to_dry enabled (default), the wet convolution RMS is matched to the dry Sound RMS over the dry Sound's own duration before the wet/dry mix. The matching correction is limited to ±36 dB and affects only the audition preview; neither _IRprepared nor _IRart is changed.
The audition output is named <dry>_through_<IR>.
Parameters
Main dialog
| Parameter | Default | Meaning |
|---|---|---|
| Channel | 1 | Channel to analyze. 0 explicitly sums all channels to mono; the script warns when that sum loses more than 1 dB relative to the channel mean. |
| Bands | Broadband + octave bands | Runs broadband only, or broadband plus nominal octave bands. |
| Truncation | Lundeby (recommended) | Measured truncation/crosspoint processing or raw integration to the end. |
| Prepare_convolution_ready_IR | Off | Keeps the prepared convolution kernel as an output Sound. |
| Creative_IR_processing | Off | Opens the preset and creative-sculpting stages and produces _IRart. |
| Audition_on_another_Sound | Off | Convolves another open Sound with the prepared or creative IR. |
| Draw_visualization | On | Draws the AudioTools analysis page; creative processing adds a measured/prepared vs sculpted comparison panel. |
| Play | Off | Plays the last Sound produced by the current run. |
| Advanced_settings | Off | Opens detailed analysis and table-output controls. |
Advanced analysis defaults
| Parameter | Default | Meaning |
|---|---|---|
| Lowest_band | 125 Hz | Lowest nominal octave-band center. |
| Highest_band | 8000 Hz | Highest requested nominal center, subject to Nyquist protection. |
| Block_length_ms | 1.0 ms | Decay-curve energy block size, with a minimum of four samples. |
| Noise_subtraction_and_tail_compensation | On | Enables Chu subtraction and analytic tail compensation when supported by the Lundeby estimate. |
| Start_point | ISO 3382-1 (−20 dB re peak) | Direct-response start rule. |
| Tail_margin_dB | 5 dB | How far above the estimated noise/truncation region the prepared IR should end along the fitted decay. |
| Results_table | Off | Creates broadband and, when available, octave-band Praat Table objects. |
Preparation defaults
| Parameter | Default | Meaning |
|---|---|---|
| Start_alignment | Align direct sound to zero | Removes the leading pre-arrival region from the prepared kernel, or preserves it when requested. |
| Final_fade_ms | 5 ms | Raised-cosine fade at the prepared IR's final edge. |
| Early_late_split | 80 ms | 50 ms, 80 ms, or custom boundary measured from the detected direct sound. |
| Custom_split_ms | 80 ms | Used only when Custom split is selected. |
| Crossfade_ms | 4 ms | Complementary raised-cosine early/late transition. |
| Create_early_and_late_Sounds | Off | Keeps the two complementary decomposition Sounds. |
Audition defaults
| Parameter | Default | Meaning |
|---|---|---|
| Dry_Sound_name | First other open Sound | Name of the Sound to audition through the IR. |
| Wet_percent | 100% | Wet/dry mix. The script accepts values above 0 and up to 100. |
| Use_creative_IR_if_available | On | Uses _IRart for audition when it exists; otherwise uses the prepared IR. |
| Match_wet_level_to_dry | On | Preview-only RMS matching before wet/dry mixing. |
Input & output behavior
| Output | When created | Meaning |
|---|---|---|
<source>_IRprepared | Prepare_convolution_ready_IR enabled | Direct-sound-aligned or timing-preserved, measured-tail-trimmed IR with final fade and attenuation-only peak protection. |
<source>_IRearly | Create_early_and_late_Sounds enabled | Full-length early component with complementary boundary crossfade. |
<source>_IRlate | Create_early_and_late_Sounds enabled | Full-length late component complementary to _IRearly. |
<source>_IRart | Creative_IR_processing enabled | Artistically derived IR after visible/editable sculpting controls. |
<dry>_through_<IR> | Audition_on_another_Sound enabled and a valid dry Sound is found | Convolution audition with optional wet-level matching and wet/dry mix. |
<source>_IRresults | Results_table enabled | One-row broadband Table containing metadata, noise/truncation information, EDT/T20/T30 validity, curvature, clarity, definition, and Ts. |
<source>_IRbands | Results table + octave bands | Per-band Table containing T30, T20, EDT, C50, relative band level, validity flags, and measured filter self-decay. |
The source Sound is preserved. Internal work objects are removed at the end, while every requested user-facing output remains in the Objects window.
Visualization
With Draw_visualization enabled, the script draws the AudioTools analysis page with:
- Energy-time curve with estimated noise floor and truncation point;
- Schroeder decay curve with accepted T20 and T30 fit lines;
- Octave-band reverberation-time panel comparing accepted T30 and EDT values, or a clear message when bands were not requested;
- Summary strip with T30, T20, EDT, peak-to-noise range, C50, C80, D50, Ts, noise floor, truncation, curvature, and analyzed-channel information.
When a creative IR exists, the page expands with a fifth panel: Prepared vs sculpted IR (dB). The prepared envelope is drawn in grey and the creative envelope in orange against the same reference, so the effect of gain balance, decay shaping, reversal, spectral color, or pre-delay can be inspected visually.
Batch / headless use
Analysis, octave bands, report, results tables, and visualization can run headless across the Praat versions documented in the script. The preparation, creative, and audition stages use beginPause dialogs and therefore require interactive use in newer headless builds.
beginPause can terminate a headless run silently. For batch analysis, leave Prepare_convolution_ready_IR, Creative_IR_processing, and Audition_on_another_Sound unticked. To automate those stages, set their defaults directly in the script and remove the corresponding pause calls.Notes & limitations
- ISO-style, not a universal standards claim. The broadband start, decay-fit ranges, curvature logic, and noise-clearance checks follow the ISO 3382-1-style procedure documented in the script. The octave-band implementation is explicitly non-IEC.
- Channel choice matters. Real multichannel IR channels are separate measurements. Channel 1 is the default; channel 0 is an explicit sum. If that sum cancels energy, the script warns that a comb-filtered sum should not be treated as the room decay.
- Prepared IRs are not normalized upward. Peak protection only attenuates derived Sounds when necessary.
- Spectral tilt is deliberately broad. It is a single tilt around 1 kHz, not a multiband equalizer.
- Reverse processing affects the late field only. The onset/early structure stays forward, and the late content is reversed before new boundary/end windows are applied.
- Audition is intentionally basic. Multichannel dry audition uses channel 1, and the feature exists to hear the measured/derived space quickly rather than to replace a dedicated convolution processor.
- No external runtime. The implementation uses native Praat only: no Python, subprocesses, or temporary external processing files.