Skip to content

jmrplens/phonometry

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

126 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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
  • 📏 Physical SPL calibration and dBFS modes
  • ⚡ Vectorized multichannel processing and stateful block (real-time) workflows

🚀 Installation

pip install phonometry

Optional extras: phonometry[plot] (matplotlib for response plots), 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, L10/L50/L90, octave spectrogram
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

⚡ Quick start

import numpy as np
from phonometry import octavefilter

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 = octavefilter(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

About

Acoustic measurement toolkit for Python: fractional octave-band filters, A/C/Z and time weighting, sound level metrology — conformance-tested against IEC 61260-1 and IEC 61672-1 (formerly PyOctaveBand)

Topics

Resources

License

Contributing

Stars

108 stars

Watchers

4 watching

Forks

Sponsor this project

 

Contributors