Zwicker loudness (ISO 532-1, DIN 45631)
Loudness from Zwicker's model: third-octave band levels are turned into specific loudness on the critical-band (Bark) scale and integrated. ISO 532-1:2017 specifies one procedure for stationary sounds and one for time-varying sounds (from which percentile values are taken, such as N5, the loudness exceeded 5 % of the time), and replaced method B of ISO 532:1975. The German standards DIN 45631 (stationary) and DIN 45631/A1 (time-varying) specify Zwicker's method; ISO 532-1:2017 states that its stationary method is based on DIN 45631:1991.
The current edition is ISO 532-1:2017. In development: ISO/CD 532-1. Open-source implementations of it:
- Python MoSQITo, phonometry new, pySQAT developing, PsychoacousticParametersMeasurer legacy
- MATLAB SQAT, AARAE
- C MetaSona new (also Python)
- C++ SoundPalette new
- C# Mosqito.NET new
- Rust iso532-1-rs new (also C, Python), Kirin Hypha new
- Julia ZwickerLoudness.jl new
Earlier editions or related models: ITA-Toolbox (MATLAB; DIN 45631/A1:2010; time-varying, with N5), AARAE (MATLAB; Chalupper & Fastl (2002); time-varying), ITA-Toolbox (MATLAB; DIN 45631:1991; stationary; free or diffuse field), PsySound3 (MATLAB; legacy, no commit since 2015-03; Chalupper & Fastl (2002); time-varying), deeuu/loudness (C++, Python; legacy, no commit since 2019-08; DIN 45631:1991; stationary only), and zwickerloudness (C; legacy, no commit since 2018-06; DIN 45631:1991; stationary, from one-third-octave band levels).
In China, GB/T 25982-2024 (interior noise of buses, in force since July 2025) sets loudness and sharpness limits and gives Zwicker's calculation in an informative annex.
Editions and who implements them
| Date | Edition | Status | What changed | Implemented by |
|---|---|---|---|---|
| 2024-11 | ISO/CD 532-1 | in development | Second edition at committee-draft stage since November 2024. | — |
| 2017-06 | ISO 532-1:2017 | current Under revision; the 2nd edition has been at committee-draft stage since 2024-11-01. | Stationary and time-varying procedures; Annex A reference program, Annex B test signals. | SQAT, MoSQITo, AARAE, MetaSona new, iso532-1-rs new, Kirin Hypha new, Mosqito.NET new, phonometry new, SoundPalette new, ZwickerLoudness.jl new, pySQAT developing, PsychoacousticParametersMeasurer legacy |
| 2010-03 | DIN 45631/A1:2010 | current | Adds the procedure for time-varying sounds. | ITA-Toolbox |
| 2002 | Chalupper & Fastl (2002) | published | Dynamic loudness model built on Zwicker's model, also for hearing impairment (not standardised). | AARAE, PsySound3 legacy |
| 1991-03 | DIN 45631:1991 | current | Stationary sounds. | ITA-Toolbox, deeuu/loudness legacy, zwickerloudness legacy |
| 1975-07 | ISO 532:1975 | withdrawn | Method B (Zwicker) for stationary sounds, from third-octave levels. | — |
Project map
The project map, with only the lines for Zwicker loudness between the projects listed for it. Agreement between a project and the code it was ported or adapted from only checks the port.
- ported or adapted from another project
- the author's own code
- used at run time
- results checked against
- same contributor
- SQAT SQAT, MoSQITo, and sottek-hearing-model
- legacy legacy project
- ISO 532-1 program published with a standard or a paper
Scroll the picture sideways.
Implementations
| Project | Edition | Functions | Validation (as stated) | Notes |
|---|---|---|---|---|
| SQAT MATLAB | ISO 532-1:2017 stationary and time-varying; since v1.0 | Loudness_ISO532_1, Loudness_ISO532_1_from_wavfile | standard or paper data | v2.0 corrects the time-varying procedure (PR #48) and the time_skip handling of the stationary procedure; results differ from v1.x. |
| MoSQITo Python | ISO 532-1:2017 stationary (also per segment and from a spectrum) and time-varying; since 1.0.0 | loudness_zwst, loudness_zwst_perseg, loudness_zwst_freq, loudness_zwtv | standard or paper data (outcome not stated) | — |
| AARAE MATLAB | ISO 532-1:2017 stationary and time-varying | Loudness_ISO532_1 | standard or paper data (time-varying signals only) | The header cites a 2014 draft of ISO 532-1 and describes the code as Ella Manor's 2015 MATLAB port, with adjustments, of the Annex A C code. |
| ITA-Toolbox MATLAB | DIN 45631/A1:2010 time-varying, with N5 | ita_loudness_timevariant | standard or paper data (results plotted, not checked) | The header says "DIN 45631/A1" without a year; the function was written in August 2010, after the amendment was published. A code comment says the C code of the nonlinearity block was copied from the DIN document, "without its errors". |
| AARAE MATLAB | Chalupper & Fastl (2002) time-varying | LoudnessCF | not stated | Also outputs loudness fluctuation and time-varying sharpness. Josef Chalupper's code (2000) in its PsySound3 version (2007), adjusted for AARAE by Ella Manor in 2015. |
| ITA-Toolbox MATLAB | DIN 45631:1991 stationary; free or diffuse field | ita_loudness | standard or paper data | The header says "DIN 45631 / ISO 532 B". The C core (private/DIN45631.c) is Aaron Hastings' version (2000) of the BASIC program published by Zwicker, Fastl, Widmann, Kurakata, Kuwano and Namba in J. Acoust. Soc. Jpn (E) 12(1), 1991. |
| MetaSona C Python | ISO 532-1:2017 stationary and time-varying; also from 28 third-octave levels; since 0.1.0 | stationary_loudness, time_varying_loudness, loudness_from_levels | compared with MoSQITo (its source) | new |
| iso532-1-rs Rust C Python | ISO 532-1:2017 stationary, time-varying and streaming; since 0.1.0 | loudness_zwst, loudness_zwtv, ZwtvStream | standard or paper data also compared with MoSQITo | new Python uses the same names (iso532.loudness_zwst …); the C API has iso532_loudness_zwst, iso532_loudness_zwtv and iso532_stream_*. |
| Kirin Hypha Rust | ISO 532-1:2017 time-varying, per channel at 48 kHz; stored in the recorded data; since 1.0.0 | kirin_measure::phase_d | compared with MoSQITo (its source) | new Ported from MoSQITo v1.2.1. |
| Mosqito.NET C# | ISO 532-1:2017 stationary (also per segment and from a spectrum) and time-varying | Sq.LoudnessZwst, Sq.LoudnessZwstFreq, Sq.LoudnessZwstPerSeg, Sq.LoudnessZwtv | standard or paper data also compared with MoSQITo (its source) | new |
| phonometry Python | ISO 532-1:2017 stationary and time-varying; since 3.1.0 | loudness_zwicker, loudness_zwicker_from_spectrum | standard or paper data | new |
| SoundPalette C++ | ISO 532-1:2017 time-varying, reported as N5; monaural; since v0.5.0 | sp::compute_psycho | compared with MoSQITo | new source-available No MoSQITo code is ported. |
| ZwickerLoudness.jl Julia | ISO 532-1:2017 stationary, from 28 one-third-octave band levels; since 0.2.0 | zwicker_loudness | standard or paper data (one Annex B signal) also compared with MoSQITo | new |
| ZwickerLoudness.jl Julia | ISO 532-1:2017 time-varying, from band levels at 2000 Hz; N5 and N10; since 0.3.0 | zwicker_loudness_time_varying | standard or paper data (one Annex B signal) also compared with MoSQITo (its source) | new |
| pySQAT Python | ISO 532-1:2017 | Loudness_ISO532_1 | compared with SQAT (its source) | developing no licence |
| PsychoacousticParametersMeasurer Python | ISO 532-1:2017 stationary and time-varying, from third-octave levels | loudness_ISO532, loudness_ISO532_time | not stated | legacy no licence The file header says "Loudness ISO 532-1:2014" and the filter coefficients are labelled "ISO 532-1:2014"; the published edition is ISO 532-1:2017. |
| PsySound3 MATLAB | Chalupper & Fastl (2002) time-varying | @LoudnessCF | not stated | legacy no licence The analyser names J. Chalupper and H. Fastl as authors. |
| deeuu/loudness C++ Python | DIN 45631:1991 stationary only | StationaryLoudnessDIN456311991 | compared with GENESIS ACOUSTICS code (Python port) | legacy Uses 28 third-octave filters with third-order Butterworth responses after ANSI S1.11:1986; there is no time-varying (DIN 45631/A1) model. |
| zwickerloudness C | DIN 45631:1991 stationary, from one-third-octave band levels | — | own tests only | legacy Port of the 1991 BASIC program "according to DIN 45631 (ISO 532B)", the program that accompanies DIN 45631:1991; the same program is the basis of deeuu/loudness. |
Projects in bold and other established projects come first, then newly released, developing and legacy ones. Validation is what each project says about its own testing. The details are below, and the kinds of evidence are explained on the About page. The project map above shows which project was ported or adapted from which.
Also available through tools that call one of these implementations: rota-order (via MoSQITo, ISO 532-1:2017), PsychoBox (via MoSQITo, ISO 532-1:2017), Soundscapy (via MoSQITo, ISO 532-1:2017), and ZwickerLoudnessAudio.jl (via ZwickerLoudness.jl, ISO 532-1:2017).
See also: Sharpness (DIN 45692, Aures, von Bismarck), Loudness from the Sottek Hearing Model (ECMA-418-2).
How they were validated
As reported by each project; LISQM has not run the code. Two implementations that agree can still share the same error. Kinds of evidence.
- SQAT · ISO 532-1:2017
standard or paper data
Ported or adapted from AARAE.
- Checked with the 25 test signals of Annex B.2–B.5 against the standard's tolerances.
- For v2.0, the validation notes say that the maximum loudness and N5 of the time-varying test signals are close to the reference values, apart from offsets in the N5 of test signals 12 and 13 that they trace to the standard's reference spreadsheet. In v1.3, test signal 10 deviated by 18.14 % (PR #48).
- MoSQITo · ISO 532-1:2017
standard or paper data (outcome not stated)
Ported or adapted from BASIC program of DIN 45631 (Zwicker et al., 1991).
- Validation scripts use the ISO 532-1 Annex B test signals; the documentation marks it as validated.
- AARAE · ISO 532-1:2017
standard or paper data (time-varying signals only)
Ported or adapted from ISO 532-1 Annex A reference program.
- A commit of 2017-12-11 says the code was verified with the time-varying test signals of Annex B.5; no check of the stationary method is stated.
- ITA-Toolbox · DIN 45631/A1:2010
standard or paper data (results plotted, not checked)
- A test script plots the results for the amendment's test signals A to D (1 kHz tone pulses of 10 ms to 500 ms) against its tolerance bands; it does not check them automatically.
- AARAE · Chalupper & Fastl (2002)
not stated
Ported or adapted from PsySound3 (the author's own code).
- ITA-Toolbox · DIN 45631:1991
standard or paper data
Ported or adapted from BASIC program of DIN 45631 (Zwicker et al., 1991).
- A test compares the loudness of a generated pink noise with 95.09 sone (GF), a value the test attributes to DIN 45631, within 5 %, with third-octave levels computed both by FFT and by filter bank.
- MetaSona new · ISO 532-1:2017
compared with MoSQITo (its source)
Ported or adapted from MoSQITo and SQAT. It was compared with the code it was ported from, which checks the port only.
- Model tables taken from MoSQITo were checked element by element; one upper-slope value (0.22) follows the ISO 532-1 reference C table where MoSQITo uses 0.24.
- The project says that detailed validation and reference comparisons are kept outside the repository; the results are not published. The README says standards conformance has not been established.
- iso532-1-rs new · ISO 532-1:2017
standard or paper data also compared with MoSQITo
- Parity tests with MoSQITo 1.2.1 on nine synthetic and Annex B signals (worst reported difference 1.3e-9).
- Checked separately against ISO 532-1 Annex B: the README reports stationary offsets of about +0.82 % and −0.76 % for signals 3 and 5, inside the standard's tolerance, and details signals 3, 5 and 10 in docs/ISO-ANNEXB-NUMERICAL-ERROR-2026-07-04.md.
- Kirin Hypha new · ISO 532-1:2017
compared with MoSQITo (its source)
Ported or adapted from MoSQITo. It was compared with the code it was ported from, which checks the port only.
- Tests assert specific loudness within a relative 1e-3 of MoSQITo.
- Mosqito.NET new · ISO 532-1:2017
standard or paper data also compared with MoSQITo (its source)
Ported or adapted from MoSQITo. It was compared with the code it was ported from, which checks the port only.
- Unit tests ported from MoSQITo compare stationary loudness with ISO 532-1 Annex B values.
- Every public function is compared with the output of Python MoSQITo for seven WAV files (three of them ISO 532-1 test signals), within 1 % (0.5 dB for levels).
- phonometry new · ISO 532-1:2017
standard or paper data
Ported or adapted from ISO 532-1 Annex A reference program.
- Annex B test signals are used in the tests.
- SoundPalette new · ISO 532-1:2017
compared with MoSQITo
- Compared with MoSQITo 1.2.1 on calibrated test signals, used as a development-time reference (
NOTES.md,tools/psycho_oracle).
- Compared with MoSQITo 1.2.1 on calibrated test signals, used as a development-time reference (
- ZwickerLoudness.jl new · ISO 532-1:2017 (stationary, from 28 one-third-octave band levels)
standard or paper data (one Annex B signal) also compared with MoSQITo
- Checked against ISO 532-1 Annex B signal 1, the only 28-band reference in Annex B (83.296 sone, tolerance ±5 %).
- Checked per Bark bin against MoSQITo output (maximum difference below 0.001 sone/Bark).
- ZwickerLoudness.jl new · ISO 532-1:2017 (time-varying, from band levels at 2000 Hz; N5 and N10)
standard or paper data (one Annex B signal) also compared with MoSQITo (its source)
Ported or adapted from MoSQITo. It was compared with the code it was ported from, which checks the port only.
- Stages are tested against MoSQITo
loudness_zwtvintermediates (agreement about 1e-9 to 1e-15). - An Annex B.4 "Test signal 6" test regenerates band levels from a local MoSQITo checkout and is skipped when none is present; CI clones MoSQITo for it.
- The ISO WAV files are not included.
- Stages are tested against MoSQITo
- rota-order new via MoSQITo · ISO 532-1:2017 (time-varying, through MoSQITo's loudness_zwtv)
own tests only
- Tests, which run only where MoSQITo is installed (the project's continuous integration does not install it), check that the wrapper returns what a direct call of MoSQITo gives on the same signal, also after resampling to 48 kHz, that the calibration factor scales the loudness, and that
vs_rpmgives what binning the values by hand gives.
- Tests, which run only where MoSQITo is installed (the project's continuous integration does not install it), check that the wrapper returns what a direct call of MoSQITo gives on the same signal, also after resampling to 48 kHz, that the calibration factor scales the loudness, and that
- rota-order new via SQAT · ISO 532-1:2017 (time-varying, through SQAT v2.0's Loudness_ISO532_1 in MATLAB)
own tests only
- Tests with a stub engine check the call passed to SQAT and the conversion of its output; the comparison with a direct SQAT call runs only where MATLAB and SQAT v2.0 are installed.
- pySQAT developing · ISO 532-1:2017
compared with SQAT (its source)
Ported or adapted from SQAT. It was compared with the code it was ported from, which checks the port only.
- Compared with SQAT v1.3, run in MATLAB, by
validation/FINAL_VAL.py; the generated reports are not committed.
- Compared with SQAT v1.3, run in MATLAB, by
- deeuu/loudness legacy · DIN 45631:1991
compared with GENESIS ACOUSTICS code (Python port)
Ported or adapted from BASIC program of DIN 45631 (Zwicker et al., 1991).
- Tested against "a quick and dirty Python port of the Matlab code private by GENESIS ACOUSTICS".
- zwickerloudness legacy · DIN 45631:1991
own tests only
Ported or adapted from BASIC program of DIN 45631 (Zwicker et al., 1991).
- The documentation in the release archive says that tests with "classical cases", such as the included test WAV files, "seems to give correct results", and invites users to compare the output with that of the original BASIC program.
- ZwickerLoudnessAudio.jl via ZwickerLoudness.jl · ISO 532-1:2017 (stationary, from a waveform or WAV file)
standard or paper data
- ISO 532-1 Annex B signals 2–5, synthesised in-process, are within the standard's ±5 % (+2.9 %, +3.6 %, +0.5 % and +2.6 % per the README).
- ZwickerLoudnessAudio.jl via ZwickerLoudness.jl · ISO 532-1:2017 (time-varying, from a waveform or WAV file at 48 kHz)
standard or paper data also compared with MoSQITo (its source)
Ported or adapted from MoSQITo. It was compared with the code it was ported from, which checks the port only.
- Cross-checked end to end with MoSQITo
loudness_zwtv(N(t) about 3e-16 relative, N5/N10 about 2e-15 absolute). - An Annex B.4 test is skipped when the ISO recording is not available locally.
- Cross-checked end to end with MoSQITo
Not stated by PsychoacousticParametersMeasurer, PsySound3, PsychoBox, and Soundscapy.
Before you compare numbers
Implementations of the same metric can give different numbers without either being wrong. Check these choices first.
- Sound field. ISO 532-1 has a free-field and a diffuse-field version, which give different values for the same signal. Most implementations use free field unless told otherwise.
- Calibration. The input is sound pressure in pascals. Audio read from a file has to be scaled first, and tools ask for this in different ways: a calibration factor, a reference level or a full-scale level.
- Sample rate. The time-varying method is specified at 48 kHz. Some implementations reject other rates, others resample them, and the resampler changes the result slightly.
- Percentiles. N5, the loudness exceeded 5 % of the time, depends on how the percentile is taken: SQAT picks the nearest rank, while MATLAB's
prctileand the NumPy and Julia quantile functions interpolate, each in its own way. - Start of the signal. Time-varying loudness starts from silence and needs time to settle. Whether the start is left out of N5 and other statistics (
time_skipin SQAT,time_skip_sin MetaSona) matters for short signals.
What the projects state:
- SQAT
- Statistics such as N5 take the nearest rank of the sorted time series, without interpolation (
get_exceeded_value), and leave out the firsttime_skipseconds of the signal.
- Statistics such as N5 take the nearest rank of the sorted time series, without interpolation (
- MoSQITo
- Signals sampled below 48 kHz are resampled to 48 kHz (FFT method) with a warning; time-varying loudness rejects rates above 48 kHz.
- ITA-Toolbox
- N5 is MATLAB's
prctile(N, 95). Blocks are 2 ms long without overlap by default, and the signal is processed at its own sample rate. - Third-octave levels come from an FFT by default, or from a filter bank (
'mode', 'filter').
- N5 is MATLAB's
- MetaSona new
- Expects calibrated sound pressure in pascals.
- The C functions require 48 kHz input; the Python interface resamples other rates to 48 kHz (SciPy
resample_poly). time_skip_s(default 0 s) leaves out the start of the signal from the reported frames; the computation still runs over the whole signal. Time-varying results include every complete frame, labelled at frame centres, which differs from SQAT's handling of the last frame and of time stamps.
- Mosqito.NET new
- Time-varying loudness and ECMA-418-2 roughness resample input at any other rate to 48 kHz, and stationary loudness resamples rates below 48 kHz; MoSQITo rejects rates above 48 kHz for time-varying loudness.
- rota-order new
- The method
vs_rpmof a wrapper's result bins it along rpm after leaving out the start of the signal: by default it takes in each speed bin the 95th percentile of the loudness (N5), the median of the sharpness and the 90th percentile of the roughness, after 0.6 s for loudness and sharpness and 1.5 s for roughness. Keyword arguments override these choices. - Input in any unit is turned into sound pressure in Pa by an explicit calibration factor and resampled to 48 kHz.
- The method
- ZwickerLoudnessAudio.jl
- Stationary loudness resamples input below 48 kHz to 48 kHz (polyphase), with a warning.
- Time-varying loudness accepts 48 kHz input only (an error otherwise).
References
- ISO 532:1975. Acoustics — Method for calculating loudness level. https://www.iso.org/standard/4603.html
- DIN 45631:1991. Berechnung des Lautstärkepegels und der Lautheit aus dem Geräuschspektrum; Verfahren nach E. Zwicker. https://www.dinmedia.de/en/standard/din-45631/1666531
- Chalupper, J., & Fastl, H. (2002). Dynamic loudness model (DLM) for normal and hearing-impaired listeners. Acta Acustica united with Acustica, 88(3), 378–386. https://www.ingentaconnect.com/contentone/dav/aaua/2002/00000088/00000003/art00009
- DIN 45631/A1:2010. Calculation of loudness level and loudness from the sound spectrum — Zwicker method — Amendment 1: Calculation of the loudness of time-variant sound. https://www.dinmedia.de/en/standard/din-45631-a1/122476084
- ISO 532-1:2017. Acoustics — Methods for calculating loudness — Part 1: Zwicker method. https://www.iso.org/standard/63077.html
- ISO/CD 532-1. Acoustics — Methods for calculating loudness — Part 1: Zwicker method (2nd edition). https://www.iso.org/standard/90809.html