[Python3] Octave-Band and Fractional Octave-Band filter. For signal in time domain.
phonometry
phonometry β the measurement of sound. Formerly published as PyOctaveBand.
Acoustic measurement toolkit for Python: fractional octave-band filter banks, frequency and time weighting, and sound level metrology β conformance-tested against IEC 61260-1:2014 / ANSI S1.11-2004 (filters) and IEC 61672-1:2013 (weighting and levels) class 1 tolerance limits.

β¨ Highlights
- ποΈ 1/1, 1/3 and arbitrary fractional octave filter banks (stable SOS + multirate decimation)
- ποΈ Five architectures: Butterworth, Chebyshev I/II, Elliptic, Bessel β all with β3 dB points on the ANSI band edges
- π A/C/Z frequency weighting within IEC 61672-1 class 1 tolerances
- β±οΈ Fast/Slow/Impulse time ballistics,
Leq,LAeqandL10/L50/L90statistical levels - πΊοΈ Octave spectrogram (band levels over time) and zero-phase offline filtering
- π§ Loudness in sones three ways: Zwicker (ISO 532-1 Annex B validated), Moore-Glasberg stationary & time-varying (ISO 532-2/3) and Sottek Hearing Model (ECMA-418-2); DIN 45692 sharpness, ISO 226:2023 contours
- π» Sound-quality metrics: ECMA-418-2 tonality (tu_HMS) and roughness (asper)
- π£οΈ Speech Transmission Index: STI and STIPA per IEC 60268-16 Ed. 5, with signal generator
- π― Tone prominence (TNR/PR, ECMA-418-1), environmental Lden/Ldn (ISO 1996-1), IEC 61252 noise dose
- βοΈ Two-microphone sound intensity (IEC 61043) with ISO 9614-1 field indicators
- ποΈ Room & building acoustics: swept-sine/MLS impulse responses (ISO 18233), EDT/T20/T30/C50/C80/Ts (ISO 3382-1/2), open-plan speech metrics (ISO 3382-3), field airborne + impact + faΓ§ade insulation with Rβ²w/DnT,w/Lβ²nT,w/D2m,nT,w and C/Ctr/CI (ISO 16283-1/2/3, ISO 717-1/2), laboratory R/Ln (ISO 10140), flanking-transmission prediction of Rβ²w/Lβ²n,w (EN 12354-1/2), measurement uncertainty (ISO 12999-1), sound absorption (ISO 354)
- π¬οΈ Outdoor propagation & occupational exposure: atmospheric absorption Ξ±(f) (ISO 9613-1), the ISO 9613-2 general method (divergence + atmospheric + ground + barrier terms) with a per-term octave-band breakdown, and daily noise exposure LEX,8h with task/job/full-day strategies and Annex C uncertainty (ISO 9612)
- π Sound power LW three ways: enveloping-surface pressure (ISO 3744/3746), reverberation-room precision with Waterhouse/C1/C2 (ISO 3741), intensity scanning with field indicators and grade (ISO 9614-2)
- π Physical SPL calibration with IEC 60942:2017 stability validation, and dBFS modes
- β‘ Vectorized multichannel processing and stateful block (real-time) workflows
π Installation
pip install phonometry
Optional extras: phonometry[plot] (matplotlib for response plots and result .plot() methods), phonometry[perf] (numba for faster impulse ballistics), phonometry[full] (both).
π Documentation
Full documentation website: https://jmrplens.github.io/phonometry/ (English / EspaΓ±ol)
Or browse the Markdown docs on GitHub:
| Page | Contents | | :--- | :--- | | Getting Started | Installation, first analysis, WAV files | | Filter Banks | Architectures, response gallery, band decomposition, zero-phase | | Frequency Weighting | A/C/Z curves, class 1 high-accuracy mode | | Time Weighting | Fast/Slow/Impulse ballistics, initial state | | Levels | Leq, LAeq, percentiles, LCpeak, SEL, noise dose (IEC 61252), Lden and rating levels (ISO 1996-1), octave spectrogram | | Occupational Exposure | ISO 9612 task-based, job-based and full-day strategies with the Annex C uncertainty budget (LEX,8h + U) | | Tone Prominence | ECMA-418-1 tone-to-noise ratio and prominence ratio with frequency-dependent prominence criteria | | Psychoacoustics | Zwicker (ISO 532-1), Moore-Glasberg (ISO 532-2/3) and Sottek (ECMA-418-2) loudness, sharpness (DIN 45692), equal-loudness contours (ISO 226), tonality & roughness (ECMA-418-2) | | Speech Transmission | STI/STIPA (IEC 60268-16): modulation transfer function, indirect method from impulse responses and direct STIPA measurement | | Speech Intelligibility Index | SII (ANSI S3.5-1997): band importance, masking and audibility, the index in noise and hearing loss, standard vocal-effort spectra | | Sound Intensity | Two-microphone p-p intensity (IEC 61043), ISO 9614-1 field indicators | | Room Acoustics | Impulse responses (ISO 18233), room parameters (ISO 3382-1/2), open-plan metrics (ISO 3382-3), sound absorption (ISO 354) | | Building Acoustics | Field airborne + impact + faΓ§ade insulation and weighted ratings (ISO 16283-1/2/3, ISO 717-1/2), laboratory characterisation (ISO 10140), flanking-transmission prediction (EN 12354-1/2), measurement uncertainty (ISO 12999-1) | | Outdoor Sound Propagation | Atmospheric absorption Ξ±(f) (ISO 9613-1) and the ISO 9613-2 general method: geometrical divergence, atmospheric absorption, ground effect, barrier screening and meteorological correction | | Sound Power | Sound power level LW by enveloping surface (ISO 3744/3746), reverberation room (ISO 3741) and intensity scanning (ISO 9614-2) | | Calibration and dBFS | Physical SPL, digital full-scale, RMS vs peak | | Block Processing | Stateful streaming workflows | | Multichannel | Vectorized multichannel analysis, performance | | API Reference | Every public function and class | | Theory | Standards, math, design decisions | | Why phonometry | IEC compliance verification vs other libraries | | Conformance report | Live per-standard numerical validation (expected vs computed) regenerated by make conformance |
β‘ Quick start
import numpy as np
from phonometry import octave_filter
fs = 48000 t = np.linspace(0, 1, fs, endpoint=False)
Composite signal: 100Hz + 1000Hz
signal = np.sin(2 np.pi 100 t) + np.sin(2 np.pi 1000 t)
Apply 1/3 octave filter bank
spl, freq = octave_filter(signal, fs=fs, fraction=3)
print(f"Bands: {freq}") print(f"SPL [dB]: {spl}")

*1/3 Octave Band spectrum analysis of a complex signal. More examples in the documentation.*
π§ͺ Development
make install # dependencies + editable install
make check # ruff + mypy + bandit + tests
make graphs # regenerate documentation images
See https://github.com/jmrplens/phonometry/blob/main/CONTRIBUTING.md and the https://github.com/jmrplens/phonometry/blob/main/CHANGELOG.md