jmrplens
PyOctaveBand
Python

[Python3] Octave-Band and Fractional Octave-Band filter. For signal in time domain.

Last updated Jul 8, 2026
108
Stars
21
Forks
2
Issues
+12
Stars/day
Attention Score
43
Language breakdown
Python 98.1%
JavaScript 0.9%
Astro 0.3%
MDX 0.3%
CSS 0.1%
Makefile 0.1%
β–Έ Files click to expand
README

PyPI version Python versions License: MIT

CI Quality Gate codecov

DOI

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.

Magnitude response comparison of the five filter architectures for the 1 kHz octave band, with a zoom at the -3 dB crossover

✨ 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, LAeq and L10/L50/L90 statistical 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}")

One-third-octave spectrum analysis of a multi-tone signal with the raw PSD in the background

*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

πŸ“„ License

MIT

Β© 2026 GitRepoTrend Β· jmrplens/PyOctaveBand Β· Updated daily from GitHub