Tonality, Aures/Terhardt model
Tonality from Aures (1985): tonal components are extracted with the method of Terhardt, Stoll & Seewann (1982), weighted, and related to the loudness of the whole sound. Not standardised.
There is no standard; the reference model is Aures (1985b). Open-source implementations of it:
SQAT corrected several issues in September 2026, released in v2.0 (for example, the level excess of only one tonal component, the last positive one, entered the result, combined with the first component's frequency and bandwidth), which changes results compared with SQAT v1.3 and earlier.
Editions and who implements them
| Date | Edition | Status | What changed | Implemented by |
|---|---|---|---|---|
| 1985 | Aures (1985b) | published | Tonality model. | SQAT, MoSQITo PR, MetaSona new, pySQAT developing |
| 1982 | Terhardt et al. (1982) | published | Extraction of tonal components used by the model. | — |
Project map
The project map, with only the lines for tonality (Aures) 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
- SQAT SQAT, MoSQITo, and sottek-hearing-model
Implementations
| Project | Edition | Functions | Validation (as stated) | Notes |
|---|---|---|---|---|
| SQAT MATLAB | Aures (1985b) since v1.0 | Tonality_Aures1985, Tonality_Aures1985_from_wavfile | standard or paper data | v2.0 fixes eight defects (issue #67; for example, only one tonal component's level excess entered the result, and tones were removed from the wrong spectrum), so results differ from v1.x. |
| MoSQITo Python | Aures (1985b) | — | not stated | PR Pull request from April 2026 following the improved Aures metric of Estreder et al. (2023); no maintainer reply. |
| MetaSona C Python | Aures (1985b) since 0.1.0 | tonality_aures | compared with SQAT (its source) | new Follows SQAT's September 2026 revision (250 ms Hann windows, 125 ms hop). |
| pySQAT Python | Aures (1985b) | Tonality_Aures1985 | compared with SQAT (its source) | developing no licence A June 2026 commit corrected its calibration; it predates SQAT's September 2026 fixes. |
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.
See also: Tonality 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 · Aures (1985b)
standard or paper data
- v2.0 has five validation scripts: a tone emerging from noise, compared with Fig. 1(a) of Hastings et al. (2003) (root mean square deviation 0.0129 t.u. over nine points); the extraction of tonal components and the level excess, compared with the intermediate values of an independent implementation (Zhang & Shrestha, 2003); the weightings of bandwidth and frequency, compared with Aures's Figs. 6 and 5; and the dependence on bandwidth, compared with Hastings's subjective data.
- v1.3 is checked with one signal-to-noise comparison.
- MetaSona new · Aures (1985b)
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.
- The project calls its source-based Python comparisons "development checks, not an executed MATLAB/Octave validation"; exact agreement with MATLAB is not established.
- The results are not published.
- pySQAT developing · Aures (1985b)
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
Not stated by MoSQITo.
Before you compare numbers
Implementations of the same metric can give different numbers without either being wrong. Check these choices first.
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 (
- 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.
References
- Terhardt, E., Stoll, G., & Seewann, M. (1982). Algorithm for extraction of pitch and pitch salience from complex tonal signals. The Journal of the Acoustical Society of America, 71(3), 679–688. https://doi.org/10.1121/1.387544
- Aures, W. (1985). Berechnungsverfahren für den sensorischen Wohlklang beliebiger Schallsignale [A model for calculating the sensory euphony of various sounds]. Acustica, 59, 130–141.