{
  "name": "LISQM",
  "full_name": "List of Implementations of Sound Quality Metrics",
  "tagline": "A List of Open-Source Implementations of Psychoacoustic and Sound Quality Metrics",
  "version": "0.5.10",
  "description": "A list of open-source implementations of psychoacoustic metrics, also called sound quality (SQ) metrics: loudness, sharpness, roughness, fluctuation strength, tonality, impulsiveness and psychoacoustic annoyance. Each implementation is listed under the standard edition or model it follows. All programming languages.",
  "url": "https://zhenxianli.github.io/LISQM/",
  "repository": "https://github.com/ZhenxianLi/LISQM",
  "license": "CC-BY-4.0",
  "license_url": "https://creativecommons.org/licenses/by/4.0/",
  "code_license": "MIT",
  "maintainer": {
    "name": "Zhenxian LI",
    "github": "ZhenxianLi"
  },
  "credit": "Developed by Zhenxian LI with assistance from Claude Code.",
  "as_of": "2026-10-28",
  "schema": "https://github.com/ZhenxianLi/LISQM/blob/main/data/SCHEMA.md",
  "counts": {
    "metrics": 22,
    "projects": 41,
    "references": 55
  },
  "ordering": "Implementations and projects are listed by group: established, newly released, developing, legacy, others, status unknown. Newly released projects were first released less than about a year ago and are not yet seen to be widely used in the community. Legacy projects are archived or have had no commit for three years or more; the projects with a highlight (shown in bold on the website) and reference programs are never legacy. Within each group the projects with a highlight come first, then ranked and active ones. Projects in the others group do not compute the metrics themselves; they call another listed project (listed in calls), and their rows appear under also_through instead of implementations. Projects in the unknown group could not be opened (access); they list a claim and no implementations.",
  "definitions": {
    "standing": {
      "established": "Described in a publication, used by others, or written by the authors of the model, with more than a year of history.",
      "newly-released": "First released less than about a year ago, and not yet seen to be widely used in the community.",
      "developing": "Public for more than a year, but without a publication or documented use by others: research, teaching or personal code."
    },
    "group": {
      "established": "Described in a publication, used by others, or written by the authors of the model, with more than a year of history.",
      "newly-released": "First released less than about a year ago, and not yet seen to be widely used in the community.",
      "developing": "Public for more than a year, but without a publication or documented use by others: research, teaching or personal code.",
      "legacy": "Archived, or no commit for three years or more. Kept for reference. The code may follow an older edition and may not run with current software.",
      "others": "Tools that do not compute the metrics themselves: interfaces, front ends and wrappers that call one of the listed projects.",
      "unknown": "Projects whose code could not be opened, for example because the repository needs a login. What they implement is unverified, so they are listed with what they claim and not under the metrics."
    },
    "kind": {
      "library": "Functions to call from your own code: a Python package, a MATLAB toolbox, or a C, C++, C#, Rust or Julia library.",
      "research-code": "Code published with a study, a thesis or a student project, to run or adapt; not packaged as a library.",
      "application": "A program to run, with a graphical or command-line interface; no programming needed.",
      "plugin": "Runs inside other software: a plug-in for an audio workstation, or a Pure Data external.",
      "reference-program": "Code published with a standard or by the authors of the model, as the reference for it."
    },
    "status": {
      "available": "In the latest release, or on the default branch of a project without releases.",
      "unreleased": "Merged on the default branch but newer than the latest release.",
      "proposed": "Open pull request or separate branch, not merged."
    },
    "validation": {
      "standard-data": "Compared with test signals or values published in the standard or the model paper.",
      "reference-code": "Compared with the reference program or the model authors' own code.",
      "cross-implementation": "Compared with another implementation, named when the project says which. Agreement means that both compute the same values; they may still share an error.",
      "self-tests": "Tests exist, but without external reference data.",
      "not-stated": "The project does not say how it was validated."
    },
    "access": {
      "restricted": "The repository cannot be opened without a login."
    },
    "comparison_relations": {
      "source": "the compared project is the code this implementation was ported from (or that code's own source)",
      "port": "the compared project was ported from this implementation",
      "shared:<id>": "both were ported from the same code, the project <id>"
    },
    "coverage": {
      "current": "an available implementation of the current edition",
      "new": "an available implementation of the current edition, but only from newly released projects",
      "partial": "only unreleased, proposed, older-edition or partial implementations",
      "": "none found"
    }
  },
  "families": [
    {
      "id": "loudness",
      "name": "Loudness",
      "summary": "How loud a sound is perceived, in sone (loudness) and phon (loudness level). Four models are standardised: Zwicker (ISO 532-1), Moore–Glasberg (ISO 532-2), Moore–Glasberg–Schlittenlacher (ISO 532-3) and the Sottek Hearing Model (ECMA-418-2)."
    },
    {
      "id": "sharpness",
      "name": "Sharpness",
      "summary": "The sensation produced by high-frequency content, in acum. Standardised in DIN 45692 on top of Zwicker loudness; ECMA-418-2 does not define sharpness."
    },
    {
      "id": "roughness",
      "name": "Roughness",
      "summary": "The sensation produced by fast amplitude or frequency modulation (roughly 15 to 300 Hz, strongest near 70 Hz), in asper."
    },
    {
      "id": "fluctuation-strength",
      "name": "Fluctuation strength",
      "summary": "The sensation produced by slow modulation (below about 20 Hz, strongest near 4 Hz), in vacil."
    },
    {
      "id": "tonality",
      "name": "Tonality",
      "summary": "How prominent tonal components are. Covers psychoacoustic tonality models (Aures, ECMA-418-2) and the engineering measures used for product noise (tone-to-noise ratio, prominence ratio) and for environmental noise (tonal audibility and tone adjustments)."
    },
    {
      "id": "impulsiveness",
      "name": "Impulsiveness",
      "summary": "How prominent impulsive sounds are, and the adjustment applied to them in environmental noise assessment."
    },
    {
      "id": "annoyance",
      "name": "Psychoacoustic annoyance",
      "summary": "Single-number models that combine loudness, sharpness, roughness, fluctuation strength and, in later models, tonality into a predicted annoyance."
    },
    {
      "id": "related",
      "name": "Related quantities",
      "summary": "Quantities that psychoacoustic tools often include and that are closely tied to the metrics above."
    }
  ],
  "metrics": [
    {
      "id": "loudness-zwicker",
      "family": "loudness",
      "name": "Zwicker loudness",
      "title": "Zwicker loudness (ISO 532-1, DIN 45631)",
      "aka": [
        "ISO 532-1",
        "ISO 532B",
        "ISO 532 method B",
        "DIN 45631",
        "DIN 45631/A1",
        "Zwicker method"
      ],
      "unit": "sone, phon",
      "summary": "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.",
      "notes": "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.",
      "references": [
        "iso-532-1975",
        "din-45631-1991",
        "chalupper-fastl-2002",
        "din-45631-a1-2010",
        "iso-532-1-2017",
        "iso-532-1-ed2-draft"
      ],
      "current": [
        "iso-532-1-2017"
      ],
      "conventions": [
        "**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 `prctile` and 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_skip` in SQAT, `time_skip_s` in MetaSona) matters for short signals."
      ],
      "edition_notes": {
        "iso-532-1975": "Method B (Zwicker) for stationary sounds, from third-octave levels.",
        "din-45631-1991": "Stationary sounds.",
        "chalupper-fastl-2002": "Dynamic loudness model built on Zwicker's model, also for hearing impairment (not standardised).",
        "din-45631-a1-2010": "Adds the procedure for time-varying sounds.",
        "iso-532-1-2017": "Stationary and time-varying procedures; Annex A reference program, Annex B test signals.",
        "iso-532-1-ed2-draft": "Second edition at committee-draft stage since November 2024."
      },
      "see_also": [
        "sharpness",
        "loudness-ecma-418-2"
      ],
      "url": "https://zhenxianli.github.io/LISQM/metrics/loudness-zwicker.html",
      "coverage": {
        "Python": "current",
        "MATLAB/Octave": "current",
        "C/C++": "new",
        "Rust": "new",
        "Julia": "new",
        "Other": "new"
      },
      "implementations": [
        {
          "project": "sqat",
          "reference": "iso-532-1-2017",
          "functions": [
            "Loudness_ISO532_1",
            "Loudness_ISO532_1_from_wavfile"
          ],
          "scope": "stationary and time-varying",
          "status": "available",
          "since": "v1.0",
          "validation": "standard-data",
          "derived_from": [
            "aarae"
          ],
          "validation_details": [
            "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)."
          ],
          "note": "v2.0 corrects the time-varying procedure (PR #48) and the `time_skip` handling of the stationary procedure; results differ from v1.x."
        },
        {
          "project": "mosqito",
          "reference": "iso-532-1-2017",
          "functions": [
            "loudness_zwst",
            "loudness_zwst_perseg",
            "loudness_zwst_freq",
            "loudness_zwtv"
          ],
          "scope": "stationary (also per segment and from a spectrum) and time-varying",
          "status": "available",
          "since": "1.0.0",
          "validation": "standard-data",
          "validation_scope": "outcome not stated",
          "derived_from": [
            "BASIC program of DIN 45631 (Zwicker et al., 1991)"
          ],
          "validation_details": [
            "Validation scripts use the ISO 532-1 Annex B test signals; the documentation marks it as validated."
          ],
          "conventions": [
            "Signals sampled below 48 kHz are resampled to 48 kHz (FFT method) with a warning; time-varying loudness rejects rates above 48 kHz."
          ]
        },
        {
          "project": "aarae",
          "reference": "iso-532-1-2017",
          "functions": [
            "Loudness_ISO532_1"
          ],
          "scope": "stationary and time-varying",
          "status": "available",
          "validation": "standard-data",
          "validation_scope": "time-varying signals only",
          "derived_from": [
            "ISO 532-1 Annex A reference program"
          ],
          "validation_details": [
            "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."
          ],
          "note": "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."
        },
        {
          "project": "ita-toolbox",
          "reference": "din-45631-a1-2010",
          "functions": [
            "ita_loudness_timevariant"
          ],
          "scope": "time-varying, with N5",
          "status": "available",
          "validation": "standard-data",
          "validation_scope": "results plotted, not checked",
          "validation_details": [
            "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."
          ],
          "conventions": [
            "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."
          ],
          "note": "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\"."
        },
        {
          "project": "aarae",
          "reference": "chalupper-fastl-2002",
          "functions": [
            "LoudnessCF"
          ],
          "scope": "time-varying",
          "status": "available",
          "validation": "not-stated",
          "derived_from": [
            "psysound3"
          ],
          "derived_by_author": true,
          "note": "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."
        },
        {
          "project": "ita-toolbox",
          "reference": "din-45631-1991",
          "functions": [
            "ita_loudness"
          ],
          "scope": "stationary; free or diffuse field",
          "status": "available",
          "validation": "standard-data",
          "derived_from": [
            "BASIC program of DIN 45631 (Zwicker et al., 1991)"
          ],
          "validation_details": [
            "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."
          ],
          "conventions": [
            "Third-octave levels come from an FFT by default, or from a filter bank (`'mode', 'filter'`)."
          ],
          "note": "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."
        },
        {
          "project": "metasona",
          "reference": "iso-532-1-2017",
          "functions": [
            "stationary_loudness",
            "time_varying_loudness",
            "loudness_from_levels"
          ],
          "scope": "stationary and time-varying; also from 28 third-octave levels",
          "status": "available",
          "since": "0.1.0",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "derived_from": [
            "mosqito",
            "sqat"
          ],
          "validation_details": [
            "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."
          ],
          "comparison_relations": {
            "mosqito": "source"
          }
        },
        {
          "project": "iso532-1-rs",
          "reference": "iso-532-1-2017",
          "functions": [
            "loudness_zwst",
            "loudness_zwtv",
            "ZwtvStream"
          ],
          "scope": "stationary, time-varying and streaming",
          "status": "available",
          "since": "0.1.0",
          "validation": "standard-data",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "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."
          ],
          "note": "Python uses the same names (`iso532.loudness_zwst` …); the C API has `iso532_loudness_zwst`, `iso532_loudness_zwtv` and `iso532_stream_*`."
        },
        {
          "project": "kirin-hypha",
          "reference": "iso-532-1-2017",
          "functions": [
            "kirin_measure::phase_d"
          ],
          "scope": "time-varying, per channel at 48 kHz; stored in the recorded data",
          "status": "available",
          "since": "1.0.0",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "derived_from": [
            "mosqito"
          ],
          "validation_details": [
            "Tests assert specific loudness within a relative 1e-3 of MoSQITo."
          ],
          "note": "Ported from MoSQITo v1.2.1.",
          "comparison_relations": {
            "mosqito": "source"
          }
        },
        {
          "project": "mosqito-net",
          "reference": "iso-532-1-2017",
          "functions": [
            "Sq.LoudnessZwst",
            "Sq.LoudnessZwstFreq",
            "Sq.LoudnessZwstPerSeg",
            "Sq.LoudnessZwtv"
          ],
          "scope": "stationary (also per segment and from a spectrum) and time-varying",
          "status": "available",
          "validation": "standard-data",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "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)."
          ],
          "derived_from": [
            "mosqito"
          ],
          "comparison_relations": {
            "mosqito": "source"
          }
        },
        {
          "project": "phonometry",
          "reference": "iso-532-1-2017",
          "functions": [
            "loudness_zwicker",
            "loudness_zwicker_from_spectrum"
          ],
          "scope": "stationary and time-varying",
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "derived_from": [
            "ISO 532-1 Annex A reference program"
          ],
          "validation_details": [
            "Annex B test signals are used in the tests."
          ]
        },
        {
          "project": "soundpalette",
          "reference": "iso-532-1-2017",
          "functions": [
            "sp::compute_psycho"
          ],
          "scope": "time-varying, reported as N5; monaural",
          "status": "available",
          "since": "v0.5.0",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "Compared with MoSQITo 1.2.1 on calibrated test signals, used as a development-time reference (`NOTES.md`, `tools/psycho_oracle`)."
          ],
          "note": "No MoSQITo code is ported."
        },
        {
          "project": "zwickerloudness-jl",
          "reference": "iso-532-1-2017",
          "functions": [
            "zwicker_loudness"
          ],
          "scope": "stationary, from 28 one-third-octave band levels",
          "status": "available",
          "since": "0.2.0",
          "validation": "standard-data",
          "validation_scope": "one Annex B signal",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "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)."
          ]
        },
        {
          "project": "zwickerloudness-jl",
          "reference": "iso-532-1-2017",
          "functions": [
            "zwicker_loudness_time_varying"
          ],
          "scope": "time-varying, from band levels at 2000 Hz; N5 and N10",
          "status": "available",
          "since": "0.3.0",
          "validation": "standard-data",
          "validation_scope": "one Annex B signal",
          "derived_from": [
            "mosqito"
          ],
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "Stages are tested against MoSQITo `loudness_zwtv` intermediates (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."
          ],
          "comparison_relations": {
            "mosqito": "source"
          }
        },
        {
          "project": "pysqat",
          "reference": "iso-532-1-2017",
          "functions": [
            "Loudness_ISO532_1"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with SQAT v1.3, run in MATLAB, by `validation/FINAL_VAL.py`; the generated reports are not committed."
          ],
          "derived_from": [
            "sqat"
          ],
          "comparison_relations": {
            "sqat": "source"
          }
        },
        {
          "project": "psychoacoustic-parameters-measurer",
          "reference": "iso-532-1-2017",
          "functions": [
            "loudness_ISO532",
            "loudness_ISO532_time"
          ],
          "scope": "stationary and time-varying, from third-octave levels",
          "status": "available",
          "validation": "not-stated",
          "note": "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."
        },
        {
          "project": "psysound3",
          "reference": "chalupper-fastl-2002",
          "functions": [
            "@LoudnessCF"
          ],
          "scope": "time-varying",
          "status": "available",
          "validation": "not-stated",
          "note": "The analyser names J. Chalupper and H. Fastl as authors."
        },
        {
          "project": "deeuu-loudness",
          "reference": "din-45631-1991",
          "functions": [
            "StationaryLoudnessDIN456311991"
          ],
          "scope": "stationary only",
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "GENESIS ACOUSTICS code (Python port)"
          ],
          "derived_from": [
            "BASIC program of DIN 45631 (Zwicker et al., 1991)"
          ],
          "validation_details": [
            "Tested against \"a quick and dirty Python port of the Matlab code private by GENESIS ACOUSTICS\"."
          ],
          "note": "Uses 28 third-octave filters with third-order Butterworth responses after ANSI S1.11:1986; there is no time-varying (DIN 45631/A1) model."
        },
        {
          "project": "zwickerloudness-sourceforge",
          "reference": "din-45631-1991",
          "scope": "stationary, from one-third-octave band levels",
          "status": "available",
          "validation": "self-tests",
          "derived_from": [
            "BASIC program of DIN 45631 (Zwicker et al., 1991)"
          ],
          "validation_details": [
            "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."
          ],
          "note": "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."
        }
      ],
      "also_through": [
        {
          "project": "rota-order",
          "reference": "iso-532-1-2017",
          "functions": [
            "rota.bridges.mosqito.loudness"
          ],
          "scope": "time-varying, through MoSQITo's loudness_zwtv",
          "status": "available",
          "since": "0.6.0",
          "via": "mosqito",
          "validation": "self-tests",
          "validation_details": [
            "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_rpm` gives what binning the values by hand gives."
          ]
        },
        {
          "project": "rota-order",
          "reference": "iso-532-1-2017",
          "functions": [
            "rota.bridges.sqat.loudness"
          ],
          "scope": "time-varying, through SQAT v2.0's Loudness_ISO532_1 in MATLAB",
          "status": "available",
          "since": "0.6.0",
          "via": "sqat",
          "validation": "self-tests",
          "validation_details": [
            "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."
          ]
        },
        {
          "project": "psychobox",
          "reference": "iso-532-1-2017",
          "functions": [
            "Loudness.loudnessZWK"
          ],
          "scope": "stationary",
          "status": "available",
          "via": "mosqito",
          "validation": "not-stated",
          "note": "Calls `loudness_zwst` of MoSQITo 1.2.1."
        },
        {
          "project": "soundscapy",
          "reference": "iso-532-1-2017",
          "functions": [
            "Binaural.mosqito_metric",
            "process_all_metrics"
          ],
          "scope": "time-varying, per channel",
          "status": "available",
          "via": "mosqito",
          "validation": "not-stated",
          "note": "Calls `loudness_zwtv`."
        },
        {
          "project": "zwickerloudnessaudio-jl",
          "reference": "iso-532-1-2017",
          "functions": [
            "loudness_zwst",
            "band_levels"
          ],
          "scope": "stationary, from a waveform or WAV file",
          "status": "available",
          "since": "0.2.0",
          "via": "zwickerloudness-jl",
          "validation": "standard-data",
          "validation_details": [
            "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)."
          ],
          "conventions": [
            "Stationary loudness resamples input below 48 kHz to 48 kHz (polyphase), with a warning."
          ],
          "note": "Computes the third-octave levels itself (per-band Butterworth filters of order 3 by default, as in MoSQITo) and passes them to ZwickerLoudness.jl for the loudness."
        },
        {
          "project": "zwickerloudnessaudio-jl",
          "reference": "iso-532-1-2017",
          "functions": [
            "loudness_zwtv"
          ],
          "scope": "time-varying, from a waveform or WAV file at 48 kHz",
          "status": "available",
          "since": "0.3.0",
          "via": "zwickerloudness-jl",
          "validation": "standard-data",
          "compared_with": [
            "mosqito"
          ],
          "derived_from": [
            "mosqito"
          ],
          "validation_details": [
            "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."
          ],
          "conventions": [
            "Time-varying loudness accepts 48 kHz input only (an error otherwise)."
          ],
          "note": "The Annex A filter cascade is transcribed from MoSQITo (`_third_octave_levels`, `_square_and_smooth`).",
          "comparison_relations": {
            "mosqito": "source"
          }
        }
      ]
    },
    {
      "id": "loudness-moore-glasberg",
      "family": "loudness",
      "name": "Moore–Glasberg loudness",
      "title": "Moore–Glasberg loudness of stationary sounds (ISO 532-2, ANSI S3.4)",
      "aka": [
        "ISO 532-2",
        "ANSI S3.4",
        "ANSI/ASA S3.4-2007",
        "Moore-Glasberg method",
        "Cambridge loudness model"
      ],
      "unit": "sone, phon",
      "summary": "Loudness of stationary sounds from the Moore–Glasberg model: the spectrum is turned into an excitation pattern on the ERB-number scale, then into specific loudness, which is summed. ANSI S3.4-2007 standardised the model of Moore, Glasberg & Baer (1997) with later modifications; ISO 532-2:2017 specifies the method for monaural and binaural listening.",
      "references": [
        "moore-1997",
        "ansi-s3-4-2007",
        "chen-2011",
        "iso-532-2-2017",
        "iso-532-2-ed2-draft"
      ],
      "current": [
        "iso-532-2-2017"
      ],
      "edition_notes": {
        "moore-1997": "Model paper (thresholds, loudness and partial loudness).",
        "ansi-s3-4-2007": "American standard based on the 1997 model with later modifications.",
        "chen-2011": "Faster excitation-pattern calculation, also for hearing loss (not standardised).",
        "iso-532-2-2017": "Monaural and binaural loudness of stationary sounds; source code supplied with the standard.",
        "iso-532-2-ed2-draft": "Second edition at committee-draft stage since November 2024."
      },
      "see_also": [
        "loudness-moore-glasberg-time-varying"
      ],
      "url": "https://zhenxianli.github.io/LISQM/metrics/loudness-moore-glasberg.html",
      "coverage": {
        "Python": "new",
        "MATLAB/Octave": "partial",
        "C/C++": "partial",
        "Rust": "",
        "Julia": "",
        "Other": ""
      },
      "implementations": [
        {
          "project": "amt",
          "reference": "chen-2011",
          "functions": [
            "chen2011"
          ],
          "status": "available",
          "validation": "standard-data",
          "validation_details": [
            "Has the experiment script `exp_chen2011`; AMT's experiment scripts reproduce the results of the publication they are named after."
          ],
          "note": "Listed as \"CHEN2011 - Fast excitation pattern estimation\"."
        },
        {
          "project": "amt",
          "reference": "moore-1997",
          "functions": [
            "moore1997"
          ],
          "status": "available",
          "validation": "standard-data",
          "validation_details": [
            "AMT's experiment scripts (`exp_…`) reproduce published results; this model has `exp_moore1997`."
          ],
          "note": "Listed as \"MOORE1997 - Loudness model for stationary signals\" in models/Contents.m."
        },
        {
          "project": "aarae",
          "reference": "moore-1997",
          "functions": [
            "Loudness_MGB2b"
          ],
          "scope": "one channel, or two channels for binaural loudness",
          "status": "available",
          "validation": "not-stated",
          "derived_from": [
            "psysound3"
          ],
          "derived_by_author": true,
          "note": "A port and extension of PsySound3's code by Densil Cabrera and Doheon Lee, version 1.02 (27 October 2015). Two-channel input gives binaural loudness after Moore & Glasberg (2007). The audio is resampled to 32 kHz."
        },
        {
          "project": "phonometry",
          "reference": "iso-532-2-2017",
          "functions": [
            "loudness_moore_glasberg",
            "loudness_moore_glasberg_from_spectrum",
            "loudness_moore_glasberg_from_third_octave"
          ],
          "scope": "with binaural inhibition",
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "validation_details": [
            "The documentation says it reproduces the Annex B tone and broadband cases to within a percent or two."
          ]
        },
        {
          "project": "numpylib-psychoacoustic",
          "reference": "moore-1997",
          "functions": [
            "model.moore1997",
            "equalSones.getEqualSones"
          ],
          "status": "available",
          "validation": "standard-data",
          "compared_with": [
            "amt"
          ],
          "validation_details": [
            "The implementation document says the model is compared with the results shown in the original article (plots of its Fig. 8 and Fig. 12).",
            "Numerical error reports (PDF) compare intermediate arrays, such as the outer- and middle-ear filter, with AMT's MATLAB output."
          ],
          "derived_from": [
            "amt"
          ],
          "comparison_relations": {
            "amt": "source"
          }
        },
        {
          "project": "deeuu-loudness",
          "reference": "chen-2011",
          "functions": [
            "StationaryLoudnessCHGM2011"
          ],
          "status": "available",
          "validation": "self-tests"
        },
        {
          "project": "deeuu-loudness",
          "reference": "ansi-s3-4-2007",
          "functions": [
            "StationaryLoudnessANSIS342007"
          ],
          "scope": "with the binaural inhibition of Moore & Glasberg (2007) for two ears",
          "status": "available",
          "validation": "self-tests",
          "validation_details": [
            "Unit tests cover each module and model.",
            "A validation script writes computed and expected loudness of pure tones to CSV; the expected values are labelled \"Table 7\" and \"Example 2\" without naming their source."
          ]
        },
        {
          "project": "rapid-loudness-sharpness",
          "reference": "ansi-s3-4-2007",
          "functions": [
            "stationaryLoudness"
          ],
          "status": "available",
          "validation": "not-stated"
        },
        {
          "project": "psysound3",
          "reference": "moore-1997",
          "functions": [
            "@LoudnessMGB"
          ],
          "status": "available",
          "validation": "not-stated",
          "note": "Also cites Glasberg & Moore (1990) for the auditory filters. The analyser description says it covers time-varying and binaural loudness, and it also cites Glasberg & Moore (2002) and Moore & Glasberg (2007)."
        }
      ]
    },
    {
      "id": "loudness-moore-glasberg-time-varying",
      "family": "loudness",
      "name": "Time-varying loudness (Moore–Glasberg–Schlittenlacher)",
      "title": "Time-varying loudness, Moore–Glasberg–Schlittenlacher (ISO 532-3)",
      "aka": [
        "ISO 532-3",
        "TVL",
        "time-varying loudness",
        "Glasberg and Moore 2002",
        "Moore-Glasberg-Schlittenlacher method",
        "short-term loudness",
        "long-term loudness"
      ],
      "unit": "sone, phon",
      "summary": "Loudness of time-varying sounds as instantaneous, short-term and long-term loudness. It starts from the Glasberg & Moore (2002) model; Moore et al. (2016) added binaural inhibition and Moore et al. (2018) revised the time constants. ISO 532-3:2023 standardises the resulting Moore–Glasberg–Schlittenlacher method for stationary and time-varying sounds.",
      "references": [
        "glasberg-moore-2002",
        "moore-2016",
        "moore-2018",
        "iso-532-3-2023",
        "iso-532-3-ed2-draft"
      ],
      "current": [
        "iso-532-3-2023"
      ],
      "conventions": [
        "**Sample rate.** The Cambridge programs and ISO 532-3 work at 32 kHz. Most implementations resample to it; phonometry runs at the native rate (a documented deviation), and the Swift & Gee code and the HAW tool expect 32 kHz input.",
        "**Which output.** The models give instantaneous, short-term and long-term loudness; compare like with like."
      ],
      "edition_notes": {
        "glasberg-moore-2002": "Time-varying loudness model (short-term and long-term loudness).",
        "moore-2016": "Adds binaural inhibition.",
        "moore-2018": "Revised time constants.",
        "iso-532-3-2023": "Standardised method; source code supplied with the standard.",
        "iso-532-3-ed2-draft": "Second edition at committee-draft stage since November 2024."
      },
      "see_also": [
        "loudness-moore-glasberg"
      ],
      "url": "https://zhenxianli.github.io/LISQM/metrics/loudness-moore-glasberg-time-varying.html",
      "coverage": {
        "Python": "new",
        "MATLAB/Octave": "current",
        "C/C++": "partial",
        "Rust": "",
        "Julia": "",
        "Other": ""
      },
      "implementations": [
        {
          "project": "js2251-iso532-3",
          "reference": "iso-532-3-2023",
          "functions": [
            "tv2018"
          ],
          "scope": "reference MATLAB code referred to in ISO 532-3, per its readme",
          "status": "available",
          "validation": "not-stated",
          "validation_details": [
            "The folder \"code for tables\" has scripts that compute Table 5 (sone to phon) and the values of Annexes B and C (AnnexC.m is headed \"Signals numbered as in ISO 532-2 Annex B\"); the scripts do not name ISO 532-3."
          ],
          "note": "Written by the model's authors (per the readme PDF)."
        },
        {
          "project": "amt",
          "reference": "moore-2016",
          "functions": [
            "moore2016"
          ],
          "scope": "binaural",
          "status": "available",
          "validation": "not-stated",
          "validation_details": [
            "There is no `exp_moore2016` experiment script on the develop branch."
          ],
          "note": "Listed as \"MOORE2016 - Binaural loudness model\". The header says Josef Schlittenlacher provided the original implementation for the AMT in 2018, from code written for ANSI S3.4-2007 and ISO 532-2:2017."
        },
        {
          "project": "amt",
          "reference": "glasberg-moore-2002",
          "functions": [
            "glasberg2002"
          ],
          "status": "available",
          "validation": "standard-data",
          "validation_details": [
            "Has the experiment script `exp_glasberg2002`; AMT's experiment scripts reproduce the results of the publication they are named after."
          ],
          "note": "Listed as \"GLASBERG2002 - Loudness model for time-variant signals\"."
        },
        {
          "project": "aarae",
          "reference": "glasberg-moore-2002",
          "functions": [
            "Loudness_MGB2b"
          ],
          "scope": "time-varying; one channel, or two channels for binaural loudness",
          "status": "available",
          "validation": "not-stated",
          "derived_from": [
            "psysound3"
          ],
          "derived_by_author": true,
          "note": "Same function as the stationary model; the binaural extension follows Moore & Glasberg (2007)."
        },
        {
          "project": "phonometry",
          "reference": "iso-532-3-2023",
          "functions": [
            "loudness_moore_glasberg_time"
          ],
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "validation_details": [
            "A documented deviation: the Annex B WAV-file cases are not reproduced, and Annex C values are used instead."
          ],
          "conventions": [
            "Documented deviation: it runs at the native sample rate instead of resampling to 32 kHz."
          ]
        },
        {
          "project": "torch-amt",
          "reference": "moore-2016",
          "functions": [
            "torch_amt.models.Moore2016"
          ],
          "scope": "binaural",
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "amt"
          ],
          "validation_details": [
            "Agreement with AMT is claimed in the documentation, without stored reference data."
          ],
          "note": "Described as a \"1:1 port\" of AMT `moore2016`, with outer and middle ear per ANSI S3.4-2007 (docstring).",
          "derived_from": [
            "amt"
          ],
          "comparison_relations": {
            "amt": "source"
          }
        },
        {
          "project": "numpylib-psychoacoustic",
          "reference": "glasberg-moore-2002",
          "functions": [
            "model.glasberg2002"
          ],
          "status": "available",
          "validation": "not-stated",
          "note": "Present in the code but not described in the implementation document.",
          "derived_from": [
            "amt"
          ]
        },
        {
          "project": "torch-amt",
          "reference": "glasberg-moore-2002",
          "functions": [
            "torch_amt.models.Glasberg2002"
          ],
          "scope": "short-term and long-term loudness",
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "amt"
          ],
          "validation_details": [
            "Agreement with AMT is claimed in the documentation, without stored reference data."
          ],
          "note": "Ported from AMT `glasberg2002`.",
          "derived_from": [
            "amt"
          ],
          "comparison_relations": {
            "amt": "source"
          }
        },
        {
          "project": "loudnessmodel",
          "reference": "moore-2018",
          "functions": [
            "tvl2018.compute_loudness",
            "tvl2018_jax.compute_loudness"
          ],
          "scope": "instantaneous, short-term and long-term loudness; binaural",
          "status": "available",
          "validation": "self-tests",
          "validation_details": [
            "Tests run in GitHub Actions compare overall loudness, the first five short-term and long-term values and selected intermediate stages for one input (1 kHz tone, 100 ms, 32 kHz) with hard-coded expected values.",
            "The README calls this \"a known accurate output\", but neither it nor the tests say where the values come from."
          ],
          "derived_from": [
            "js2251-iso532-3"
          ]
        },
        {
          "project": "deeuu-loudness",
          "reference": "glasberg-moore-2002",
          "functions": [
            "DynamicLoudnessGM2002"
          ],
          "status": "available",
          "validation": "self-tests",
          "note": "Per the header, excitation patterns follow ANSI S3.4-2007, and parameter sets use the modified long-term time constants of Moore et al. (2003) and the ANSI S3.4-2007 equation for specific loudness at high levels."
        },
        {
          "project": "haw-specific-loudness",
          "reference": "glasberg-moore-2002",
          "functions": [
            "loud_gui",
            "matlab_loud"
          ],
          "scope": "specific loudness over time on ERB bands; three temporal models",
          "status": "available",
          "validation": "reference-code",
          "compared_with": [
            "LOUDAES and TVL (Glasberg & Moore's programs)"
          ],
          "validation_details": [
            "The thesis compares the total loudness of pure tones (30–100 dB) with LOUDAES, Glasberg & Moore's program for stationary sounds: mostly within 5 %, with larger deviations at low levels near 50 Hz and above 5 kHz (−9.3 % for 5 kHz at 30 dB).",
            "For two equal-level tones at 1 and 2 kHz, the deviation from LOUDAES ranges from −4.4 % to +3.8 % with the Hann-window FFT and reaches +6.7 % with the Fourier-time transform.",
            "For the stationary part of signals the thesis reports good agreement with TVL, Glasberg & Moore's program for time-varying sounds, without figures."
          ]
        },
        {
          "project": "psysound3",
          "reference": "glasberg-moore-2002",
          "functions": [
            "@LoudnessMGB"
          ],
          "scope": "time-varying and binaural",
          "status": "available",
          "validation": "not-stated",
          "note": "The same analyser as the stationary entry; its description cites Glasberg & Moore (2002)."
        },
        {
          "project": "rapid-loudness-sharpness",
          "reference": "glasberg-moore-2002",
          "functions": [
            "Glasberg_loudness"
          ],
          "status": "available",
          "validation": "not-stated"
        }
      ]
    },
    {
      "id": "loudness-ecma-418-2",
      "family": "loudness",
      "name": "Sottek Hearing Model loudness",
      "title": "Loudness from the Sottek Hearing Model (ECMA-418-2)",
      "aka": [
        "ECMA-418-2 loudness",
        "Sottek Hearing Model",
        "SHM loudness",
        "sone_HMS",
        "hearing model loudness"
      ],
      "unit": "sone_HMS",
      "summary": "Loudness from the Sottek Hearing Model defined in ECMA-418-2. The hearing model (Clause 5) produces specific loudness; the 2nd edition (2022) added a loudness calculation for sounds with tonal and noise components (Clause 8). ECMA-418-2 has had four editions in five years, so implementations of different editions can disagree.",
      "references": [
        "ecma-418-2-ed1",
        "ecma-418-2-ed2",
        "ecma-418-2-ed3",
        "ecma-418-2-ed4"
      ],
      "current": [
        "ecma-418-2-ed4"
      ],
      "conventions": [
        "**Edition.** The four editions give different results; compare implementations of the same edition (see the table of editions).",
        "**Which loudness.** Clause 5 gives the hearing model's basic loudness; from the 2nd edition on, Clause 8 defines the loudness to report. MoSQITo and Mosqito.NET compute only the Clause 5 value, while the RefMap code and its ports (SQAT, sottek-hearing-model, MetaSona) compute the Clause 8 loudness.",
        "**Start of the signal.** The filters need time to settle, so overall values leave out the first 304 ms (Section 8.1.4 of the 2025 edition, as cited by SQAT, which enforces it).",
        "**Sample rate.** The model is defined at 48 kHz; other rates are resampled, and resamplers differ slightly.",
        "**Sound field and channels.** The outer- and middle-ear filter can be free frontal or, from the 3rd edition, diffuse, and two channels can be combined into one binaural value. Check both settings."
      ],
      "edition_notes": {
        "ecma-418-2-ed1": "Hearing model (Clause 5) with specific loudness.",
        "ecma-418-2-ed2": "New Clause 8, loudness of sounds with subcritical or wider bandwidth.",
        "ecma-418-2-ed3": "Adds a diffuse-field outer and middle ear filter.",
        "ecma-418-2-ed4": "Hearing-model clauses 5.1.2.2 and 5.1.5.2 revised; conformance requires 48 kHz sampling."
      },
      "see_also": [
        "loudness-zwicker",
        "tonality-ecma-418-2",
        "roughness-ecma-418-2",
        "fluctuation-strength-ecma-418-2"
      ],
      "url": "https://zhenxianli.github.io/LISQM/metrics/loudness-ecma-418-2.html",
      "coverage": {
        "Python": "current",
        "MATLAB/Octave": "current",
        "C/C++": "new",
        "Rust": "",
        "Julia": "",
        "Other": "partial"
      },
      "implementations": [
        {
          "project": "sqat",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "Loudness_ECMA418_2",
            "LoudnessFromComp_ECMA418_2"
          ],
          "status": "available",
          "since": "v2.0",
          "validation": "cross-implementation",
          "derived_from": [
            "refmap-psychoacoustics"
          ],
          "derived_by_author": true,
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Checked for the 4th edition against the ISO 226:2003 equal-loudness contours and against reference results from HEAD acoustics ArtemiS SUITE 17.1 (named in the source of SQAT's validation page) for a binaural recording of a train station (last checked in November 2025)."
          ],
          "note": "Updated to the 4th edition in 2025."
        },
        {
          "project": "sqat",
          "reference": "ecma-418-2-ed3",
          "functions": [
            "Loudness_ECMA418_2",
            "LoudnessFromComp_ECMA418_2"
          ],
          "scope": "mono or two channels with binaural combination",
          "status": "available",
          "since": "v1.3",
          "validation": "cross-implementation",
          "derived_from": [
            "refmap-psychoacoustics"
          ],
          "derived_by_author": true,
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Checked against the ISO 226:2003 equal-loudness contours and against reference results from HEAD acoustics ArtemiS SUITE 15.7 (named in the source of SQAT's validation page) for a binaural recording of a train station."
          ],
          "note": "In v1.3; v2.0 follows the 4th edition."
        },
        {
          "project": "mosqito",
          "reference": "ecma-418-2-ed2",
          "functions": [
            "loudness_ecma"
          ],
          "scope": "Clause 5 hearing-model specific and total loudness only; the Clause 8 loudness added in the 2nd edition is not implemented",
          "status": "available",
          "since": "1.2.0",
          "validation": "standard-data",
          "validation_scope": "outcome not stated",
          "validation_details": [
            "Validation scripts compare with figures of the standard."
          ],
          "note": "Followed the 1st edition (2020) in versions 1.0.0–1.1.1 and the 2nd edition (2022) from 1.2.0. It grew out of the hearing model that Daniel Jiménez-Caminero added in May 2021, which is also kept in MoSQITo-FDP."
        },
        {
          "project": "sottek-hearing-model",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "shm_loudness_ecma",
            "shm_loudness_ecma_from_comp"
          ],
          "scope": "mono or stereo, with combined binaural output",
          "status": "available",
          "since": "0.1.9",
          "validation": "standard-data",
          "validation_scope": "calibration signals and one recording",
          "derived_by_author": true,
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Unit tests check the standard's calibration signals (1 kHz, 40 dB gives 1 sone_HMS).",
            "RefMap's verification compared the Python code, before it became this package, and the MATLAB original with HEAD acoustics ArtemiS v17.1 for the two calibration signals and a 30 s binaural street recording."
          ],
          "derived_from": [
            "refmap-psychoacoustics"
          ]
        },
        {
          "project": "refmap-psychoacoustics",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "acousticSHMLoudness",
            "acousticSHMLoudnessFromComponent"
          ],
          "scope": "binaural and specific loudness",
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "MATLAB and Python verified against HEAD acoustics ArtemiS v17.1 for a 1 kHz tone at 40 dB SPL, a 1 kHz tone amplitude-modulated at 70 Hz at 60 dB SPL and a 30 s binaural street recording.",
            "The audio and reference results are on Zenodo (doi:10.5281/zenodo.18849587)."
          ]
        },
        {
          "project": "metasona",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "loudness_ecma",
            "ecma_tonal_analysis"
          ],
          "scope": "Clause 8 loudness with tonal/noise separation; mono or stereo",
          "status": "available",
          "since": "0.2.0",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "The project says that detailed validation and reference comparisons are kept outside the repository; the results are not published."
          ],
          "note": "Adapted from the SQAT/RefMap MATLAB code by Lotinga and Torjussen.",
          "derived_from": [
            "sqat"
          ],
          "comparison_relations": {
            "sqat": "source"
          }
        },
        {
          "project": "phonometry",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "loudness_ecma"
          ],
          "scope": "mono only",
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "validation_scope": "calibration signal only; outside the allowed adjustment",
          "validation_details": [
            "Checked at the calibration signal only, where it gives 0.9843 sone_HMS (−1.55 %)."
          ]
        },
        {
          "project": "mosqito-net",
          "reference": "ecma-418-2-ed2",
          "functions": [
            "Sq.LoudnessEcma"
          ],
          "scope": "Clause 5 hearing-model loudness only, as in MoSQITo",
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "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); MoSQITo's unit tests are ported too."
          ],
          "derived_from": [
            "mosqito"
          ],
          "comparison_relations": {
            "mosqito": "source"
          }
        },
        {
          "project": "mosqito-fdp",
          "reference": "ecma-418-2-ed1",
          "functions": [
            "comp_loudness"
          ],
          "scope": "hearing model with specific and total loudness",
          "status": "available",
          "validation": "standard-data",
          "validation_details": [
            "Validation scripts compare the ear filter and model output with figures and values from ECMA-418-2 and ECMA-74 Annex F."
          ],
          "derived_by_author": true,
          "note": "Module `mosqito.functions.hearing_model`. Its author committed the same hearing model to MoSQITo on 2021-05-30, two weeks before this snapshot.",
          "derived_from": [
            "mosqito"
          ]
        }
      ],
      "also_through": [
        {
          "project": "rota-order",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "rota.bridges.sottek_hearing_model.loudness"
          ],
          "scope": "through sottek-hearing-model's shm_loudness_ecma_from_comp",
          "status": "available",
          "since": "0.6.0",
          "via": "sottek-hearing-model",
          "validation": "self-tests",
          "validation_details": [
            "Tests, which run only where sottek-hearing-model is installed (the project's continuous integration does not install it), check that the wrapper returns what a direct call of the package gives."
          ]
        },
        {
          "project": "pysqat",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "Loudness_ECMA418_2"
          ],
          "status": "available",
          "via": "sottek-hearing-model",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared by `validation/FINAL_VAL.py` with the bundled SQAT v1.3 MATLAB code, which follows ECMA-418-2:2024 (3rd edition), so the comparison crosses editions."
          ],
          "comparison_relations": {
            "sqat": "shared:refmap-psychoacoustics"
          }
        },
        {
          "project": "psychobox",
          "reference": "ecma-418-2-ed2",
          "functions": [
            "Loudness.loudnessECMA"
          ],
          "scope": "Clause 5 hearing-model loudness only",
          "status": "available",
          "via": "mosqito",
          "validation": "not-stated",
          "note": "Calls `loudness_ecma` of MoSQITo 1.2.1 (ECMA-418-2:2022, Clause 5 only)."
        }
      ]
    },
    {
      "id": "sharpness",
      "family": "sharpness",
      "name": "Sharpness",
      "title": "Sharpness (DIN 45692, Aures, von Bismarck)",
      "aka": [
        "DIN 45692",
        "acum",
        "Zwicker sharpness",
        "Aures sharpness",
        "von Bismarck sharpness"
      ],
      "unit": "acum",
      "summary": "Sharpness is the weighted first moment of specific loudness along the critical-band rate, with a weighting that emphasises high frequencies. DIN 45692:2009 standardises the weighting and a test procedure, using Zwicker specific loudness (ISO 532-1 / DIN 45631). Most implementations also offer the weightings of von Bismarck (1974) and Aures (1985).",
      "references": [
        "von-bismarck-1974",
        "aures-1985-euphony",
        "fastl-zwicker-2007",
        "din-45692-2009",
        "swift-gee-2017"
      ],
      "current": [
        "din-45692-2009"
      ],
      "conventions": [
        "**Weighting.** The DIN 45692, Aures and von Bismarck weightings give different values for the same sound, and Aures' weighting depends on loudness. Many tools offer several; check which one is used (RefMap's default is Aures).",
        "**Loudness input.** Sharpness is computed from Zwicker specific loudness, so the loudness choices (sound field, calibration, sample rate) carry over. Sharpness from another loudness model, such as ECMA-418-2 (RefMap) or Moore–Glasberg (Swift & Gee), is a different quantity."
      ],
      "edition_notes": {
        "von-bismarck-1974": "Original sharpness weighting.",
        "aures-1985-euphony": "Weighting that depends on total loudness.",
        "fastl-zwicker-2007": "Zwicker & Fastl weighting as given in the textbook.",
        "din-45692-2009": "Standardised weighting and test procedure; no revision announced."
      },
      "see_also": [
        "loudness-zwicker"
      ],
      "url": "https://zhenxianli.github.io/LISQM/metrics/sharpness.html",
      "coverage": {
        "Python": "current",
        "MATLAB/Octave": "current",
        "C/C++": "new",
        "Rust": "new",
        "Julia": "new",
        "Other": "new"
      },
      "implementations": [
        {
          "project": "sqat",
          "reference": "din-45692-2009",
          "functions": [
            "Sharpness_DIN45692",
            "Sharpness_DIN45692_from_loudness",
            "Sharpness_DIN45692_from_wavfile"
          ],
          "scope": "DIN 45692 weighting, plus von Bismarck and Aures options",
          "status": "available",
          "since": "v1.0",
          "validation": "standard-data",
          "validation_details": [
            "Checked with the narrowband and broadband test signals of DIN 45692."
          ]
        },
        {
          "project": "mosqito",
          "reference": "din-45692-2009",
          "functions": [
            "sharpness_din_st",
            "sharpness_din_tv",
            "sharpness_din_perseg",
            "sharpness_din_from_loudness",
            "sharpness_din_freq"
          ],
          "scope": "weightings: DIN 45692, Aures, von Bismarck, Fastl",
          "status": "available",
          "since": "1.0.2",
          "validation": "standard-data",
          "validation_scope": "outcome not stated",
          "validation_details": [
            "Validation scripts use the DIN 45692 test signals; the documentation marks it as validated."
          ]
        },
        {
          "project": "refmap-psychoacoustics",
          "reference": "din-45692-2009",
          "functions": [
            "acousticSharpnessSHM",
            "acousticSharpFromSHMLoud"
          ],
          "scope": "DIN 45692 weighting applied to ECMA-418-2 loudness",
          "status": "available",
          "validation": "not-stated",
          "note": "The DIN 45692 weighting is the option `widmann`; Aures (the default) and von Bismarck weightings are also offered. DIN 45692 itself is defined on Zwicker specific loudness. A further variant works from a Zwicker-based quasi-loudness (`acousticSharpFromQuasiLoud`). An inaccuracy in the Aures weighting was fixed on 2026-09-18."
        },
        {
          "project": "aarae",
          "reference": "fastl-zwicker-2007",
          "functions": [
            "sharpness_Fastl"
          ],
          "scope": "from the specific loudness of LoudnessCF",
          "status": "available",
          "validation": "not-stated",
          "note": "The header describes a weighting fitted to data in Zwicker & Fastl's *Psychoacoustics: Facts and Models* (edition not stated), names the method \"Fastl (1991)\" and credits Claire Churchill (2004)."
        },
        {
          "project": "metasona",
          "reference": "din-45692-2009",
          "functions": [
            "sharpness_din45692"
          ],
          "scope": "from specific loudness",
          "status": "available",
          "since": "0.1.0",
          "validation": "not-stated"
        },
        {
          "project": "kirin-hypha",
          "reference": "din-45692-2009",
          "functions": [
            "kirin_measure::phase_d::sharpness"
          ],
          "scope": "from the time-varying specific loudness; shown in the plug-in",
          "status": "available",
          "since": "1.0.0",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "derived_from": [
            "mosqito"
          ],
          "validation_details": [
            "Tests assert agreement with MoSQITo within 0.05 acum."
          ],
          "comparison_relations": {
            "mosqito": "source"
          }
        },
        {
          "project": "mosqito-net",
          "reference": "din-45692-2009",
          "functions": [
            "Sq.SharpnessDinSt",
            "Sq.SharpnessDinTv",
            "Sq.SharpnessDinPerSeg",
            "Sq.SharpnessDinFreq"
          ],
          "scope": "weightings: DIN 45692, Aures, von Bismarck, Fastl",
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "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); MoSQITo's unit tests are ported too."
          ],
          "derived_from": [
            "mosqito"
          ],
          "comparison_relations": {
            "mosqito": "source"
          }
        },
        {
          "project": "phonometry",
          "reference": "din-45692-2009",
          "functions": [
            "sharpness_din",
            "sharpness_din_from_specific"
          ],
          "scope": "also the informative Aures and von Bismarck variants",
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "validation_details": [
            "Checked with the DIN 45692 reference signal and Tables A.2 and A.3."
          ]
        },
        {
          "project": "psychoacousticmetrics-jl",
          "reference": "din-45692-2009",
          "functions": [
            "sharpness"
          ],
          "scope": "weightings: DIN 45692 (default), Aures, von Bismarck, Fastl; from a ZwickerLoudness.jl result",
          "status": "available",
          "since": "0.2.0",
          "validation": "standard-data",
          "compared_with": [
            "mosqito"
          ],
          "uses": [
            "zwickerloudness-jl"
          ],
          "validation_details": [
            "Tested against all 41 reference signals of DIN 45692:2009 chapter 6 (21 narrowband, 20 broadband) within the standard's tolerance of ±max(5 %, 0.05 acum).",
            "Cross-checked against MoSQITo for all four weightings.",
            "Total loudness N is computed as the Riemann sum over the 240-bin specific loudness (`0.1 * sum`), not taken from `ZwickerResult.loudness` (see the `sharpness` docstring)."
          ]
        },
        {
          "project": "soundpalette",
          "reference": "din-45692-2009",
          "functions": [
            "sp::compute_psycho"
          ],
          "scope": "from time-averaged specific loudness",
          "status": "available",
          "since": "v0.5.0",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "Compared with MoSQITo 1.2.1 (tolerance ±5 %)."
          ]
        },
        {
          "project": "pysqat",
          "reference": "din-45692-2009",
          "functions": [
            "Sharpness_DIN45692",
            "Sharpness_DIN45692_from_loudness"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with SQAT v1.3, run in MATLAB, by `validation/FINAL_VAL.py`; the generated reports are not committed."
          ],
          "derived_from": [
            "sqat"
          ],
          "comparison_relations": {
            "sqat": "source"
          }
        },
        {
          "project": "rapid-loudness-sharpness",
          "reference": "swift-gee-2017",
          "functions": [
            "stationaryLoudness",
            "Glasberg_loudness"
          ],
          "scope": "from Moore–Glasberg specific loudness, stationary and time-varying",
          "status": "available",
          "validation": "not-stated"
        },
        {
          "project": "psychoacoustic-parameters-measurer",
          "reference": "din-45692-2009",
          "functions": [
            "calc_sharpness"
          ],
          "status": "available",
          "validation": "not-stated",
          "note": "The file header says \"Sharpness DIN 45692\"; the function also returns the von Bismarck and Aures variants."
        }
      ],
      "also_through": [
        {
          "project": "rota-order",
          "reference": "din-45692-2009",
          "functions": [
            "rota.bridges.mosqito.sharpness"
          ],
          "scope": "through MoSQITo's sharpness_din_from_loudness",
          "status": "available",
          "since": "0.6.0",
          "via": "mosqito",
          "validation": "self-tests",
          "validation_details": [
            "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, also when the sharpness is computed from an earlier loudness result."
          ]
        },
        {
          "project": "rota-order",
          "reference": "din-45692-2009",
          "functions": [
            "rota.bridges.sqat.sharpness"
          ],
          "scope": "through SQAT v2.0's Sharpness_DIN45692_from_loudness in MATLAB",
          "status": "available",
          "since": "0.6.0",
          "via": "sqat",
          "validation": "self-tests",
          "validation_details": [
            "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."
          ]
        },
        {
          "project": "psychobox",
          "reference": "din-45692-2009",
          "functions": [
            "Sharpnes_DIN.sharpnessCalculation"
          ],
          "status": "available",
          "via": "mosqito",
          "validation": "not-stated",
          "note": "Calls `sharpness_din_st` of MoSQITo 1.2.1 with the DIN weighting."
        },
        {
          "project": "soundscapy",
          "reference": "din-45692-2009",
          "functions": [
            "Binaural.mosqito_metric",
            "process_all_metrics"
          ],
          "status": "available",
          "via": "mosqito",
          "validation": "not-stated",
          "note": "Calls `sharpness_din_from_loudness`, `sharpness_din_perseg` or `sharpness_din_tv`; the weighting can be chosen."
        }
      ]
    },
    {
      "id": "roughness-daniel-weber",
      "family": "roughness",
      "name": "Roughness (Daniel & Weber)",
      "title": "Roughness, Daniel & Weber model",
      "aka": [
        "Daniel and Weber roughness",
        "Daniel & Weber 1997",
        "Aures roughness",
        "asper"
      ],
      "unit": "asper",
      "summary": "Roughness from the model of Daniel & Weber (1997), an optimised version of Aures's (1985) model. It is not standardised, and the paper leaves details open (filter bank, calibration, framing), so implementations can give different values for the same signal.",
      "notes": "SQAT rewrote its implementation in September 2026 (PR #65, released in v2.0). It builds on Alejandro Osses's code and was corrected against revised code that Dik Hermes provided in 2025, which changes results compared with SQAT v1.3 and earlier.",
      "references": [
        "aures-1985-roughness",
        "daniel-weber-1997"
      ],
      "current": [
        "daniel-weber-1997"
      ],
      "conventions": [
        "**Frames.** The model works on 200 ms frames. Implementations differ in the hop between frames and in whether the last complete frame is reported, which changes time series and their percentiles.",
        "**Code lineage.** SQAT's code (after Dik Hermes) and MoSQITo's differ in details, and ports follow one or the other; PsychoacousticMetrics.jl, which follows MoSQITo, says the two place the weighting g(z_i) differently.",
        "**Version.** SQAT rewrote its roughness in v2.0 (September 2026), so SQAT v1.3 and earlier, v2.0 and code ported from either give different values."
      ],
      "edition_notes": {
        "aures-1985-roughness": "Earlier model that Daniel & Weber optimised.",
        "daniel-weber-1997": "Reference model."
      },
      "see_also": [
        "roughness-ecma-418-2"
      ],
      "url": "https://zhenxianli.github.io/LISQM/metrics/roughness-daniel-weber.html",
      "coverage": {
        "Python": "current",
        "MATLAB/Octave": "current",
        "C/C++": "new",
        "Rust": "",
        "Julia": "new",
        "Other": "new"
      },
      "implementations": [
        {
          "project": "sqat",
          "reference": "daniel-weber-1997",
          "functions": [
            "Roughness_Daniel1997",
            "Roughness_Daniel1997_from_wavfile"
          ],
          "status": "available",
          "since": "v1.0",
          "validation": "standard-data",
          "derived_from": [
            "aarae"
          ],
          "validation_details": [
            "Checked against amplitude- and frequency-modulation dependences from the literature."
          ],
          "note": "The v1.x code is AARAE's `roughnessDW.m` (Dik Hermes's code), adapted and verified for SQAT in 2023. v2.0 rewrites it (PR #65, 2026-09-08) with corrections from revised code that Dik Hermes sent to the SQAT team in 2025: 63 of 119 validation values go up and 56 down (largest change 0.155 asper)."
        },
        {
          "project": "mosqito",
          "reference": "daniel-weber-1997",
          "functions": [
            "roughness_dw",
            "roughness_dw_freq"
          ],
          "status": "available",
          "since": "1.0.0",
          "validation": "standard-data",
          "validation_scope": "outcome not stated",
          "validation_details": [
            "The documentation marks it as validated against reference data."
          ]
        },
        {
          "project": "aarae",
          "reference": "daniel-weber-1997",
          "functions": [
            "RoughnessDW"
          ],
          "status": "available",
          "validation": "not-stated",
          "derived_from": [
            "psysound3"
          ],
          "derived_by_author": true,
          "note": "Ported from PsySound3's `@RoughnessDW` by Ella Manor and Densil Cabrera (2015)."
        },
        {
          "project": "ita-toolbox",
          "reference": "daniel-weber-1997",
          "functions": [
            "ita_roughness_daniel"
          ],
          "status": "available",
          "validation": "standard-data",
          "validation_scope": "a code comment only",
          "validation_details": [
            "A code comment says that after major bug fixes the values \"more or less match those of the paper by Daniel\"; no test or comparison script is included."
          ],
          "note": "Uses sub-functions written by Martin Klemenz in 2000 (`external_packages/roughness_daniel`)."
        },
        {
          "project": "metasona",
          "reference": "daniel-weber-1997",
          "functions": [
            "roughness_daniel_weber"
          ],
          "status": "available",
          "since": "0.1.0",
          "validation": "cross-implementation",
          "derived_from": [
            "sqat",
            "mosqito"
          ],
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "The project says that detailed validation and reference comparisons are kept outside the repository; the results are not published.",
            "The API documentation calls the function experimental and says normative validation remains open."
          ],
          "note": "Follows SQAT revision `e6228b78`, which includes SQAT's September 2026 rewrite but not its later fix to the Terhardt filter bank (PR #77, in SQAT v2.0).",
          "comparison_relations": {
            "sqat": "source"
          }
        },
        {
          "project": "mosqito-net",
          "reference": "daniel-weber-1997",
          "functions": [
            "Sq.RoughnessDw",
            "Sq.RoughnessDwFreq"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "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); MoSQITo's unit tests are ported too."
          ],
          "derived_from": [
            "mosqito"
          ],
          "comparison_relations": {
            "mosqito": "source"
          }
        },
        {
          "project": "psychoacousticmetrics-jl",
          "reference": "daniel-weber-1997",
          "functions": [
            "roughness_dw"
          ],
          "status": "available",
          "since": "0.2.0",
          "validation": "standard-data",
          "compared_with": [
            "mosqito"
          ],
          "derived_from": [
            "mosqito"
          ],
          "validation_details": [
            "Tested against the Zwicker & Fastl reference curves on MoSQITo's validation grid (7 carrier × 11 modulation frequencies) within ±0.1 asper, and cross-checked against MoSQITo's `roughness_dw` on identical signals.",
            "Five points at a 2 kHz carrier miss the ±0.1 asper gate. MoSQITo misses them by the same amount (and overshoots Daniel & Weber's own curve there by 15–31 %), so these five are checked for agreement with MoSQITo to 5e-3 asper instead.",
            "Against the Daniel & Weber curves themselves, 63 of the 77 grid points are within 30 % of the reference (reported, not gated)."
          ],
          "comparison_relations": {
            "mosqito": "source"
          }
        },
        {
          "project": "soundpalette",
          "reference": "daniel-weber-1997",
          "functions": [
            "sp::compute_psycho"
          ],
          "status": "available",
          "since": "v0.5.0",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "Compared with MoSQITo 1.2.1 with a wider tolerance (±15 %); the README notes that published Daniel & Weber implementations differ by about 10–20 %."
          ]
        },
        {
          "project": "pysqat",
          "reference": "daniel-weber-1997",
          "functions": [
            "Roughness_Daniel1997"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with SQAT v1.3, run in MATLAB, by `validation/FINAL_VAL.py`; the generated reports are not committed."
          ],
          "note": "Follows SQAT v1.3, before SQAT's September 2026 rewrite.",
          "derived_from": [
            "sqat"
          ],
          "comparison_relations": {
            "sqat": "source"
          }
        },
        {
          "project": "psysound3",
          "reference": "daniel-weber-1997",
          "functions": [
            "@RoughnessDW"
          ],
          "status": "available",
          "validation": "not-stated",
          "note": "Adapted for PsySound3 by Matt Flax (2006), with changes by Farhan Rizwi (2007). AARAE's `RoughnessDW.m` is a port of this analyser."
        }
      ],
      "also_through": [
        {
          "project": "rota-order",
          "reference": "daniel-weber-1997",
          "functions": [
            "rota.bridges.mosqito.roughness"
          ],
          "scope": "through MoSQITo's roughness_dw",
          "status": "available",
          "since": "0.6.0",
          "via": "mosqito",
          "validation": "self-tests",
          "validation_details": [
            "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."
          ]
        },
        {
          "project": "rota-order",
          "reference": "daniel-weber-1997",
          "functions": [
            "rota.bridges.sqat.roughness"
          ],
          "scope": "through SQAT v2.0's Roughness_Daniel1997 in MATLAB",
          "status": "available",
          "since": "0.6.0",
          "via": "sqat",
          "validation": "self-tests",
          "validation_details": [
            "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."
          ]
        },
        {
          "project": "psychobox",
          "reference": "daniel-weber-1997",
          "functions": [
            "Roughness.roughnessDW"
          ],
          "status": "available",
          "via": "mosqito",
          "validation": "not-stated",
          "note": "Calls `roughness_dw` of MoSQITo 1.2.1."
        },
        {
          "project": "soundscapy",
          "reference": "daniel-weber-1997",
          "functions": [
            "Binaural.mosqito_metric",
            "process_all_metrics"
          ],
          "status": "available",
          "via": "mosqito",
          "validation": "not-stated",
          "note": "Calls `roughness_dw`."
        }
      ]
    },
    {
      "id": "roughness-ecma-418-2",
      "family": "roughness",
      "name": "Sottek Hearing Model roughness",
      "title": "Roughness from the Sottek Hearing Model (ECMA-418-2)",
      "aka": [
        "ECMA-418-2 roughness",
        "asper_HMS",
        "Sottek roughness",
        "SHM roughness"
      ],
      "unit": "asper_HMS",
      "summary": "Roughness from the Sottek Hearing Model, Clause 7 of ECMA-418-2. The 2nd edition (2022) added an optional entropy weighting for cases where rotational speed is measured; the 3rd edition (2024) adapted zero-padding and segmentation, and its refinements were mainly to roughness.",
      "references": [
        "ecma-418-2-ed1",
        "ecma-418-2-ed2",
        "ecma-418-2-ed3",
        "ecma-418-2-ed4"
      ],
      "current": [
        "ecma-418-2-ed4"
      ],
      "conventions": [
        "**Edition.** Compare implementations of the same edition: MoSQITo, Mosqito.NET and tools that call MoSQITo follow the 2nd edition, the others the 3rd or 4th.",
        "**Overall value.** The single value is the 90th percentile of the time-dependent roughness after the first 320 ms. NumPy's percentile (sottek-hearing-model) and MATLAB's `prctile` (RefMap, SQAT) interpolate differently, so single values can differ slightly.",
        "**Calibration and time grid.** SQAT uses a slightly adjusted calibration factor and a time grid that ends at the signal duration; MetaSona uses the standard's nominal factor (0.0180685) and its 20 ms grid.",
        "**Binaural.** Two channels can be combined into one binaural value; per-channel and combined values differ."
      ],
      "edition_notes": {
        "ecma-418-2-ed1": "Clause 7 roughness.",
        "ecma-418-2-ed2": "Refined calculation; optional entropy-weighted roughness.",
        "ecma-418-2-ed3": "Zero-padding and segmentation adapted; refinements mainly to roughness.",
        "ecma-418-2-ed4": "Hearing-model and conformance updates (48 kHz sampling)."
      },
      "see_also": [
        "roughness-daniel-weber",
        "loudness-ecma-418-2"
      ],
      "url": "https://zhenxianli.github.io/LISQM/metrics/roughness-ecma-418-2.html",
      "coverage": {
        "Python": "current",
        "MATLAB/Octave": "current",
        "C/C++": "new",
        "Rust": "",
        "Julia": "",
        "Other": "partial"
      },
      "implementations": [
        {
          "project": "sqat",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "Roughness_ECMA418_2"
          ],
          "status": "available",
          "since": "v2.0",
          "validation": "cross-implementation",
          "derived_from": [
            "refmap-psychoacoustics"
          ],
          "derived_by_author": true,
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Checked for the 4th edition for the dependence of the roughness of AM tones on modulation frequency, and against reference results from HEAD acoustics ArtemiS SUITE 17.1 (named in the source of SQAT's validation page) for a binaural recording of a train station."
          ],
          "note": "Amended to the 4th edition in November 2025."
        },
        {
          "project": "sqat",
          "reference": "ecma-418-2-ed3",
          "functions": [
            "Roughness_ECMA418_2"
          ],
          "scope": "with binaural combination",
          "status": "available",
          "since": "v1.3",
          "validation": "cross-implementation",
          "derived_from": [
            "refmap-psychoacoustics"
          ],
          "derived_by_author": true,
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Checked for the dependence of the roughness of AM tones on modulation frequency, and against reference results from HEAD acoustics ArtemiS SUITE 15.7 (named in the source of SQAT's validation page) for a binaural recording of a train station."
          ],
          "note": "In v1.3; v2.0 follows the 4th edition."
        },
        {
          "project": "mosqito",
          "reference": "ecma-418-2-ed2",
          "functions": [
            "roughness_ecma"
          ],
          "status": "available",
          "since": "1.2.0",
          "validation": "standard-data",
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "A unit test checks the standard's reference signal (1 kHz tone, 100 % amplitude-modulated at 70 Hz, 60 dB), which should give 1 asper, within ±0.1 asper.",
            "A validation script compares the specific roughness of amplitude-modulated tones (carriers from 125 Hz to 4 kHz, 65 dB) with values computed in HEAD acoustics ArtemiS SUITE, within ±10 %."
          ],
          "note": "The documentation still lists it as under development. An open pull request (#95) fixes the low-pass filter range, which caused discrepancies with SQAT for time-varying signals."
        },
        {
          "project": "sottek-hearing-model",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "shm_roughness_ecma"
          ],
          "scope": "with combined binaural output",
          "status": "available",
          "since": "0.1.9",
          "validation": "standard-data",
          "validation_scope": "reference signal and one recording",
          "derived_by_author": true,
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Unit tests check the standard's reference signal, which should give 1 asper_HMS, at 48 and 44.1 kHz.",
            "RefMap's verification against ArtemiS v17.1, as for loudness."
          ],
          "derived_from": [
            "refmap-psychoacoustics"
          ]
        },
        {
          "project": "refmap-psychoacoustics",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "acousticSHMRoughness"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Verified against HEAD acoustics ArtemiS v17.1 with the same three signals as loudness."
          ]
        },
        {
          "project": "metasona",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "roughness_ecma"
          ],
          "scope": "mono or stereo; optional entropy weighting not applied",
          "status": "available",
          "since": "0.2.0",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "The project says that detailed validation and reference comparisons are kept outside the repository; the results are not published."
          ],
          "note": "Uses the standard's 20 ms grid and nominal calibration factor, where SQAT uses a slightly adjusted calibration.",
          "derived_from": [
            "sqat"
          ],
          "comparison_relations": {
            "sqat": "source"
          }
        },
        {
          "project": "ecma418-torch",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "roughness"
          ],
          "scope": "with binaural combination; without the optional entropy weighting of Section 7.1.6",
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sottek-hearing-model",
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "The 1 kHz tone amplitude-modulated at 70 Hz (60 dB SPL) gives 0.9999987 asper for 10 s (the test allows 1e-4 around 1), and the average specific roughness in band 17 is 0.37348, against 0.374 from ArtemiS v17 as quoted in the tests of sottek-hearing-model.",
            "Against sottek-hearing-model run as an oracle on three signals (the calibration tone, noise and a mixture of modulated tones and noise), the time-dependent values differ by at most 2e-5 asper and the single values by at most 2e-5; the README traces the residual to the rounded filter coefficients.",
            "The tests also check that two identical channels give the mono result and that input at 44.1 kHz gives the 48 kHz result within 0.2 %."
          ]
        },
        {
          "project": "phonometry",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "roughness_ecma"
          ],
          "scope": "mono only; no entropy weighting",
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "validation_scope": "calibration signal only",
          "validation_details": [
            "Checked at the calibration signal only."
          ]
        },
        {
          "project": "mosqito-net",
          "reference": "ecma-418-2-ed2",
          "functions": [
            "Sq.RoughnessEcma"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "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); MoSQITo's unit tests are ported too."
          ],
          "derived_from": [
            "mosqito"
          ],
          "comparison_relations": {
            "mosqito": "source"
          }
        }
      ],
      "also_through": [
        {
          "project": "rota-order",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "rota.bridges.sottek_hearing_model.roughness"
          ],
          "scope": "through sottek-hearing-model's shm_roughness_ecma",
          "status": "available",
          "since": "0.6.0",
          "via": "sottek-hearing-model",
          "validation": "self-tests",
          "validation_details": [
            "Tests, which run only where sottek-hearing-model is installed (the project's continuous integration does not install it), check that the wrapper returns what a direct call of the package gives."
          ]
        },
        {
          "project": "pysqat",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "Roughness_ECMA418_2"
          ],
          "status": "available",
          "via": "sottek-hearing-model",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared by `validation/FINAL_VAL.py` with the bundled SQAT v1.3 MATLAB code, which follows ECMA-418-2:2024 (3rd edition), so the comparison crosses editions."
          ],
          "comparison_relations": {
            "sqat": "shared:refmap-psychoacoustics"
          }
        },
        {
          "project": "psychobox",
          "reference": "ecma-418-2-ed2",
          "functions": [
            "Roughness.roughnessECMA"
          ],
          "status": "available",
          "via": "mosqito",
          "validation": "not-stated",
          "note": "Calls `roughness_ecma` of MoSQITo 1.2.1, whose bibliography cites ECMA-418-2:2022."
        }
      ]
    },
    {
      "id": "roughness-din-38455",
      "family": "roughness",
      "name": "Roughness (DIN 38455)",
      "title": "Roughness, DIN 38455",
      "aka": [
        "DIN 38455",
        "Rauigkeit",
        "German roughness standard"
      ],
      "unit": "asper",
      "summary": "DIN 38455:2024 is the first German standard for calculating roughness. Its text is not freely available, and the model it specifies could not be confirmed from public sources; a hearing-model roughness was proposed for DIN standardisation by Sottek & Becker (2019).",
      "references": [
        "din-38455-2024"
      ],
      "current": [
        "din-38455-2024"
      ],
      "edition_notes": {
        "din-38455-2024": "First edition."
      },
      "see_also": [
        "roughness-ecma-418-2",
        "roughness-daniel-weber"
      ],
      "url": "https://zhenxianli.github.io/LISQM/metrics/roughness-din-38455.html",
      "coverage": {
        "Python": "",
        "MATLAB/Octave": "",
        "C/C++": "",
        "Rust": "",
        "Julia": "",
        "Other": ""
      },
      "implementations": []
    },
    {
      "id": "fluctuation-strength-osses",
      "family": "fluctuation-strength",
      "name": "Fluctuation strength (Osses et al.)",
      "title": "Fluctuation strength, Osses et al. model and Fastl & Zwicker formula",
      "aka": [
        "fluctuation strength",
        "vacil",
        "Osses 2016",
        "Fastl and Zwicker fluctuation strength"
      ],
      "unit": "vacil",
      "summary": "Fluctuation strength describes slow modulation around 4 Hz. Osses, García & Kohlrausch (2016) proposed a signal-based model; Fastl & Zwicker give a closed-form expression for modulated tones and noises. Neither is standardised. ECMA-418-2:2025 added a hearing-model method, listed on its own page.",
      "references": [
        "fastl-zwicker-2007",
        "osses-2016"
      ],
      "current": [
        "osses-2016"
      ],
      "conventions": [
        "**Sample rate.** The model's envelope filters exist for 44.1 and 48 kHz: SQAT resamples other rates, PsychoacousticMetrics.jl rejects them.",
        "**Steady sounds.** The model is meant for modulated sounds; a steady tone does not give exactly zero (phonometry reports about 0.09 vacil for a 1 kHz tone)."
      ],
      "edition_notes": {
        "fastl-zwicker-2007": "Closed-form expression for amplitude- and frequency-modulated sounds.",
        "osses-2016": "Signal-based model."
      },
      "see_also": [
        "fluctuation-strength-ecma-418-2"
      ],
      "url": "https://zhenxianli.github.io/LISQM/metrics/fluctuation-strength-osses.html",
      "coverage": {
        "Python": "current",
        "MATLAB/Octave": "current",
        "C/C++": "",
        "Rust": "",
        "Julia": "new",
        "Other": ""
      },
      "implementations": [
        {
          "project": "sqat",
          "reference": "osses-2016",
          "functions": [
            "FluctuationStrength_Osses2016",
            "FluctuationStrength_Osses2016_from_wavfile"
          ],
          "status": "available",
          "since": "v1.0",
          "validation": "standard-data",
          "derived_from": [
            "fluctuation-strength-tue"
          ],
          "derived_by_author": true,
          "validation_details": [
            "Checked against amplitude- and frequency-modulation dependences from the literature."
          ],
          "note": "Alejandro Osses's `FluctuationStrength_TUe.m` (TU/e, 2014–2016), taken into SQAT in 2020 and modified there by Osses since 2023."
        },
        {
          "project": "phonometry",
          "reference": "osses-2016",
          "functions": [
            "fluctuation_strength"
          ],
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with the literature values in Table 1 of Osses et al. (2016): for amplitude-modulated 70 dB tones the Pearson correlation is about 0.98, within a factor of about 2.1 at every point. SQAT's `FluctuationStrength_Osses2016` was consulted as a numeric reference for the shape of the sweep.",
            "Validated for amplitude modulation only; a steady 1 kHz tone reads about 0.09 vacil."
          ]
        },
        {
          "project": "psychoacousticmetrics-jl",
          "reference": "osses-2016",
          "functions": [
            "fluctuation_strength_osses"
          ],
          "status": "available",
          "since": "0.3.0",
          "validation": "reference-code",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Cross-checked against SQAT's `FluctuationStrength_Osses2016`, run under Octave, on identical signals: 26 cases, including all 18 points of Fastl & Zwicker's AM/FM reference grid (Osses 2018 thesis, Table B.1), each reproduced to a relative tolerance of 1e-6 (measured 3e-9).",
            "The grid stimuli are synthesised following the Osses et al. (2016) validation files that SQAT's own validation reads; the tests also check that each synthetic stimulus gives the value SQAT gives on the real file (tones to 5e-3, noise to 25 % across random draws).",
            "Against the published curves, 11 of the 18 points are within 30 %, and exactly those 11 are gated. The other seven are misses of the reference model itself (FM tones with a modulation frequency above 4 Hz overestimated three- to fourfold, thesis §B.4.1; the shoulder and tail points of AM tones and noise), which SQAT's own validation figures also show."
          ],
          "conventions": [
            "Needs audio at 44.1 or 48 kHz (an error otherwise); SQAT resamples other rates itself."
          ]
        },
        {
          "project": "phonometry",
          "reference": "fastl-zwicker-2007",
          "functions": [
            "fluctuation_strength_am_noise"
          ],
          "scope": "closed-form expression for amplitude-modulated noise",
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "validation_details": [
            "A conformance row checks Eq. (10.2) of Fastl & Zwicker for amplitude-modulated broadband noise."
          ]
        },
        {
          "project": "pysqat",
          "reference": "osses-2016",
          "functions": [
            "FluctuationStrength_Osses2016"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with SQAT v1.3, run in MATLAB, by `validation/FINAL_VAL.py`; the generated reports are not committed."
          ],
          "derived_from": [
            "sqat"
          ],
          "comparison_relations": {
            "sqat": "source"
          }
        },
        {
          "project": "fluctuation-strength-tue",
          "reference": "osses-2016",
          "functions": [
            "FluctuationStrength_TUe"
          ],
          "status": "available",
          "since": "1.0",
          "validation": "standard-data",
          "validation_details": [
            "`demos/demo_osses2016a.m` reproduces the figures of the paper with the included stimuli (AM and FM tones, AM noise and excerpts of real sounds)."
          ]
        },
        {
          "project": "psychoacoustic-parameters-measurer",
          "reference": "fastl-zwicker-2007",
          "functions": [
            "acousticFluctuation",
            "fmoddetection"
          ],
          "scope": "Zwicker & Fastl formula",
          "status": "available",
          "validation": "not-stated",
          "note": "The header cites Zwicker & Fastl, \"Psychoacoustics: Facts and Models\", without naming an edition."
        }
      ]
    },
    {
      "id": "fluctuation-strength-ecma-418-2",
      "family": "fluctuation-strength",
      "name": "Sottek Hearing Model fluctuation strength",
      "title": "Fluctuation strength from the Sottek Hearing Model (ECMA-418-2)",
      "aka": [
        "ECMA-418-2 fluctuation strength",
        "vacil_HMS",
        "Sottek fluctuation strength"
      ],
      "unit": "vacil_HMS",
      "summary": "Fluctuation strength from the Sottek Hearing Model, new in the 4th edition of ECMA-418-2 (June 2025, Clause 9). It uses high-resolution spectral analysis for modulation rates of about 0.25 to 20 Hz.",
      "references": [
        "ecma-418-2-ed4"
      ],
      "current": [
        "ecma-418-2-ed4"
      ],
      "conventions": [
        "**Overall value.** The single value is a 90th percentile of the time-dependent values after the filters have settled. NumPy (sottek-hearing-model) and MATLAB's `prctile` interpolate differently, by at most 0.0005 vacil_HMS on sottek-hearing-model's test signals.",
        "**Interpretation.** Implementers report misprints and open questions in Clause 9 of the 2025 edition (phonometry's errata, sottek-hearing-model's documented departures), so implementations can differ until they are resolved."
      ],
      "edition_notes": {
        "ecma-418-2-ed4": "New Clause 9."
      },
      "see_also": [
        "fluctuation-strength-osses",
        "loudness-ecma-418-2"
      ],
      "url": "https://zhenxianli.github.io/LISQM/metrics/fluctuation-strength-ecma-418-2.html",
      "coverage": {
        "Python": "new",
        "MATLAB/Octave": "partial",
        "C/C++": "",
        "Rust": "",
        "Julia": "",
        "Other": ""
      },
      "implementations": [
        {
          "project": "sqat",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "FluctuationStrength_ECMA418_2"
          ],
          "status": "proposed",
          "link": "https://github.com/ggrecow/SQAT/pull/78",
          "validation": "not-stated",
          "note": "Open pull request since 2026-09-17."
        },
        {
          "project": "sottek-hearing-model",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "shm_fluctuation_ecma"
          ],
          "scope": "needs at least 1.37 s of signal; binaural option",
          "status": "unreleased",
          "validation": "cross-implementation",
          "derived_by_author": true,
          "compared_with": [
            "refmap-psychoacoustics",
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "A draft report (18 September 2026) compares it with `acousticSHMFluctuation.m`, the MATLAB code it was translated from: equal to floating-point precision on the synthetic signals and on one channel of each recording, with a small difference in a short time window on the other channel.",
            "Against HEAD acoustics ArtemiS SUITE v17: 0.994 against 1.003 vacil_HMS for the calibration signal (the standard's target is 1.0), −8 % to +12 % for the overall values of three binaural recordings, and correlations of 0.91 to 0.998 for the time-dependent values."
          ],
          "note": "Merged on 2026-09-18. Five departures from the printed text are documented (four equations and one interpretation of Section 9.1.8).",
          "derived_from": [
            "refmap-psychoacoustics"
          ],
          "comparison_relations": {
            "refmap-psychoacoustics": "source"
          }
        },
        {
          "project": "ecma418-torch",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "fluctuation_strength"
          ],
          "scope": "with binaural combination",
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sottek-hearing-model",
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "conventions": [
            "By default it follows the printed text in three places where sottek-hearing-model decides otherwise: the step limit of Formula (152) (2e-4 Hz, against 0.2), no fundamental required for an assumed order in Section 9.1.8, and machine epsilon for ε0 (against 1e-12). The options `newton_cap` and `require_fundamental` give sottek-hearing-model's choices.",
            "Formula (127) is computed with π instead of the printed 2π in the phase term, and Formula (144) without the printed \"− 1\", which the code says would shift every rate down one bin."
          ],
          "validation_details": [
            "The 1 kHz tone amplitude-modulated at 4 Hz (60 dB SPL) gives 0.99579 vacil for 10 s (the test allows 1e-2 around 1), and the average specific fluctuation strength in band 17 is 0.38876, against 0.395 from ArtemiS v17 as quoted in the tests of sottek-hearing-model.",
            "Against sottek-hearing-model run as an oracle on two signals: with that package's three choices, the time-dependent values differ by at most 6.3e-5 vacil and the single values by at most 6.3e-5; with the defaults, which follow the printed text, the single values differ by 0.2 % and 0.5 %."
          ]
        },
        {
          "project": "phonometry",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "fluctuation_strength_ecma"
          ],
          "scope": "mono only",
          "status": "available",
          "since": "3.3.0",
          "validation": "standard-data",
          "validation_scope": "calibration signal only",
          "validation_details": [
            "Checked at the calibration signal only (0.993 vacil_HMS)."
          ],
          "note": "Misprints found in Clause 9 are listed in the project's errata."
        }
      ]
    },
    {
      "id": "tonality-aures",
      "family": "tonality",
      "name": "Tonality (Aures)",
      "title": "Tonality, Aures/Terhardt model",
      "aka": [
        "Aures tonality",
        "Terhardt tonality",
        "tonality units",
        "t.u.",
        "sensory euphony"
      ],
      "unit": "t.u.",
      "summary": "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.",
      "notes": "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.",
      "references": [
        "terhardt-1982",
        "aures-1985-euphony"
      ],
      "current": [
        "aures-1985-euphony"
      ],
      "edition_notes": {
        "terhardt-1982": "Extraction of tonal components used by the model.",
        "aures-1985-euphony": "Tonality model."
      },
      "see_also": [
        "tonality-ecma-418-2"
      ],
      "url": "https://zhenxianli.github.io/LISQM/metrics/tonality-aures.html",
      "coverage": {
        "Python": "current",
        "MATLAB/Octave": "current",
        "C/C++": "new",
        "Rust": "",
        "Julia": "",
        "Other": ""
      },
      "implementations": [
        {
          "project": "sqat",
          "reference": "aures-1985-euphony",
          "functions": [
            "Tonality_Aures1985",
            "Tonality_Aures1985_from_wavfile"
          ],
          "status": "available",
          "since": "v1.0",
          "validation": "standard-data",
          "validation_details": [
            "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."
          ],
          "note": "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."
        },
        {
          "project": "mosqito",
          "reference": "aures-1985-euphony",
          "status": "proposed",
          "link": "https://github.com/Eomys/MoSQITo/pull/97",
          "validation": "not-stated",
          "note": "Pull request from April 2026 following the improved Aures metric of Estreder et al. (2023); no maintainer reply."
        },
        {
          "project": "metasona",
          "reference": "aures-1985-euphony",
          "functions": [
            "tonality_aures"
          ],
          "status": "available",
          "since": "0.1.0",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "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."
          ],
          "note": "Follows SQAT's September 2026 revision (250 ms Hann windows, 125 ms hop).",
          "derived_from": [
            "sqat"
          ],
          "comparison_relations": {
            "sqat": "source"
          }
        },
        {
          "project": "pysqat",
          "reference": "aures-1985-euphony",
          "functions": [
            "Tonality_Aures1985"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with SQAT v1.3, run in MATLAB, by `validation/FINAL_VAL.py`; the generated reports are not committed."
          ],
          "note": "A June 2026 commit corrected its calibration; it predates SQAT's September 2026 fixes.",
          "derived_from": [
            "sqat"
          ],
          "comparison_relations": {
            "sqat": "source"
          }
        }
      ]
    },
    {
      "id": "tonality-ecma-418-2",
      "family": "tonality",
      "name": "Sottek Hearing Model tonality",
      "title": "Tonality from the Sottek Hearing Model (ECMA-418-2)",
      "aka": [
        "ECMA-418-2 tonality",
        "psychoacoustic tonality",
        "tu_HMS",
        "Sottek tonality",
        "SHM tonality"
      ],
      "unit": "tu_HMS",
      "summary": "Psychoacoustic tonality from the Sottek Hearing Model, Clause 6 of ECMA-418-2, with specific tonality and tonal frequency over time. The method came from ECMA-74 (17th edition, 2019) when ECMA-418-2 was first published in 2020.",
      "references": [
        "ecma-74-ed17",
        "ecma-418-2-ed1",
        "ecma-418-2-ed2",
        "ecma-418-2-ed3",
        "ecma-418-2-ed4"
      ],
      "current": [
        "ecma-418-2-ed4"
      ],
      "conventions": [
        "**Edition and start.** Compare implementations of the same edition; overall values leave out the first 304 ms, where the filters settle.",
        "**Tonal annoyance weighting.** RefMap and sottek-hearing-model offer an optional weighting after Sottek & Becker (2019), which is not part of ECMA-418-2; leave it off when comparing with other implementations."
      ],
      "edition_notes": {
        "ecma-74-ed17": "Hearing model and tonality before ECMA-418-2 existed.",
        "ecma-418-2-ed1": "Clause 6 tonality.",
        "ecma-418-2-ed2": "Refined calculation.",
        "ecma-418-2-ed3": "Diffuse-field outer and middle ear filter added (affects all metrics); refinements mainly to roughness.",
        "ecma-418-2-ed4": "Hearing-model and conformance updates (48 kHz sampling)."
      },
      "see_also": [
        "tonality-aures",
        "tone-to-noise-prominence-ratio",
        "loudness-ecma-418-2"
      ],
      "url": "https://zhenxianli.github.io/LISQM/metrics/tonality-ecma-418-2.html",
      "coverage": {
        "Python": "current",
        "MATLAB/Octave": "current",
        "C/C++": "new",
        "Rust": "",
        "Julia": "",
        "Other": ""
      },
      "implementations": [
        {
          "project": "sqat",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "Tonality_ECMA418_2"
          ],
          "status": "available",
          "since": "v2.0",
          "validation": "cross-implementation",
          "derived_from": [
            "refmap-psychoacoustics"
          ],
          "derived_by_author": true,
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Checked for the 4th edition against reference results from HEAD acoustics ArtemiS SUITE 17.1 (named in the source of SQAT's validation page) for a binaural recording of a train station.",
            "A verification against Annex B.2 (PR #79) was merged and reverted on 2026-09-21 because the Annex B values of the 2025 edition appear to be out of date."
          ]
        },
        {
          "project": "sqat",
          "reference": "ecma-418-2-ed3",
          "functions": [
            "Tonality_ECMA418_2"
          ],
          "status": "available",
          "since": "v1.3",
          "validation": "cross-implementation",
          "derived_from": [
            "refmap-psychoacoustics"
          ],
          "derived_by_author": true,
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Checked against reference results from HEAD acoustics ArtemiS SUITE 15.7 (named in the source of SQAT's validation page) for a binaural recording of a train station."
          ],
          "note": "In v1.3; v2.0 follows the 4th edition."
        },
        {
          "project": "sottek-hearing-model",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "shm_tonality_ecma"
          ],
          "status": "available",
          "since": "0.1.9",
          "validation": "standard-data",
          "validation_scope": "reference signal and one recording",
          "derived_by_author": true,
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Unit tests check the standard's reference signal, which should give 1 tu_HMS, at 48 and 44.1 kHz.",
            "RefMap's verification against ArtemiS v17.1, as for loudness."
          ],
          "note": "Optional experimental tonal-annoyance weighting (Sottek & Becker, 2019) since 0.1.14.",
          "derived_from": [
            "refmap-psychoacoustics"
          ]
        },
        {
          "project": "refmap-psychoacoustics",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "acousticSHMTonality"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Verified against HEAD acoustics ArtemiS v17.1 with the same three signals as loudness."
          ]
        },
        {
          "project": "metasona",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "tonality_ecma",
            "ecma_tonal_analysis"
          ],
          "scope": "mono or stereo",
          "status": "available",
          "since": "0.2.0",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "The project says that detailed validation and reference comparisons are kept outside the repository; the results are not published."
          ],
          "derived_from": [
            "sqat"
          ],
          "comparison_relations": {
            "sqat": "source"
          }
        },
        {
          "project": "phonometry",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "tonality_ecma"
          ],
          "scope": "mono only",
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "validation_scope": "calibration signal only",
          "validation_details": [
            "Checked at the calibration signal only."
          ]
        }
      ],
      "also_through": [
        {
          "project": "rota-order",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "rota.bridges.sottek_hearing_model.tonality"
          ],
          "scope": "through sottek-hearing-model's shm_tonality_ecma",
          "status": "available",
          "since": "0.6.0",
          "via": "sottek-hearing-model",
          "validation": "self-tests",
          "validation_details": [
            "Tests, which run only where sottek-hearing-model is installed (the project's continuous integration does not install it), check that the wrappers return what direct calls of the package give, that one speed bin reproduces the package's single values, and that the dominant tonal frequency of a tone in noise maps to its order."
          ]
        },
        {
          "project": "rota-order",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "rota.bridges.sqat.tonality"
          ],
          "scope": "through SQAT v2.0's Tonality_ECMA418_2 in MATLAB",
          "status": "available",
          "since": "0.6.0",
          "via": "sqat",
          "validation": "self-tests",
          "validation_details": [
            "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."
          ]
        },
        {
          "project": "pysqat",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "Tonality_ECMA418_2"
          ],
          "status": "available",
          "via": "sottek-hearing-model",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared by `validation/FINAL_VAL.py` with the bundled SQAT v1.3 MATLAB code, which follows ECMA-418-2:2024 (3rd edition), so the comparison crosses editions."
          ],
          "comparison_relations": {
            "sqat": "shared:refmap-psychoacoustics"
          }
        }
      ]
    },
    {
      "id": "tone-to-noise-prominence-ratio",
      "family": "tonality",
      "name": "Tone-to-noise ratio and prominence ratio",
      "title": "Tone-to-noise ratio and prominence ratio (ECMA-418-1)",
      "aka": [
        "TNR",
        "PR",
        "ECMA-418-1",
        "ECMA-74 Annex D",
        "prominent discrete tones",
        "ANSI S1.13 Annex"
      ],
      "unit": "dB",
      "summary": "Tone-to-noise ratio (TNR) and prominence ratio (PR) decide whether a discrete tone is prominent: TNR compares the tone with the noise in its critical band, PR compares the critical band with its neighbours. ECMA-418-1 took the method over from Annex D of ECMA-74 in 2020; its 3rd edition (2024) revised the TNR procedure.",
      "references": [
        "ecma-74-ed17",
        "ecma-418-1-ed1",
        "ecma-418-1-ed2",
        "ecma-418-1-ed3"
      ],
      "current": [
        "ecma-418-1-ed3"
      ],
      "edition_notes": {
        "ecma-74-ed17": "Annex D, before ECMA-418-1 existed.",
        "ecma-418-1-ed1": "Based on, and mostly identical to, ECMA-74 Annex D.",
        "ecma-418-1-ed2": "Maximum tone bandwidth for TNR set to 15 % of the critical band; corrections.",
        "ecma-418-1-ed3": "TNR procedure revised for repeatable results across FFT resolutions; terms rewritten."
      },
      "see_also": [
        "tonality-ecma-418-2",
        "tonal-audibility-iso-20065"
      ],
      "url": "https://zhenxianli.github.io/LISQM/metrics/tone-to-noise-prominence-ratio.html",
      "coverage": {
        "Python": "new",
        "MATLAB/Octave": "",
        "C/C++": "",
        "Rust": "",
        "Julia": "",
        "Other": "partial"
      },
      "implementations": [
        {
          "project": "mosqito",
          "reference": "ecma-74-ed17",
          "functions": [
            "tnr_ecma_st",
            "tnr_ecma_perseg",
            "tnr_ecma_freq",
            "pr_ecma_st",
            "pr_ecma_perseg",
            "pr_ecma_freq"
          ],
          "status": "available",
          "since": "1.0.2",
          "validation": "not-stated",
          "validation_details": [
            "The documentation marks it as available but not validated."
          ],
          "note": "Docstrings say \"ECMA 418-1\" without an edition; the helper code and the bibliography cite ECMA-74 Annex D (17th edition, 2019)."
        },
        {
          "project": "phonometry",
          "reference": "ecma-418-1-ed3",
          "functions": [
            "tone_to_noise_ratio",
            "prominence_ratio",
            "assess_tones"
          ],
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "validation_scope": "formula examples; no published TNR or PR value",
          "validation_details": [
            "Tests check worked examples printed in ECMA-418-1:2024: the critical band at 500 Hz and 1 kHz (Clause 10, Formula 2), its band edges at 1 kHz (Clause 12.2) and the proximity spacing at 150 and 850 Hz (Clause 11.6, Formula 14).",
            "TNR and PR of a 1 kHz tone in white noise are compared with the values expected from the standard's formulas (within 0.4 dB for TNR and 0.1 dB for PR); no TNR or PR value published in the standard is checked."
          ],
          "note": "The \"prominent\" flag applies the numeric criterion only."
        },
        {
          "project": "rota-order",
          "reference": "ecma-418-1-ed3",
          "functions": [
            "rota.tonal.tone_prominence",
            "rota.tonal.order_prominence",
            "rota.tonal.prominence_criterion"
          ],
          "scope": "tones in a power spectrum, and orders of a rotating machine along a run-up",
          "status": "available",
          "since": "0.5.0",
          "validation": "standard-data",
          "validation_scope": "formula examples; no published TNR or PR value",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "Tests check worked examples printed in ECMA-418-1:2024: the critical bandwidth at 500 Hz and 1 kHz (Clause 10), the band edges at 1 kHz (Clause 12.2) and the proximity spacing at 150 and 850 Hz (Clause 11.6). The criteria are checked at 100 Hz, 1 kHz and 5 kHz.",
            "TNR and PR of tones at 140 Hz, 1 kHz and 3 kHz in white noise are compared with the values that the standard's formulas give for the known tone and noise powers, within 0.5 dB; on spectra built line by line they agree to within 1e-9 dB for TNR and 0.03 dB for PR. No TNR or PR value published in the standard is checked.",
            "For an order in a synthetic run-up, `order_prominence` gives the TNR within 1 dB of the analytic value in every speed bin, with a mean error below 0.4 dB.",
            "A test compares the TNR of tones at 130 Hz to 4 kHz in flat noise with MoSQITo's `tnr_ecma_st` and requires agreement within 1.5 dB. MoSQITo follows ECMA-74:2019, so the comparison crosses editions. The test runs only where MoSQITo is installed, which the project's continuous integration does not do."
          ],
          "conventions": [
            "`order_prominence` analyses orders on the order-tracked (angle-domain) spectrum, so that an order stays one spectral line in every frame of a run-up. The docstring and a test show that a fixed time window long enough for the resolution the standard asks for at low frequency spreads a fast-sweeping order over the band and biases its TNR low, by about 19 dB in the test case.",
            "Where the text of the 3rd edition is inconsistent, the module notes how it is read: the secondary tone is added in Formulae (A.7) and (A.8), the tone spacing is |f_s − f_p|, 500 Hz takes arithmetic centring, the criteria cover 89.1 Hz to 11 200 Hz, and the misprints of Formulae (21) and (23) are resolved with their Annex B counterparts."
          ],
          "note": "The \"prominent\" flag applies the numeric criterion only; the aural check of audibility (Sections 11.8 and 12.8) is not assessed."
        },
        {
          "project": "mosqito-net",
          "reference": "ecma-74-ed17",
          "functions": [
            "Sq.TnrEcmaSt",
            "Sq.TnrEcmaFreq",
            "Sq.TnrEcmaPerSeg",
            "Sq.PrEcmaSt",
            "Sq.PrEcmaFreq",
            "Sq.PrEcmaPerSeg"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "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); MoSQITo's unit tests are ported too."
          ],
          "note": "The README cites ECMA-74 Annex D.",
          "derived_from": [
            "mosqito"
          ],
          "comparison_relations": {
            "mosqito": "source"
          }
        },
        {
          "project": "mosqito-fdp",
          "reference": "ecma-74-ed17",
          "functions": [
            "comp_tnr",
            "comp_pr"
          ],
          "scope": "Annex D",
          "status": "available",
          "validation": "self-tests",
          "validation_details": [
            "The README lists TNR/PR as available but not validated; the tests use synthetic tones in white noise."
          ],
          "derived_from": [
            "mosqito"
          ]
        }
      ]
    },
    {
      "id": "tonality-din-45681",
      "family": "tonality",
      "name": "Tonal components (DIN 45681)",
      "title": "Tonal components and tone adjustment (DIN 45681)",
      "aka": [
        "DIN 45681",
        "tone adjustment",
        "K_T",
        "Tonzuschlag"
      ],
      "unit": "dB",
      "summary": "German method that detects tonal components in noise from narrow-band spectra and derives a tone adjustment for the assessment of noise immissions. DIN 45681:2005, corrected by Berichtigung 2:2006-08 (which replaced Berichtigung 1:2005-08), is current.",
      "references": [
        "din-45681-2002-draft",
        "din-45681-2005"
      ],
      "current": [
        "din-45681-2005"
      ],
      "edition_notes": {
        "din-45681-2005": "Current; Berichtigung 2:2006-08 replaced Berichtigung 1:2005-08."
      },
      "see_also": [
        "tonal-audibility-iso-20065"
      ],
      "url": "https://zhenxianli.github.io/LISQM/metrics/tonality-din-45681.html",
      "coverage": {
        "Python": "",
        "MATLAB/Octave": "partial",
        "C/C++": "",
        "Rust": "",
        "Julia": "",
        "Other": ""
      },
      "implementations": [
        {
          "project": "ita-toolbox",
          "reference": "din-45681-2002-draft",
          "functions": [
            "ita_tonality"
          ],
          "scope": "maximum tonal audibility and its frequency",
          "status": "available",
          "validation": "not-stated",
          "note": "The header cites \"DIN 45681 (2002)\", the draft that preceded DIN 45681:2005. A code comment says that no A-weighting is applied."
        }
      ]
    },
    {
      "id": "tonal-audibility-iso-20065",
      "family": "tonality",
      "name": "Audibility of tones in noise (ISO/TS 20065)",
      "title": "Audibility of tones in noise (ISO/TS 20065)",
      "aka": [
        "ISO/TS 20065",
        "ISO/PAS 20065",
        "tonal audibility",
        "decisive audibility",
        "ΔL_ta"
      ],
      "unit": "dB",
      "summary": "Engineering method for the audibility of tones in noise, from critical-band analysis of narrow-band spectra. First published as ISO/PAS 20065:2016 and turned into ISO/TS 20065:2022, which notes that the method is not validated below 50 Hz.",
      "references": [
        "iso-pas-20065-2016",
        "iso-ts-20065-2022"
      ],
      "current": [
        "iso-ts-20065-2022"
      ],
      "edition_notes": {
        "iso-pas-20065-2016": "Publicly available specification; withdrawn in 2022.",
        "iso-ts-20065-2022": "Technical specification; adds that the method is not validated below 50 Hz."
      },
      "see_also": [
        "tonality-din-45681",
        "tonal-audibility-iso-1996-2"
      ],
      "url": "https://zhenxianli.github.io/LISQM/metrics/tonal-audibility-iso-20065.html",
      "coverage": {
        "Python": "partial",
        "MATLAB/Octave": "",
        "C/C++": "",
        "Rust": "",
        "Julia": "",
        "Other": ""
      },
      "implementations": [
        {
          "project": "phonometry",
          "reference": "iso-pas-20065-2016",
          "functions": [
            "tone_audibility",
            "analyze_spectrum",
            "audibility_from_levels",
            "mean_audibility",
            "audibility_uncertainty"
          ],
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "compared_with": [
            "DIN 45681 Annex J reference program"
          ],
          "validation_details": [
            "Reproduces the Annex E worked example.",
            "Parts are checked against DIN 45681:2005 and its Annex J reference program."
          ],
          "note": "Follows the 2016 PAS, not the 2022 TS. Does not apply the A-weighting required by clause 5.3.2. DIN 45681 itself is not implemented."
        }
      ]
    },
    {
      "id": "tonal-audibility-iso-1996-2",
      "family": "tonality",
      "name": "Tonal audibility (ISO 1996-2)",
      "title": "Tonal audibility in environmental noise (ISO 1996-2)",
      "aka": [
        "ISO 1996-2 Annex C",
        "ISO 1996-2 Annex J",
        "ISO 1996-2 Annex K",
        "tonal adjustment",
        "environmental noise tonality"
      ],
      "unit": "dB",
      "summary": "Objective tonal audibility and tone adjustment for environmental noise assessment. ISO 1996-2:2007 gave a method in Annex C; ISO 1996-2:2017 replaced it with an engineering method (Annex J) and a survey method (Annex K).",
      "references": [
        "iso-1996-2-2007",
        "iso-1996-2-2017"
      ],
      "current": [
        "iso-1996-2-2017"
      ],
      "edition_notes": {
        "iso-1996-2-2007": "Annex C tonal audibility.",
        "iso-1996-2-2017": "Annex J engineering method and Annex K survey method."
      },
      "see_also": [
        "tonal-audibility-iso-20065",
        "tonal-audibility-iec-61400-11"
      ],
      "url": "https://zhenxianli.github.io/LISQM/metrics/tonal-audibility-iso-1996-2.html",
      "coverage": {
        "Python": "new",
        "MATLAB/Octave": "",
        "C/C++": "",
        "Rust": "",
        "Julia": "",
        "Other": ""
      },
      "implementations": [
        {
          "project": "mosqito",
          "reference": "iso-1996-2-2017",
          "scope": "Annex K prominent-tone detection",
          "status": "proposed",
          "link": "https://github.com/Eomys/MoSQITo/pull/52",
          "validation": "not-stated",
          "note": "Pull request from May 2022; no maintainer reply."
        },
        {
          "project": "acoustic-toolbox",
          "reference": "iso-1996-2-2007",
          "functions": [
            "Tonality",
            "tonal_audibility",
            "tonal_adjustment"
          ],
          "scope": "tonal audibility and tonal adjustment",
          "status": "available",
          "validation": "self-tests",
          "validation_details": [
            "As in python-acoustics, the test of the examples in the standard is commented out."
          ],
          "derived_from": [
            "python-acoustics"
          ],
          "note": "Module `acoustic_toolbox.standards.iso_1996_2_2007`, the same code lineage as python-acoustics."
        },
        {
          "project": "phonometry",
          "reference": "iso-1996-2-2017",
          "scope": "Annex K survey method and Table J.1; in the phonometry.environment namespace",
          "status": "available",
          "validation": "not-stated"
        },
        {
          "project": "phonometry",
          "reference": "iso-1996-2-2007",
          "scope": "Annex C; in the phonometry.environment namespace",
          "status": "available",
          "validation": "not-stated"
        },
        {
          "project": "python-acoustics",
          "reference": "iso-1996-2-2007",
          "functions": [
            "Tonality",
            "tonal_audibility",
            "tonal_adjustment"
          ],
          "scope": "tonal audibility and tonal adjustment",
          "status": "available",
          "validation": "self-tests",
          "validation_details": [
            "A test of the examples in the standard, using DELTA tone files, is commented out."
          ],
          "note": "Module `acoustics.standards.iso_1996_2_2007`. The `Tonality` docstring uses the title of Annex C (\"Objective method for assessing the audibility of tones in noise\"), though the code does not name the annex."
        }
      ]
    },
    {
      "id": "tonal-audibility-iec-61400-11",
      "family": "tonality",
      "name": "Tonal audibility of wind turbines (IEC 61400-11)",
      "title": "Tonal audibility of wind turbine noise (IEC 61400-11)",
      "aka": [
        "IEC 61400-11",
        "wind turbine tonality",
        "tonal audibility"
      ],
      "unit": "dB",
      "summary": "Tonality analysis in the acoustic noise measurement of wind turbines: tones are identified in narrow-band spectra and their tonal audibility is reported.",
      "references": [
        "iec-61400-11-2002",
        "iec-61400-11-2012"
      ],
      "current": [
        "iec-61400-11-2012"
      ],
      "edition_notes": {
        "iec-61400-11-2002": "Edition 2 (Amendment 1 in 2006); already has a tonal audibility procedure.",
        "iec-61400-11-2012": "Edition 3 with Amendment 1 (2018); tonal audibility in clause 9.5."
      },
      "see_also": [
        "tonal-audibility-iso-1996-2"
      ],
      "url": "https://zhenxianli.github.io/LISQM/metrics/tonal-audibility-iec-61400-11.html",
      "coverage": {
        "Python": "new",
        "MATLAB/Octave": "",
        "C/C++": "",
        "Rust": "",
        "Julia": "",
        "Other": ""
      },
      "implementations": [
        {
          "project": "phonometry",
          "reference": "iec-61400-11-2012",
          "functions": [
            "wind_turbine_tonality"
          ],
          "status": "available",
          "validation": "not-stated"
        }
      ]
    },
    {
      "id": "impulsiveness",
      "family": "impulsiveness",
      "name": "Impulse prominence",
      "title": "Prominence of impulsive sounds (ISO/PAS 1996-3, NT ACOU 112)",
      "aka": [
        "ISO/PAS 1996-3",
        "NT ACOU 112",
        "impulsiveness",
        "impulse adjustment",
        "impulsive sound prominence"
      ],
      "unit": "dB",
      "summary": "Objective prominence of impulsive sounds and the corresponding adjustment of the equivalent level in environmental noise assessment: Nordtest method NT ACOU 112 and ISO/PAS 1996-3:2022 (adjustment of 0 to 9 dB). Hearing-model impulsiveness metrics are not standardised and no open implementation is listed.",
      "references": [
        "nt-acou-112-2002",
        "iso-pas-1996-3-2022"
      ],
      "current": [
        "iso-pas-1996-3-2022"
      ],
      "edition_notes": {
        "nt-acou-112-2002": "Nordic test method.",
        "iso-pas-1996-3-2022": "Publicly available specification."
      },
      "url": "https://zhenxianli.github.io/LISQM/metrics/impulsiveness.html",
      "coverage": {
        "Python": "new",
        "MATLAB/Octave": "",
        "C/C++": "",
        "Rust": "",
        "Julia": "",
        "Other": ""
      },
      "implementations": [
        {
          "project": "phonometry",
          "reference": "iso-pas-1996-3-2022",
          "scope": "in the phonometry.environment namespace",
          "status": "available",
          "validation": "not-stated"
        },
        {
          "project": "phonometry",
          "reference": "nt-acou-112-2002",
          "scope": "in the phonometry.environment namespace",
          "status": "available",
          "validation": "not-stated"
        }
      ]
    },
    {
      "id": "psychoacoustic-annoyance",
      "family": "annoyance",
      "name": "Psychoacoustic annoyance",
      "title": "Psychoacoustic annoyance (Widmann, Zwicker & Fastl, More, Di et al.)",
      "aka": [
        "PA",
        "psychoacoustic annoyance",
        "Zwicker annoyance",
        "Widmann annoyance",
        "More annoyance",
        "Di annoyance"
      ],
      "unit": "dimensionless",
      "summary": "Psychoacoustic annoyance (PA) combines percentile loudness N5 with sharpness, roughness and fluctuation strength (Widmann 1992; Zwicker & Fastl 1999). More (2010) added tonality and Di et al. (2016) adapted the model for tonal noise. None of these is standardised; ISO/AWI 26573, registered in 2026, covers the assessment of annoyance through listening tests, including prediction models.",
      "references": [
        "widmann-1992",
        "zwicker-fastl-1999",
        "more-2010",
        "di-2016",
        "iso-26573-draft"
      ],
      "current": [
        "widmann-1992",
        "zwicker-fastl-1999",
        "more-2010",
        "di-2016"
      ],
      "conventions": [
        "**Inputs.** The models combine percentile values of loudness, sharpness, roughness and fluctuation strength (N5, S5, R5 and F5 in SQAT and PsychoacousticMetrics.jl). The percentile definition and the sharpness, roughness and fluctuation-strength models used change the result, and so does using whole-signal values instead (a stationary approximation).",
        "**Same model, two names.** Zwicker & Fastl (1999) give Widmann's (1992) model; SQAT lists it under both names. More (2010) and Di et al. (2016) are different models."
      ],
      "edition_notes": {
        "widmann-1992": "Original model.",
        "zwicker-fastl-1999": "Book version of the model.",
        "more-2010": "Adds tonality.",
        "di-2016": "Adapted for tonal noise.",
        "iso-26573-draft": "Approved work item (stage 20.00) since 2026."
      },
      "url": "https://zhenxianli.github.io/LISQM/metrics/psychoacoustic-annoyance.html",
      "coverage": {
        "Python": "current",
        "MATLAB/Octave": "current",
        "C/C++": "",
        "Rust": "",
        "Julia": "new",
        "Other": ""
      },
      "implementations": [
        {
          "project": "sqat",
          "reference": "di-2016",
          "functions": [
            "PsychoacousticAnnoyance_Di2016",
            "PsychoacousticAnnoyance_Di2016_from_percentile"
          ],
          "status": "available",
          "since": "v1.0",
          "validation": "not-stated",
          "validation_details": [
            "No verification routine (README)."
          ]
        },
        {
          "project": "sqat",
          "reference": "more-2010",
          "functions": [
            "PsychoacousticAnnoyance_More2010",
            "PsychoacousticAnnoyance_More2010_from_percentile"
          ],
          "status": "available",
          "since": "v1.0",
          "validation": "not-stated",
          "validation_details": [
            "No verification routine (README)."
          ]
        },
        {
          "project": "sqat",
          "reference": "zwicker-fastl-1999",
          "functions": [
            "PsychoacousticAnnoyance_Zwicker1999",
            "PsychoacousticAnnoyance_Zwicker1999_from_percentile"
          ],
          "status": "available",
          "since": "v1.0",
          "validation": "not-stated",
          "note": "Since v2.0 a wrapper of `PsychoacousticAnnoyance_Widmann1992`, which its header says will be removed in future releases."
        },
        {
          "project": "sqat",
          "reference": "widmann-1992",
          "functions": [
            "PsychoacousticAnnoyance_Widmann1992",
            "PsychoacousticAnnoyance_Widmann1992_from_percentile"
          ],
          "status": "available",
          "since": "v2.0",
          "validation": "not-stated",
          "note": "Added in June 2025 (PR #32); the README describes it as the same model as the Zwicker & Fastl entry under its original attribution."
        },
        {
          "project": "refmap-psychoacoustics",
          "reference": "di-2016",
          "functions": [
            "diPA"
          ],
          "scope": "Python, from precomputed metric values",
          "status": "available",
          "validation": "not-stated"
        },
        {
          "project": "refmap-psychoacoustics",
          "reference": "more-2010",
          "functions": [
            "morePA"
          ],
          "scope": "Python, from precomputed metric values",
          "status": "available",
          "validation": "not-stated"
        },
        {
          "project": "refmap-psychoacoustics",
          "reference": "widmann-1992",
          "functions": [
            "acousticPsychAnnoy",
            "widmannPA"
          ],
          "status": "available",
          "validation": "standard-data",
          "validation_details": [
            "A validation script (`validation/metrics/mlab/acousticPsychAnnoyValidation.m`) compares the MATLAB version with values from Widmann (1992)."
          ],
          "note": "The MATLAB header names the model Widmann (1992), \"commonly misattributed to Zwicker\". The Python `widmannPA` takes precomputed metric values."
        },
        {
          "project": "phonometry",
          "reference": "zwicker-fastl-1999",
          "functions": [
            "psychoacoustic_annoyance",
            "psychoacoustic_annoyance_from_signal"
          ],
          "status": "available",
          "since": "3.1.0",
          "validation": "self-tests",
          "validation_details": [
            "Tests compare one set of inputs (N5 = 30 sone, S = 2.0 acum, F = 0.5 vacil, R = 0.3 asper) with the value worked out by hand from Eqs. 16.2–16.4 (37.0478, within 0.001) and check the terms of the formula; no published example is used."
          ],
          "note": "Follows Eqs. 16.2–16.4 of Fastl & Zwicker (2007), the textbook form of Widmann's model."
        },
        {
          "project": "psychoacousticmetrics-jl",
          "reference": "widmann-1992",
          "functions": [
            "psychoacoustic_annoyance_widmann"
          ],
          "scope": "percentile convention (N5, S5, R5, FS5) and a stationary approximation",
          "status": "available",
          "since": "0.4.0",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "uses": [
            "zwickerloudness-jl"
          ],
          "validation_details": [
            "Cross-checked against SQAT's `PsychoacousticAnnoyance_Widmann1992`: an 840-case formula grid, reproduced bit-exactly, and six signal-level cases with SQAT's own N5, S5, R5 and FS5 vendored, so that every deviation is attributed to a component.",
            "Checked at the published 1 au anchor (a 1 kHz tone at 40 dB SPL): on the 4 s cross-check case, the percentile convention lands 0.1 % from it and the stationary approximation 0.8 %; on the README's 5 s examples, 0.3 % and 1.4 %."
          ],
          "conventions": [
            "The percentile form needs 48 kHz input.",
            "Percentiles are Hyndman–Fan type 7 quantiles (linear interpolation); SQAT takes the nearest rank, which the README says differs by a full order-statistic step on the coarse fluctuation-strength track."
          ]
        },
        {
          "project": "pysqat",
          "reference": "di-2016",
          "functions": [
            "PsychoacousticAnnoyance_Di2016"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with SQAT v1.3, run in MATLAB, by `validation/FINAL_VAL.py`; the generated reports are not committed."
          ],
          "derived_from": [
            "sqat"
          ],
          "comparison_relations": {
            "sqat": "source"
          }
        },
        {
          "project": "pysqat",
          "reference": "more-2010",
          "functions": [
            "PsychoacousticAnnoyance_More2010"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with SQAT v1.3, run in MATLAB, by `validation/FINAL_VAL.py`; the generated reports are not committed."
          ],
          "derived_from": [
            "sqat"
          ],
          "comparison_relations": {
            "sqat": "source"
          }
        },
        {
          "project": "pysqat",
          "reference": "zwicker-fastl-1999",
          "functions": [
            "PsychoacousticAnnoyance_Zwicker1999"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with SQAT v1.3, run in MATLAB, by `validation/FINAL_VAL.py`; the generated reports are not committed."
          ],
          "derived_from": [
            "sqat"
          ],
          "comparison_relations": {
            "sqat": "source"
          }
        },
        {
          "project": "psychoacoustic-parameters-measurer",
          "reference": "zwicker-fastl-1999",
          "functions": [
            "psychoacousticAnnoyance"
          ],
          "status": "available",
          "validation": "not-stated",
          "note": "The header cites Zwicker & Fastl, \"Psychoacoustics: Facts and Models\", without naming an edition."
        }
      ]
    },
    {
      "id": "equal-loudness-contours",
      "family": "related",
      "name": "Equal-loudness contours",
      "title": "Equal-loudness-level contours (ISO 226)",
      "aka": [
        "ISO 226",
        "equal-loudness contours",
        "phon curves",
        "threshold of hearing"
      ],
      "unit": "dB SPL, phon",
      "summary": "Normal equal-loudness-level contours for pure tones in free-field listening. ISO 226:2023 replaced ISO 226:2003; ECMA-418-2:2025 still refers to the 2003 edition.",
      "references": [
        "iso-226-2003",
        "iso-226-2023"
      ],
      "current": [
        "iso-226-2023"
      ],
      "edition_notes": {
        "iso-226-2003": "Second edition; withdrawn in 2023.",
        "iso-226-2023": "Third edition."
      },
      "url": "https://zhenxianli.github.io/LISQM/metrics/equal-loudness-contours.html",
      "coverage": {
        "Python": "new",
        "MATLAB/Octave": "partial",
        "C/C++": "partial",
        "Rust": "",
        "Julia": "",
        "Other": "partial"
      },
      "implementations": [
        {
          "project": "mosqito",
          "reference": "iso-226-2003",
          "functions": [
            "equal_loudness_contours"
          ],
          "status": "available",
          "since": "0.3.5",
          "validation": "not-stated",
          "note": "The docstring gives no edition; it is based on Jeff Tackett's MATLAB code for ISO 226:2003."
        },
        {
          "project": "pd-psycho",
          "reference": "iso-226-2003",
          "functions": [
            "[iso226]"
          ],
          "status": "available",
          "validation": "not-stated",
          "note": "The help patch names ISO 226:2003. Related objects convert between phon and dB (`[phon2db]`, `[db2phon]`) and between phon and sone (`[phon2sone]`, `[sone2phon]`)."
        },
        {
          "project": "pydsm",
          "reference": "iso-226-2003",
          "functions": [
            "pydsm.iso226"
          ],
          "scope": "tabled and interpolated contours; optional 20 kHz extension",
          "status": "available",
          "validation": "not-stated"
        },
        {
          "project": "phonometry",
          "reference": "iso-226-2023",
          "functions": [
            "equal_loudness_contour",
            "equal_loudness_contours",
            "loudness_level",
            "hearing_threshold"
          ],
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "validation_details": [
            "Tests compare 17 points of Table B.1 (20 to 90 phon, 20 Hz to 12.5 kHz) and 6 points of Table B.2 with the computed contours and loudness levels, within 0.05 dB or phon, and the hearing threshold with Table 1."
          ]
        },
        {
          "project": "mosqito-net",
          "reference": "iso-226-2003",
          "functions": [
            "Sq.EqualLoudnessContours"
          ],
          "status": "available",
          "validation": "not-stated",
          "note": "Code comments say ISO 226:1987, but the tables are ported from MoSQITo, whose code follows Jeff Tackett's ISO 226:2003 implementation.",
          "derived_from": [
            "mosqito"
          ]
        },
        {
          "project": "iosr-matlab-toolbox",
          "reference": "iso-226-2003",
          "functions": [
            "iosr.auditory.iso226"
          ],
          "status": "available",
          "validation": "not-stated"
        }
      ]
    },
    {
      "id": "epnl",
      "family": "related",
      "name": "Perceived noise level and EPNL",
      "title": "Perceived noise level, PNLT and EPNL (ICAO Annex 16, 14 CFR Part 36)",
      "aka": [
        "EPNL",
        "EPNdB",
        "PNL",
        "PNLT",
        "perceived noisiness",
        "noy",
        "aircraft noise certification"
      ],
      "unit": "PNdB, EPNdB",
      "summary": "Effective perceived noise level for aircraft noise certification: perceived noisiness in noy, the tone-corrected perceived noise level (PNLT) and a duration correction. Defined in ICAO Annex 16, Volume I, and in the US regulation 14 CFR Part 36.",
      "references": [
        "cfr-14-part-36",
        "icao-annex-16-vol-1"
      ],
      "current": [
        "icao-annex-16-vol-1",
        "cfr-14-part-36"
      ],
      "edition_notes": {
        "icao-annex-16-vol-1": "International standard for aircraft noise certification.",
        "cfr-14-part-36": "US regulation (Appendices A and B)."
      },
      "url": "https://zhenxianli.github.io/LISQM/metrics/epnl.html",
      "coverage": {
        "Python": "current",
        "MATLAB/Octave": "current",
        "C/C++": "",
        "Rust": "partial",
        "Julia": "",
        "Other": ""
      },
      "implementations": [
        {
          "project": "sqat",
          "reference": "cfr-14-part-36",
          "functions": [
            "EPNL_FAR_Part36",
            "get_PNL",
            "get_PNLT",
            "get_Duration_Correction"
          ],
          "status": "available",
          "since": "v1.1",
          "validation": "cross-implementation",
          "compared_with": [
            "published EPNL values (Rizzi et al., 2020)"
          ],
          "validation_details": [
            "The README says that no reference implementation or test signals exist, so the verification is partial.",
            "Perceived noisiness is checked at its definition (a third-octave band of noise at 1 kHz and 40 dB SPL gives 1 noy), and the tone correction factor against Table 3.7 of ICAO Doc 9501.",
            "EPNL is cross-checked with Table 4 of Rizzi et al. (2020), AIAA 2020-2582, for 15 flyover sounds (five cases auralised by three tools): the largest difference is about 0.6 EPNdB."
          ],
          "note": "Follows Amendment 36-26 (2005)."
        },
        {
          "project": "phonometry",
          "reference": "icao-annex-16-vol-1",
          "scope": "PNL, PNLT and EPNL, in the phonometry.aircraft namespace",
          "status": "available",
          "validation": "standard-data",
          "validation_details": [
            "Tested with the EPNL example of ICAO Doc 9501 (Environmental Technical Manual)."
          ]
        },
        {
          "project": "pysqat",
          "reference": "cfr-14-part-36",
          "functions": [
            "EPNL_FAR_Part36"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with SQAT v1.3, run in MATLAB, by `validation/FINAL_VAL.py`; the generated reports are not committed."
          ],
          "derived_from": [
            "sqat"
          ],
          "comparison_relations": {
            "sqat": "source"
          }
        },
        {
          "project": "suave",
          "reference": "icao-annex-16-vol-1",
          "functions": [
            "pnl_noise",
            "noise_tone_correction",
            "epnl_noise"
          ],
          "scope": "PNL, PNLT and EPNL; the code cites no edition",
          "status": "available",
          "validation": "not-stated",
          "note": "EPNL is computed from a PNLT time history. The noise tools cite neither ICAO Annex 16 nor 14 CFR Part 36, nor an edition; their docstrings give \"Source: None\"."
        },
        {
          "project": "zhen-ni-epnl",
          "reference": "icao-annex-16-vol-1",
          "functions": [
            "SPL",
            "Noy",
            "PNL",
            "PNLT"
          ],
          "scope": "PNL and PNLT only; no duration correction to EPNL",
          "partial": true,
          "status": "available",
          "validation": "not-stated",
          "note": "Code comments cite \"Annex 16 - Volume I, APP 2-16 / 2-17\" and number the 24 bands \"consistent with ICAO ANNEX 16\". The quantities are Rust types converted into each other with `From`."
        }
      ]
    },
    {
      "id": "aural-detectability",
      "family": "related",
      "name": "Aural detectability",
      "title": "Aural detectability of sounds in background noise",
      "aka": [
        "detectability",
        "d-prime",
        "signal detection",
        "aural detection",
        "audibility of aircraft"
      ],
      "unit": "d′ (detectability index), dB",
      "summary": "How likely a listener is to detect a sound in background noise, from signal-to-noise ratios in auditory filters and signal-detection theory. Used for aircraft, drone and urban air mobility noise. Not standardised.",
      "references": [
        "fidell-1974",
        "rizzi-2025"
      ],
      "current": [
        "fidell-1974"
      ],
      "edition_notes": {
        "fidell-1974": "Model paper.",
        "rizzi-2025": "NASA's use of the model in annoyance assessments of urban air mobility, with audibility as a factor."
      },
      "url": "https://zhenxianli.github.io/LISQM/metrics/aural-detectability.html",
      "coverage": {
        "Python": "current",
        "MATLAB/Octave": "current",
        "C/C++": "",
        "Rust": "",
        "Julia": "",
        "Other": ""
      },
      "implementations": [
        {
          "project": "refmap-psychoacoustics",
          "reference": "rizzi-2025",
          "functions": [
            "auralDetectability",
            "aural_detect"
          ],
          "scope": "MATLAB and Python",
          "status": "available",
          "validation": "not-stated",
          "note": "The same functions; the README cites this paper for the NASA development of the model."
        },
        {
          "project": "refmap-psychoacoustics",
          "reference": "fidell-1974",
          "functions": [
            "auralDetectability",
            "auralDetectFromLeq",
            "aural_detect",
            "aural_detect_from_lzeqt"
          ],
          "scope": "MATLAB and Python",
          "status": "available",
          "validation": "not-stated",
          "note": "Code headers describe the Fidell, Pearsons & Bennett (1974) model as \"developed further by NASA\" and cite \"Rizzi, SA et al, 2024\"; the README cites Rizzi et al. (2025), *Journal of Aircraft*, doi:10.2514/1.C038188."
        }
      ]
    }
  ],
  "references": [
    {
      "id": "iso-532-1975",
      "label": "ISO 532:1975",
      "kind": "standard",
      "body": "ISO",
      "title": "Acoustics — Method for calculating loudness level",
      "date": "1975-07-01",
      "status": "withdrawn",
      "superseded_by": "iso-532-1-2017",
      "url": "https://www.iso.org/standard/4603.html",
      "note": "Method A (Stevens) and method B (Zwicker). Withdrawn on 2017-06-15; ISO lists ISO 532-1:2017 as its replacement.",
      "checked": "2026-10-06"
    },
    {
      "id": "din-45631-1991",
      "label": "DIN 45631:1991",
      "kind": "standard",
      "body": "DIN",
      "title": "Berechnung des Lautstärkepegels und der Lautheit aus dem Geräuschspektrum; Verfahren nach E. Zwicker",
      "date": "1991-03",
      "status": "current",
      "url": "https://www.dinmedia.de/en/standard/din-45631/1666531",
      "note": "Stationary sounds. ISO 532-1:2017 states that its stationary method is based on this standard.",
      "checked": "2026-10-06"
    },
    {
      "id": "din-45631-a1-2010",
      "label": "DIN 45631/A1:2010",
      "kind": "amendment",
      "body": "DIN",
      "title": "Calculation of loudness level and loudness from the sound spectrum — Zwicker method — Amendment 1: Calculation of the loudness of time-variant sound",
      "date": "2010-03",
      "status": "current",
      "url": "https://www.dinmedia.de/en/standard/din-45631-a1/122476084",
      "note": "Comes with PDF, Excel and WAV supplements.",
      "checked": "2026-10-06"
    },
    {
      "id": "iso-532-1-2017",
      "label": "ISO 532-1:2017",
      "kind": "standard",
      "body": "ISO",
      "title": "Acoustics — Methods for calculating loudness — Part 1: Zwicker method",
      "edition": "1st edition (corrected version 2017-11)",
      "date": "2017-06-15",
      "status": "current",
      "superseded_by": "iso-532-1-ed2-draft",
      "revision": "Under revision; the 2nd edition has been at committee-draft stage since 2024-11-01.",
      "url": "https://www.iso.org/standard/63077.html",
      "note": "Stationary and time-varying methods. The Annex A program and Annex B test signals can be downloaded free from [standards.iso.org](https://standards.iso.org/iso/532/-1/ed-1/en/), but ISO's licence only allows use in their original form, so they are not open source. Adopted in Germany as DIN ISO 532-1:2022-03.",
      "checked": "2026-10-06"
    },
    {
      "id": "iso-532-1-ed2-draft",
      "label": "ISO/CD 532-1",
      "kind": "draft",
      "body": "ISO",
      "title": "Acoustics — Methods for calculating loudness — Part 1: Zwicker method (2nd edition)",
      "edition": "2nd edition, committee draft",
      "date": "2024-11",
      "status": "in-development",
      "url": "https://www.iso.org/standard/90809.html",
      "note": "Stage 30.99 (CD approved for registration as DIS) since 2024-11-01; not yet at DIS on 2026-09-30.",
      "checked": "2026-10-06"
    },
    {
      "id": "moore-1997",
      "label": "Moore, Glasberg & Baer (1997)",
      "kind": "paper",
      "body": "paper",
      "title": "A model for the prediction of thresholds, loudness, and partial loudness",
      "date": 1997,
      "status": "published",
      "citation": "Moore, B. C. J., Glasberg, B. R., & Baer, T. (1997). A model for the prediction of thresholds, loudness, and partial loudness. *Journal of the Audio Engineering Society*, 45(4), 224–240.",
      "url": "https://aes2.org/publications/elibrary-page/?id=10272",
      "checked": "2026-10-07"
    },
    {
      "id": "chen-2011",
      "label": "Chen et al. (2011)",
      "kind": "paper",
      "body": "paper",
      "title": "A new method of calculating auditory excitation patterns and loudness for steady sounds",
      "date": 2011,
      "status": "published",
      "doi": "10.1016/j.heares.2011.08.001",
      "citation": "Chen, Z., Hu, G., Glasberg, B. R., & Moore, B. C. J. (2011). A new method of calculating auditory excitation patterns and loudness for steady sounds. *Hearing Research*, 282(1–2), 204–215.",
      "checked": "2026-10-06"
    },
    {
      "id": "ansi-s3-4-2007",
      "label": "ANSI/ASA S3.4-2007",
      "kind": "standard",
      "body": "ANSI/ASA",
      "title": "Procedure for the Computation of Loudness of Steady Sounds",
      "date": 2007,
      "status": "current",
      "url": "https://webstore.ansi.org/standards/asa/ANSIASAS32007R2020",
      "note": "Based on Moore, Glasberg & Baer (1997) with later modifications; includes a loudness program. Replaced S3.4-2005, which contained a calculation error. Reaffirmed several times, most recently listed as S3.4-2007 (R2025).",
      "checked": "2026-10-06"
    },
    {
      "id": "iso-532-2-2017",
      "label": "ISO 532-2:2017",
      "kind": "standard",
      "body": "ISO",
      "title": "Acoustics — Methods for calculating loudness — Part 2: Moore-Glasberg method",
      "edition": "1st edition",
      "date": "2017-06-26",
      "status": "current",
      "superseded_by": "iso-532-2-ed2-draft",
      "revision": "Under revision; the 2nd edition has been at committee-draft stage since 2024-11-01.",
      "url": "https://www.iso.org/standard/63078.html",
      "note": "Stationary sounds, monaural or binaural. Source code is supplied with the standard as informative material.",
      "checked": "2026-10-06"
    },
    {
      "id": "iso-532-2-ed2-draft",
      "label": "ISO/CD 532-2",
      "kind": "draft",
      "body": "ISO",
      "title": "Acoustics — Methods for calculating loudness — Part 2: Moore-Glasberg method (2nd edition)",
      "edition": "2nd edition, committee draft",
      "date": "2024-11",
      "status": "in-development",
      "url": "https://www.iso.org/standard/90812.html",
      "note": "Stage 30.99 since 2024-11-01.",
      "checked": "2026-10-06"
    },
    {
      "id": "glasberg-moore-2002",
      "label": "Glasberg & Moore (2002)",
      "kind": "paper",
      "body": "paper",
      "title": "A model of loudness applicable to time-varying sounds",
      "date": 2002,
      "status": "published",
      "citation": "Glasberg, B. R., & Moore, B. C. J. (2002). A model of loudness applicable to time-varying sounds. *Journal of the Audio Engineering Society*, 50(5), 331–342.",
      "url": "https://aes2.org/publications/elibrary-page/?id=11081",
      "checked": "2026-10-07"
    },
    {
      "id": "chalupper-fastl-2002",
      "label": "Chalupper & Fastl (2002)",
      "kind": "paper",
      "body": "paper",
      "title": "Dynamic loudness model (DLM) for normal and hearing-impaired listeners",
      "date": 2002,
      "status": "published",
      "citation": "Chalupper, J., & Fastl, H. (2002). Dynamic loudness model (DLM) for normal and hearing-impaired listeners. *Acta Acustica united with Acustica*, 88(3), 378–386.",
      "url": "https://www.ingentaconnect.com/contentone/dav/aaua/2002/00000088/00000003/art00009",
      "checked": "2026-10-07"
    },
    {
      "id": "moore-2016",
      "label": "Moore et al. (2016)",
      "kind": "paper",
      "body": "paper",
      "title": "A loudness model for time-varying sounds incorporating binaural inhibition",
      "date": 2016,
      "status": "published",
      "doi": "10.1177/2331216516682698",
      "citation": "Moore, B. C. J., Glasberg, B. R., Varathanathan, A., & Schlittenlacher, J. (2016). A loudness model for time-varying sounds incorporating binaural inhibition. *Trends in Hearing*, 20, 2331216516682698.",
      "checked": "2026-10-06"
    },
    {
      "id": "moore-2018",
      "label": "Moore et al. (2018)",
      "kind": "paper",
      "body": "paper",
      "title": "Testing and refining a loudness model for time-varying sounds incorporating binaural inhibition",
      "date": 2018,
      "status": "published",
      "doi": "10.1121/1.5027246",
      "citation": "Moore, B. C. J., Jervis, M., Harries, L., & Schlittenlacher, J. (2018). Testing and refining a loudness model for time-varying sounds incorporating binaural inhibition. *The Journal of the Acoustical Society of America*, 143(3), 1504–1513.",
      "checked": "2026-10-06"
    },
    {
      "id": "iso-532-3-2023",
      "label": "ISO 532-3:2023",
      "kind": "standard",
      "body": "ISO",
      "title": "Acoustics — Methods for calculating loudness — Part 3: Moore-Glasberg-Schlittenlacher method",
      "edition": "1st edition",
      "date": "2023-07-13",
      "status": "current",
      "superseded_by": "iso-532-3-ed2-draft",
      "revision": "Under revision; the 2nd edition has been at committee-draft stage since 2024-11-01.",
      "url": "https://www.iso.org/standard/69856.html",
      "note": "Stationary and time-varying sounds (speech, music, impulsive sounds), with binaural inhibition. Source code is supplied with the standard as informative material.",
      "checked": "2026-10-06"
    },
    {
      "id": "iso-532-3-ed2-draft",
      "label": "ISO/CD 532-3",
      "kind": "draft",
      "body": "ISO",
      "title": "Acoustics — Methods for calculating loudness — Part 3: Moore-Glasberg-Schlittenlacher method (2nd edition)",
      "edition": "2nd edition, committee draft",
      "date": "2024-11",
      "status": "in-development",
      "url": "https://www.iso.org/standard/90816.html",
      "note": "Stage 30.99 since 2024-11-01.",
      "checked": "2026-10-06"
    },
    {
      "id": "ecma-74-ed17",
      "label": "ECMA-74:2019 (17th ed.)",
      "kind": "standard",
      "body": "Ecma",
      "title": "Measurement of airborne noise emitted by information technology and telecommunications equipment",
      "edition": "17th edition",
      "date": "2019-12",
      "status": "superseded",
      "url": "https://ecma-international.org/publications-and-standards/standards/ecma-74/",
      "note": "Contained the TNR/PR method (Annex D) and the hearing model with tonality that moved to ECMA-418-1 and ECMA-418-2 in 2020. Since the 18th edition (2021) those annexes only point to ECMA-418, and an Annex H on roughness was added. The current edition is the 22nd (December 2025).",
      "checked": "2026-10-06"
    },
    {
      "id": "ecma-418-1-ed1",
      "label": "ECMA-418-1:2020 (1st ed.)",
      "kind": "standard",
      "body": "Ecma",
      "title": "Psychoacoustic metrics for ITT equipment — Part 1 (prominent discrete tones)",
      "edition": "1st edition",
      "date": "2020-12",
      "status": "superseded",
      "superseded_by": "ecma-418-1-ed2",
      "url": "https://ecma-international.org/wp-content/uploads/ECMA-418-1_1st_edition_december_2020.pdf",
      "checked": "2026-10-06"
    },
    {
      "id": "ecma-418-1-ed2",
      "label": "ECMA-418-1:2022 (2nd ed.)",
      "kind": "standard",
      "body": "Ecma",
      "title": "Psychoacoustic metrics for ITT equipment — Part 1 (prominent discrete tones)",
      "edition": "2nd edition",
      "date": "2022-12",
      "status": "superseded",
      "superseded_by": "ecma-418-1-ed3",
      "url": "https://ecma-international.org/wp-content/uploads/ECMA-418-1_2nd_edition_december_2022.pdf",
      "checked": "2026-10-06"
    },
    {
      "id": "ecma-418-1-ed3",
      "label": "ECMA-418-1:2024 (3rd ed.)",
      "kind": "standard",
      "body": "Ecma",
      "title": "Psychoacoustic metrics for ITT equipment — Part 1 (prominent discrete tones)",
      "edition": "3rd edition",
      "date": "2024-12",
      "status": "current",
      "url": "https://ecma-international.org/wp-content/uploads/ECMA-418-1_3rd_edition_december_2024.pdf",
      "note": "Free download. No newer edition was approved at the Ecma General Assembly of June 2026.",
      "checked": "2026-10-06"
    },
    {
      "id": "ecma-418-2-ed1",
      "label": "ECMA-418-2:2020 (1st ed.)",
      "kind": "standard",
      "body": "Ecma",
      "title": "Psychoacoustic metrics for ITT equipment — Part 2 (models based on human perception)",
      "edition": "1st edition",
      "date": "2020-12",
      "status": "superseded",
      "superseded_by": "ecma-418-2-ed2",
      "url": "https://ecma-international.org/wp-content/uploads/ECMA-418-2_1st_edition_december_2020.pdf",
      "checked": "2026-10-06"
    },
    {
      "id": "ecma-418-2-ed2",
      "label": "ECMA-418-2:2022 (2nd ed.)",
      "kind": "standard",
      "body": "Ecma",
      "title": "Psychoacoustic metrics for ITT equipment — Part 2 (models based on human perception)",
      "edition": "2nd edition",
      "date": "2022-12",
      "status": "superseded",
      "superseded_by": "ecma-418-2-ed3",
      "url": "https://ecma-international.org/wp-content/uploads/ECMA-418-2_2nd_edition_december_2022.pdf",
      "checked": "2026-10-06"
    },
    {
      "id": "ecma-418-2-ed3",
      "label": "ECMA-418-2:2024 (3rd ed.)",
      "kind": "standard",
      "body": "Ecma",
      "title": "Psychoacoustic metrics for ITT equipment — Part 2 (methods for describing human perception based on the Sottek Hearing Model)",
      "edition": "3rd edition",
      "date": "2024-12",
      "status": "superseded",
      "superseded_by": "ecma-418-2-ed4",
      "url": "https://ecma-international.org/wp-content/uploads/ECMA-418-2_3rd_edition_december_2024.pdf",
      "checked": "2026-10-06"
    },
    {
      "id": "ecma-418-2-ed4",
      "label": "ECMA-418-2:2025 (4th ed.)",
      "kind": "standard",
      "body": "Ecma",
      "title": "Psychoacoustic metrics for ITT equipment — Part 2 (methods for describing human perception based on the Sottek Hearing Model)",
      "edition": "4th edition",
      "date": "2025-06",
      "status": "current",
      "url": "https://ecma-international.org/wp-content/uploads/ECMA-418-2_4th_edition_june_2025.pdf",
      "note": "Approved on 2025-06-25. Adds fluctuation strength (Clause 9); still refers to ISO 226:2003; defines no sharpness. Free download. No newer edition was approved at the Ecma General Assembly of June 2026.",
      "checked": "2026-10-06"
    },
    {
      "id": "von-bismarck-1974",
      "label": "von Bismarck (1974)",
      "kind": "paper",
      "body": "paper",
      "title": "Sharpness as an attribute of the timbre of steady sounds",
      "date": 1974,
      "status": "published",
      "citation": "von Bismarck, G. (1974). Sharpness as an attribute of the timbre of steady sounds. *Acustica*, 30(3), 159–172.",
      "url": "https://www.ingentaconnect.com/contentone/dav/aaua/1974/00000030/00000003/art00006",
      "checked": "2026-10-07"
    },
    {
      "id": "aures-1985-euphony",
      "label": "Aures (1985b)",
      "kind": "paper",
      "body": "paper",
      "title": "Berechnungsverfahren für den sensorischen Wohlklang beliebiger Schallsignale",
      "date": 1985,
      "status": "published",
      "citation": "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.",
      "note": "Defines the tonality model and the loudness-dependent sharpness weighting that carry Aures's name.",
      "checked": "2026-10-06"
    },
    {
      "id": "din-45692-2009",
      "label": "DIN 45692:2009",
      "kind": "standard",
      "body": "DIN",
      "title": "Messtechnische Simulation der Hörempfindung Schärfe (Measurement technique for the simulation of the auditory sensation of sharpness)",
      "date": "2009-08",
      "status": "current",
      "url": "https://www.dinmedia.de/en/standard/din-45692/117635111",
      "note": "Includes a test procedure for measuring instruments. No revision or draft has been announced.",
      "checked": "2026-10-06"
    },
    {
      "id": "aures-1985-roughness",
      "label": "Aures (1985a)",
      "kind": "paper",
      "body": "paper",
      "title": "Ein Berechnungsverfahren der Rauhigkeit",
      "date": 1985,
      "status": "published",
      "citation": "Aures, W. (1985). Ein Berechnungsverfahren der Rauhigkeit [A procedure for calculating auditory roughness]. *Acustica*, 58, 268–281.",
      "checked": "2026-10-06"
    },
    {
      "id": "daniel-weber-1997",
      "label": "Daniel & Weber (1997)",
      "kind": "paper",
      "body": "paper",
      "title": "Psychoacoustical roughness: implementation of an optimized model",
      "date": 1997,
      "status": "published",
      "citation": "Daniel, P., & Weber, R. (1997). Psychoacoustical roughness: Implementation of an optimized model. *Acta Acustica united with Acustica*, 83(1), 113–123.",
      "checked": "2026-10-06"
    },
    {
      "id": "swift-gee-2017",
      "label": "Swift & Gee (2017)",
      "kind": "paper",
      "body": "paper",
      "title": "Extending sharpness calculation for an alternative loudness metric input",
      "date": 2017,
      "status": "published",
      "doi": "10.1121/1.5016193",
      "citation": "Swift, S. H., & Gee, K. L. (2017). Extending sharpness calculation for an alternative loudness metric input. *The Journal of the Acoustical Society of America*, 142(6), EL549.",
      "note": "Sharpness computed from Moore–Glasberg specific loudness instead of Zwicker's.",
      "checked": "2026-10-07"
    },
    {
      "id": "din-38455-2024",
      "label": "DIN 38455:2024",
      "kind": "standard",
      "body": "DIN",
      "title": "Berechnung der Hörempfindung Rauigkeit (Calculation of the auditory sensation of roughness)",
      "date": "2024-11",
      "status": "current",
      "url": "https://www.dinmedia.de/en/standard/din-38455/376186532",
      "note": "The first German standard for roughness (44 pages, in German), from the DIN/VDI committee for psychoacoustic measurement. Which model it specifies could not be confirmed from public information; a hearing-model roughness was proposed for DIN standardisation by Sottek & Becker (2019).",
      "checked": "2026-10-06"
    },
    {
      "id": "fastl-zwicker-2007",
      "label": "Fastl & Zwicker (2007)",
      "kind": "book",
      "body": "paper",
      "title": "Psychoacoustics: Facts and Models (3rd edition)",
      "date": 2007,
      "status": "published",
      "doi": "10.1007/978-3-540-68888-4",
      "citation": "Fastl, H., & Zwicker, E. (2007). *Psychoacoustics: Facts and models* (3rd ed.). Springer.",
      "checked": "2026-10-06"
    },
    {
      "id": "osses-2016",
      "label": "Osses et al. (2016)",
      "kind": "paper",
      "body": "paper",
      "title": "Modelling the sensation of fluctuation strength",
      "date": 2016,
      "status": "published",
      "doi": "10.1121/2.0000410",
      "citation": "Osses Vecchi, A., García León, R., & Kohlrausch, A. (2016). Modelling the sensation of fluctuation strength. *Proceedings of Meetings on Acoustics*, 28, 050005.",
      "checked": "2026-10-06"
    },
    {
      "id": "terhardt-1982",
      "label": "Terhardt et al. (1982)",
      "kind": "paper",
      "body": "paper",
      "title": "Algorithm for extraction of pitch and pitch salience from complex tonal signals",
      "date": 1982,
      "status": "published",
      "doi": "10.1121/1.387544",
      "citation": "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.",
      "checked": "2026-10-06"
    },
    {
      "id": "din-45681-2002-draft",
      "label": "E DIN 45681:2002-11",
      "kind": "draft",
      "body": "DIN",
      "title": "Akustik — Bestimmung der Tonhaltigkeit von Geräuschen und Ermittlung eines Tonzuschlages für die Beurteilung von Geräuschimmissionen (draft)",
      "date": "2002-11",
      "status": "superseded",
      "superseded_by": "din-45681-2005",
      "citation": "DIN (2002). *E DIN 45681:2002-11 (draft): Akustik — Bestimmung der Tonhaltigkeit von Geräuschen und Ermittlung eines Tonzuschlages für die Beurteilung von Geräuschimmissionen*. Beuth, Berlin.",
      "note": "The draft of DIN 45681:2005.",
      "checked": "2026-10-07"
    },
    {
      "id": "din-45681-2005",
      "label": "DIN 45681:2005",
      "kind": "standard",
      "body": "DIN",
      "title": "Akustik — Bestimmung der Tonhaltigkeit von Geräuschen und Ermittlung eines Tonzuschlages für die Beurteilung von Geräuschimmissionen",
      "date": "2005-03",
      "status": "current",
      "url": "https://www.dinmedia.de/en/standard/din-45681/76463232",
      "note": "Corrected by Berichtigung 2:2006-08, which replaced Berichtigung 1:2005-08. Supplied with a calculation program.",
      "checked": "2026-10-06"
    },
    {
      "id": "iso-pas-20065-2016",
      "label": "ISO/PAS 20065:2016",
      "kind": "publicly-available-specification",
      "body": "ISO",
      "title": "Acoustics — Objective method for assessing the audibility of tones in noise — Engineering method",
      "date": "2016-07-01",
      "status": "withdrawn",
      "superseded_by": "iso-ts-20065-2022",
      "url": "https://www.iso.org/standard/66941.html",
      "note": "Withdrawn on 2022-12-19 when the technical specification was published.",
      "checked": "2026-10-06"
    },
    {
      "id": "iso-ts-20065-2022",
      "label": "ISO/TS 20065:2022",
      "kind": "technical-specification",
      "body": "ISO",
      "title": "Acoustics — Objective method for assessing the audibility of tones in noise — Engineering method",
      "date": "2022-12-19",
      "status": "current",
      "url": "https://www.iso.org/standard/81518.html",
      "note": "Confirmed in 2026.",
      "checked": "2026-10-06"
    },
    {
      "id": "iso-1996-2-2007",
      "label": "ISO 1996-2:2007",
      "kind": "standard",
      "body": "ISO",
      "title": "Acoustics — Description, measurement and assessment of environmental noise — Part 2: Determination of environmental noise levels",
      "date": "2007-03-09",
      "status": "withdrawn",
      "superseded_by": "iso-1996-2-2017",
      "url": "https://www.iso.org/standard/41860.html",
      "checked": "2026-10-06"
    },
    {
      "id": "iso-1996-2-2017",
      "label": "ISO 1996-2:2017",
      "kind": "standard",
      "body": "ISO",
      "title": "Acoustics — Description, measurement and assessment of environmental noise — Part 2: Determination of sound pressure levels",
      "date": "2017-07-14",
      "status": "current",
      "url": "https://www.iso.org/standard/59766.html",
      "note": "Annex J (engineering method) and Annex K (survey method) for tonal audibility. Confirmed after review.",
      "revision": "ISO Open Data (2026-09-30) links it to a successor project (ISO 86954), which has not been published yet.",
      "checked": "2026-10-06"
    },
    {
      "id": "iec-61400-11-2002",
      "label": "IEC 61400-11:2002",
      "kind": "standard",
      "body": "IEC",
      "title": "Wind turbine generator systems — Part 11: Acoustic noise measurement techniques",
      "edition": "Edition 2 (2002); 2.1 with Amendment 1 (2006)",
      "date": "2002-12",
      "status": "superseded",
      "superseded_by": "iec-61400-11-2012",
      "url": "https://webstore.iec.ch/en/publication/19736",
      "note": "Already has a tonality and tonal-audibility procedure (critical-band analysis, masking classification and a frequency-dependent audibility criterion). Replaced the first edition of 1998.",
      "checked": "2026-10-06"
    },
    {
      "id": "iec-61400-11-2012",
      "label": "IEC 61400-11:2012+AMD1:2018",
      "kind": "standard",
      "body": "IEC",
      "title": "Wind turbines — Part 11: Acoustic noise measurement techniques",
      "edition": "Edition 3.1 (edition 3 of 2012 with Amendment 1 of 2018)",
      "date": "2012-11-07",
      "status": "current",
      "url": "https://webstore.iec.ch/en/publication/63367",
      "note": "Tonal audibility is in clause 9.5. Amendment 1 published 2018-06-15, corrigendum in 2019. Receptor measurements are covered separately by IEC TS 61400-11-2:2024.",
      "checked": "2026-10-06"
    },
    {
      "id": "nt-acou-112-2002",
      "label": "NT ACOU 112",
      "kind": "method",
      "body": "Nordtest",
      "title": "Acoustics: Prominence of impulsive sounds and for adjustment of LAeq",
      "date": "2002-05",
      "status": "current",
      "url": "http://www.nordtest.info/wp/2002/05/01/acoustics-prominence-of-impulsive-sounds-and-for-adjustment-of-laeq-nt-acou-112/",
      "citation": "Nordtest (2002). *NT ACOU 112: Acoustics — Prominence of impulsive sounds and for adjustment of LAeq*. Nordtest, Taastrup.",
      "note": "Defines impulses by level difference and onset rate; the basis of ISO/PAS 1996-3.",
      "checked": "2026-10-06"
    },
    {
      "id": "iso-pas-1996-3-2022",
      "label": "ISO/PAS 1996-3:2022",
      "kind": "publicly-available-specification",
      "body": "ISO",
      "title": "Acoustics — Description, measurement and assessment of environmental noise — Part 3: Objective method for the measurement of prominence of impulsive sounds and for adjustment of LAeq",
      "date": "2022-07-06",
      "status": "current",
      "url": "https://www.iso.org/standard/77035.html",
      "note": "Adjustment of 0 to 9 dB. Confirmed in 2025.",
      "revision": "ISO Open Data (2026-09-30) links it to a successor project (ISO 95221), which has not been published yet.",
      "checked": "2026-10-06"
    },
    {
      "id": "widmann-1992",
      "label": "Widmann (1992)",
      "kind": "thesis",
      "body": "paper",
      "title": "Ein Modell der psychoakustischen Lästigkeit von Schallen und seine Anwendung in der Praxis der Lärmbeurteilung",
      "date": 1992,
      "status": "published",
      "citation": "Widmann, U. (1992). *Ein Modell der psychoakustischen Lästigkeit von Schallen und seine Anwendung in der Praxis der Lärmbeurteilung* [Doctoral dissertation, Technische Universität München].",
      "checked": "2026-10-06"
    },
    {
      "id": "zwicker-fastl-1999",
      "label": "Zwicker & Fastl (1999)",
      "kind": "book",
      "body": "paper",
      "title": "Psychoacoustics: Facts and Models (2nd edition)",
      "date": 1999,
      "status": "published",
      "citation": "Zwicker, E., & Fastl, H. (1999). *Psychoacoustics: Facts and models* (2nd ed.). Springer.",
      "doi": "10.1007/978-3-662-09562-1",
      "checked": "2026-10-07"
    },
    {
      "id": "more-2010",
      "label": "More (2010)",
      "kind": "thesis",
      "body": "paper",
      "title": "Aircraft noise characteristics and metrics",
      "date": 2010,
      "status": "published",
      "citation": "More, S. R. (2010). *Aircraft noise characteristics and metrics* [Doctoral dissertation, Purdue University]. PARTNER report PARTNER-COE-2011-004.",
      "url": "https://docs.lib.purdue.edu/dissertations/AAI3453255",
      "checked": "2026-10-07"
    },
    {
      "id": "di-2016",
      "label": "Di et al. (2016)",
      "kind": "paper",
      "body": "paper",
      "title": "Improvement of Zwicker's psychoacoustic annoyance model aiming at tonal noises",
      "date": 2016,
      "status": "published",
      "doi": "10.1016/j.apacoust.2015.12.006",
      "citation": "Di, G., Chen, X., Song, K., Zhou, B., & Pei, C. (2016). Improvement of Zwicker's psychoacoustic annoyance model aiming at tonal noises. *Applied Acoustics*, 105, 164–170.",
      "checked": "2026-10-06"
    },
    {
      "id": "iso-26573-draft",
      "label": "ISO/AWI 26573",
      "kind": "draft",
      "body": "ISO",
      "title": "Acoustics — Procedures for assessment and prediction of noise-induced perceptual annoyance through laboratory-based listening tests",
      "date": "2026-04",
      "status": "in-development",
      "url": "https://www.iso.org/standard/93922.html",
      "note": "Approved work item (stage 20.00) of ISO/TC 43/SC 1, per ISO Open Data of 2026-09-30.",
      "checked": "2026-10-06"
    },
    {
      "id": "iso-226-2003",
      "label": "ISO 226:2003",
      "kind": "standard",
      "body": "ISO",
      "title": "Acoustics — Normal equal-loudness-level contours",
      "edition": "2nd edition",
      "date": "2003-08-21",
      "status": "withdrawn",
      "superseded_by": "iso-226-2023",
      "url": "https://www.iso.org/standard/34222.html",
      "note": "Withdrawn on 2023-03-29. Still referenced by ECMA-418-2:2025. Adopted in China as GB/T 4963-2007, which was reviewed and kept in force in December 2023.",
      "checked": "2026-10-06"
    },
    {
      "id": "iso-226-2023",
      "label": "ISO 226:2023",
      "kind": "standard",
      "body": "ISO",
      "title": "Acoustics — Normal equal-loudness-level contours",
      "edition": "3rd edition",
      "date": "2023-03-29",
      "status": "current",
      "url": "https://www.iso.org/standard/83117.html",
      "note": "Data for 20 Hz to 12.5 kHz.",
      "checked": "2026-10-06"
    },
    {
      "id": "icao-annex-16-vol-1",
      "label": "ICAO Annex 16, Vol. I",
      "kind": "regulation",
      "body": "ICAO",
      "title": "Annex 16 to the Convention on International Civil Aviation — Environmental Protection — Volume I: Aircraft Noise",
      "edition": "8th edition (2017), with amendments",
      "date": "2017-07",
      "status": "current",
      "revision": "Amendment 15 was adopted on 2026-03-27 and applies from 2027-01-01 (new noise limits and supersonic aeroplanes); whether it changes the EPNL procedure itself has not been confirmed.",
      "url": "https://store.icao.int/en/annex-16-environmental-protection-volume-i-aircraft-noise",
      "note": "The EPNL evaluation method is in Appendix 2; guidance in ICAO Doc 9501 (Environmental Technical Manual).",
      "checked": "2026-10-06"
    },
    {
      "id": "cfr-14-part-36",
      "label": "14 CFR Part 36",
      "kind": "regulation",
      "body": "FAA",
      "title": "Noise standards: aircraft type and airworthiness certification (Appendix A: EPNL)",
      "date": "2002-07",
      "status": "current",
      "url": "https://www.ecfr.gov/current/title-14/chapter-I/subchapter-C/part-36",
      "note": "The EPNL procedure in Appendix A dates from Amendment 36-24 (2002), which harmonised it with ICAO; later amendments changed noise limits, not the calculation.",
      "checked": "2026-10-06"
    },
    {
      "id": "fidell-1974",
      "label": "Fidell et al. (1974)",
      "kind": "paper",
      "body": "paper",
      "title": "Prediction of aural detectability of noise signals",
      "date": 1974,
      "status": "published",
      "doi": "10.1177/001872087401600405",
      "citation": "Fidell, S., Pearsons, K. S., & Bennett, R. (1974). Prediction of aural detectability of noise signals. *Human Factors*, 16(4), 373–383.",
      "checked": "2026-10-06"
    },
    {
      "id": "rizzi-2025",
      "label": "Rizzi et al. (2025)",
      "kind": "paper",
      "body": "paper",
      "title": "Annoyance model assessments of urban air mobility vehicle operations",
      "date": "2025-07",
      "status": "published",
      "doi": "10.2514/1.C038188",
      "citation": "Rizzi, S. A., Christian, A. W., Letica, S. J., & Lympany, S. V. (2026). Annoyance model assessments of urban air mobility vehicle operations. *Journal of Aircraft*, 63(1). Published online 2025-07-02.",
      "note": "Journal version of the AIAA Aeroacoustics 2024 conference paper. Reviews an annoyance model that includes audibility, based on the detectability index d′, as a factor.",
      "checked": "2026-10-06"
    }
  ],
  "projects": [
    {
      "id": "sqat",
      "name": "SQAT",
      "repository": "https://github.com/ggrecow/SQAT",
      "docs": "https://github.com/ggrecow/SQAT#readme",
      "languages": [
        "MATLAB"
      ],
      "kind": "library",
      "language_note": "MATLAB only; SQAT has no Python interface of its own. pySQAT is a Python port of it, and MetaSona ports parts of it to C. Since v2.0 a graphical interface, `SQAT_GUI.m`, laid out like pySQAT's, runs the metrics without programming, still inside MATLAB.",
      "standing": "established",
      "highlight": "widely used",
      "license": "GPL-3.0-or-later",
      "license_note": "Since v2.0 (2026-10-15) the releases, like the default branch since 2026-09-15, are GPL-3.0-or-later, with BSD-3-Clause (ISO 532-1 loudness), MIT (Daniel & Weber roughness and nine utilities) and CC0-1.0 (colour maps) exceptions. Every release up to and including v1.3 is CC-BY-NC-4.0 (non-commercial) at repository level, while 21 metric files in v1.3 carry BSD-style notices and the ECMA-418-2 files say GPL-3.0.",
      "maintainers": [
        "Gil Felix Greco",
        "Roberto Merino-Martínez",
        "Alejandro Osses",
        "Mike Lotinga"
      ],
      "summary": "MATLAB toolbox for sound quality analysis that bundles most psychoacoustic metrics in one place: ISO 532-1 and ECMA-418-2 loudness, DIN 45692 sharpness, Daniel & Weber and ECMA-418-2 roughness, Osses fluctuation strength, Aures and ECMA-418-2 tonality, three psychoacoustic annoyance models (Widmann's, which SQAT also offers under its common attribution to Zwicker & Fastl; More; Di et al.) and EPNL. Every metric except the annoyance models has its own verification routine. Since v2.0 it also has a graphical interface.",
      "ai_assistance": "disclosed",
      "ai_note": "At v2.0, header comments in 44 files (24 of them in the graphical interface) say that changes or code written from August to October 2026 were assisted by Claude (Anthropic) and verified by the authors; 132 commits carry AI co-author trailers. Neither the README nor the v2.0 release notes have an AI statement.",
      "paper": {
        "citation": "Felix Greco, G., Merino-Martínez, R., Osses, A., & Langer, S. C. (2023). SQAT: a MATLAB-based toolbox for quantitative sound quality analysis. *Proceedings of INTER-NOISE 2023*, Chiba, Japan.",
        "doi": "10.3397/IN_2023_1075"
      },
      "notes": [
        "The README lists 61 studies and theses that use SQAT.",
        "v2.0 (2026-10-15) came about 330 commits after v1.3 (2025-04-04); its release notes mark the changes to the sound level meter, ISO 532-1 loudness, Daniel & Weber roughness, Aures tonality and the annoyance models as not backward compatible. Most of the metric-correctness work of August–September 2026, and the graphical interface, came from an external contributor through about 20 pull requests.",
        "The ECMA-418-2 functions come from the RefMap MATLAB code by Lotinga and Torjussen (University of Salford); the ISO 532-1 loudness was adapted in 2023 from Ella Manor's 2015 MATLAB code for AARAE.",
        "v2.0 adds a graphical interface, `SQAT_GUI.m` ([#84](https://github.com/ggrecow/SQAT/pull/84)). It loads calibrated .wav files, plays them with waveform and spectrogram, runs the sound level meter and any SQAT metric, compares files in a table of single values and exports the results. The README says every value comes from the SQAT functions, so the interface gives the same results as the code; it recommends the interface for a few files and the functions for many. The header of `SQAT_GUI.m` and the commit that added it say that its layout follows the interface of pySQAT; the commit lists a dBFS calibration field, a channel selector, a results table and the Widmann (1992) annoyance model as going beyond pySQAT.",
        "Open pull request: [#78](https://github.com/ggrecow/SQAT/pull/78) (ECMA-418-2 fluctuation strength)."
      ],
      "conventions": [
        {
          "text": "Statistics such as N5 take the nearest rank of the sorted time series, without interpolation (`get_exceeded_value`), and leave out the first `time_skip` seconds of the signal.",
          "metrics": [
            "loudness-zwicker",
            "sharpness",
            "roughness-daniel-weber",
            "fluctuation-strength-osses",
            "tonality-aures",
            "psychoacoustic-annoyance"
          ]
        },
        {
          "text": "Statistics take the nearest rank of the sorted time series, without interpolation (`get_exceeded_value`), and leave out the first `time_skip` seconds; the code enforces at least 304 ms (it cites ECMA-418-2:2025, Section 8.1.4).",
          "metrics": [
            "loudness-ecma-418-2",
            "tonality-ecma-418-2"
          ]
        },
        {
          "text": "The single value is the 90th percentile from MATLAB's `prctile`, which interpolates; the other statistics take the nearest rank (`get_exceeded_value`). The first `time_skip` seconds are left out; the code enforces at least 320 ms (it cites ECMA-418-2:2025, Section 7.1.8).",
          "metrics": [
            "roughness-ecma-418-2"
          ]
        }
      ],
      "caveats": [
        "Releases up to and including v1.3 are licensed for non-commercial use only; v2.0 is under the GPL.",
        "v2.0 is not backward compatible with v1.x. It corrects six deviations in ISO 532-1 time-varying loudness ([#48](https://github.com/ggrecow/SQAT/pull/48); test signal 10 deviated by 18.14 % in v1.3) and eight defects in Aures tonality ([#67](https://github.com/ggrecow/SQAT/issues/67)), rewrites Daniel & Weber roughness ([#65](https://github.com/ggrecow/SQAT/pull/65)), corrects the time weighting of the sound level meter ([#51](https://github.com/ggrecow/SQAT/pull/51); tone bursts with a duty cycle of 0.02 were reported 17.6 dB too low up to v1.3) and makes the annoyance calculation faster ([#42](https://github.com/ggrecow/SQAT/pull/42)). Results from v1.x and v2.0 differ.",
        "The README warns that `main` may contain changes that are not yet fully verified and recommends using a release."
      ],
      "implements": [
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "Loudness_ISO532_1",
            "Loudness_ISO532_1_from_wavfile"
          ],
          "scope": "stationary and time-varying",
          "status": "available",
          "since": "v1.0",
          "validation": "standard-data",
          "derived_from": [
            "aarae"
          ],
          "validation_details": [
            "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)."
          ],
          "note": "v2.0 corrects the time-varying procedure (PR #48) and the `time_skip` handling of the stationary procedure; results differ from v1.x."
        },
        {
          "metric": "sharpness",
          "reference": "din-45692-2009",
          "functions": [
            "Sharpness_DIN45692",
            "Sharpness_DIN45692_from_loudness",
            "Sharpness_DIN45692_from_wavfile"
          ],
          "scope": "DIN 45692 weighting, plus von Bismarck and Aures options",
          "status": "available",
          "since": "v1.0",
          "validation": "standard-data",
          "validation_details": [
            "Checked with the narrowband and broadband test signals of DIN 45692."
          ]
        },
        {
          "metric": "roughness-daniel-weber",
          "reference": "daniel-weber-1997",
          "functions": [
            "Roughness_Daniel1997",
            "Roughness_Daniel1997_from_wavfile"
          ],
          "status": "available",
          "since": "v1.0",
          "validation": "standard-data",
          "derived_from": [
            "aarae"
          ],
          "validation_details": [
            "Checked against amplitude- and frequency-modulation dependences from the literature."
          ],
          "note": "The v1.x code is AARAE's `roughnessDW.m` (Dik Hermes's code), adapted and verified for SQAT in 2023. v2.0 rewrites it (PR #65, 2026-09-08) with corrections from revised code that Dik Hermes sent to the SQAT team in 2025: 63 of 119 validation values go up and 56 down (largest change 0.155 asper)."
        },
        {
          "metric": "fluctuation-strength-osses",
          "reference": "osses-2016",
          "functions": [
            "FluctuationStrength_Osses2016",
            "FluctuationStrength_Osses2016_from_wavfile"
          ],
          "status": "available",
          "since": "v1.0",
          "validation": "standard-data",
          "derived_from": [
            "fluctuation-strength-tue"
          ],
          "derived_by_author": true,
          "validation_details": [
            "Checked against amplitude- and frequency-modulation dependences from the literature."
          ],
          "note": "Alejandro Osses's `FluctuationStrength_TUe.m` (TU/e, 2014–2016), taken into SQAT in 2020 and modified there by Osses since 2023."
        },
        {
          "metric": "tonality-aures",
          "reference": "aures-1985-euphony",
          "functions": [
            "Tonality_Aures1985",
            "Tonality_Aures1985_from_wavfile"
          ],
          "status": "available",
          "since": "v1.0",
          "validation": "standard-data",
          "validation_details": [
            "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."
          ],
          "note": "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."
        },
        {
          "metric": "psychoacoustic-annoyance",
          "reference": "zwicker-fastl-1999",
          "functions": [
            "PsychoacousticAnnoyance_Zwicker1999",
            "PsychoacousticAnnoyance_Zwicker1999_from_percentile"
          ],
          "status": "available",
          "since": "v1.0",
          "validation": "not-stated",
          "note": "Since v2.0 a wrapper of `PsychoacousticAnnoyance_Widmann1992`, which its header says will be removed in future releases."
        },
        {
          "metric": "psychoacoustic-annoyance",
          "reference": "widmann-1992",
          "functions": [
            "PsychoacousticAnnoyance_Widmann1992",
            "PsychoacousticAnnoyance_Widmann1992_from_percentile"
          ],
          "status": "available",
          "since": "v2.0",
          "validation": "not-stated",
          "note": "Added in June 2025 (PR #32); the README describes it as the same model as the Zwicker & Fastl entry under its original attribution."
        },
        {
          "metric": "psychoacoustic-annoyance",
          "reference": "more-2010",
          "functions": [
            "PsychoacousticAnnoyance_More2010",
            "PsychoacousticAnnoyance_More2010_from_percentile"
          ],
          "status": "available",
          "since": "v1.0",
          "validation": "not-stated",
          "validation_details": [
            "No verification routine (README)."
          ]
        },
        {
          "metric": "psychoacoustic-annoyance",
          "reference": "di-2016",
          "functions": [
            "PsychoacousticAnnoyance_Di2016",
            "PsychoacousticAnnoyance_Di2016_from_percentile"
          ],
          "status": "available",
          "since": "v1.0",
          "validation": "not-stated",
          "validation_details": [
            "No verification routine (README)."
          ]
        },
        {
          "metric": "epnl",
          "reference": "cfr-14-part-36",
          "functions": [
            "EPNL_FAR_Part36",
            "get_PNL",
            "get_PNLT",
            "get_Duration_Correction"
          ],
          "status": "available",
          "since": "v1.1",
          "validation": "cross-implementation",
          "compared_with": [
            "published EPNL values (Rizzi et al., 2020)"
          ],
          "validation_details": [
            "The README says that no reference implementation or test signals exist, so the verification is partial.",
            "Perceived noisiness is checked at its definition (a third-octave band of noise at 1 kHz and 40 dB SPL gives 1 noy), and the tone correction factor against Table 3.7 of ICAO Doc 9501.",
            "EPNL is cross-checked with Table 4 of Rizzi et al. (2020), AIAA 2020-2582, for 15 flyover sounds (five cases auralised by three tools): the largest difference is about 0.6 EPNdB."
          ],
          "note": "Follows Amendment 36-26 (2005)."
        },
        {
          "metric": "loudness-ecma-418-2",
          "reference": "ecma-418-2-ed3",
          "functions": [
            "Loudness_ECMA418_2",
            "LoudnessFromComp_ECMA418_2"
          ],
          "scope": "mono or two channels with binaural combination",
          "status": "available",
          "since": "v1.3",
          "validation": "cross-implementation",
          "derived_from": [
            "refmap-psychoacoustics"
          ],
          "derived_by_author": true,
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Checked against the ISO 226:2003 equal-loudness contours and against reference results from HEAD acoustics ArtemiS SUITE 15.7 (named in the source of SQAT's validation page) for a binaural recording of a train station."
          ],
          "note": "In v1.3; v2.0 follows the 4th edition."
        },
        {
          "metric": "loudness-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "Loudness_ECMA418_2",
            "LoudnessFromComp_ECMA418_2"
          ],
          "status": "available",
          "since": "v2.0",
          "validation": "cross-implementation",
          "derived_from": [
            "refmap-psychoacoustics"
          ],
          "derived_by_author": true,
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Checked for the 4th edition against the ISO 226:2003 equal-loudness contours and against reference results from HEAD acoustics ArtemiS SUITE 17.1 (named in the source of SQAT's validation page) for a binaural recording of a train station (last checked in November 2025)."
          ],
          "note": "Updated to the 4th edition in 2025."
        },
        {
          "metric": "roughness-ecma-418-2",
          "reference": "ecma-418-2-ed3",
          "functions": [
            "Roughness_ECMA418_2"
          ],
          "scope": "with binaural combination",
          "status": "available",
          "since": "v1.3",
          "validation": "cross-implementation",
          "derived_from": [
            "refmap-psychoacoustics"
          ],
          "derived_by_author": true,
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Checked for the dependence of the roughness of AM tones on modulation frequency, and against reference results from HEAD acoustics ArtemiS SUITE 15.7 (named in the source of SQAT's validation page) for a binaural recording of a train station."
          ],
          "note": "In v1.3; v2.0 follows the 4th edition."
        },
        {
          "metric": "roughness-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "Roughness_ECMA418_2"
          ],
          "status": "available",
          "since": "v2.0",
          "validation": "cross-implementation",
          "derived_from": [
            "refmap-psychoacoustics"
          ],
          "derived_by_author": true,
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Checked for the 4th edition for the dependence of the roughness of AM tones on modulation frequency, and against reference results from HEAD acoustics ArtemiS SUITE 17.1 (named in the source of SQAT's validation page) for a binaural recording of a train station."
          ],
          "note": "Amended to the 4th edition in November 2025."
        },
        {
          "metric": "tonality-ecma-418-2",
          "reference": "ecma-418-2-ed3",
          "functions": [
            "Tonality_ECMA418_2"
          ],
          "status": "available",
          "since": "v1.3",
          "validation": "cross-implementation",
          "derived_from": [
            "refmap-psychoacoustics"
          ],
          "derived_by_author": true,
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Checked against reference results from HEAD acoustics ArtemiS SUITE 15.7 (named in the source of SQAT's validation page) for a binaural recording of a train station."
          ],
          "note": "In v1.3; v2.0 follows the 4th edition."
        },
        {
          "metric": "tonality-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "Tonality_ECMA418_2"
          ],
          "status": "available",
          "since": "v2.0",
          "validation": "cross-implementation",
          "derived_from": [
            "refmap-psychoacoustics"
          ],
          "derived_by_author": true,
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Checked for the 4th edition against reference results from HEAD acoustics ArtemiS SUITE 17.1 (named in the source of SQAT's validation page) for a binaural recording of a train station.",
            "A verification against Annex B.2 (PR #79) was merged and reverted on 2026-09-21 because the Annex B values of the 2025 edition appear to be out of date."
          ]
        },
        {
          "metric": "fluctuation-strength-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "FluctuationStrength_ECMA418_2"
          ],
          "status": "proposed",
          "link": "https://github.com/ggrecow/SQAT/pull/78",
          "validation": "not-stated",
          "note": "Open pull request since 2026-09-17."
        }
      ],
      "cite": {
        "text": "The README asks for the toolbox itself: Felix Greco, G., Merino-Martínez, R., Osses, A., & Lotinga, M. J. B. (2026). *SQAT: a sound quality analysis toolbox for MATLAB*. Zenodo. It recommends citing the specific version used, since results differ between releases; each release has its own DOI (for v2.0, `citation.cff` gives 10.5281/zenodo.23387628). The paper above describes the first release.",
        "doi": "10.5281/zenodo.7934709",
        "cff": "https://github.com/ggrecow/SQAT/blob/main/citation.cff"
      },
      "sources": [
        "https://github.com/ggrecow/SQAT/blob/main/README.md",
        "https://github.com/ggrecow/SQAT/blob/main/LICENSE",
        "https://github.com/ggrecow/SQAT/blob/main/citation.cff",
        "https://github.com/ggrecow/SQAT/releases",
        "https://github.com/ggrecow/SQAT/releases/tag/v2.0",
        "https://github.com/ggrecow/SQAT/issues/67",
        "https://github.com/ggrecow/SQAT/pull/48",
        "https://github.com/ggrecow/SQAT/pull/65",
        "https://github.com/ggrecow/SQAT/pull/78",
        "https://github.com/ggrecow/SQAT/pull/79",
        "https://github.com/ggrecow/SQAT/tree/v2.0/validation",
        "https://github.com/ggrecow/SQAT/blob/v2.0/validation/Loudness_ISO532_1/2_synthetic_signals_time_varying_loudness/README.md",
        "https://github.com/ggrecow/SQAT/blob/v2.0/validation/Tonality_Aures1985/README.md",
        "https://github.com/ggrecow/SQAT/blob/v2.0/validation/sound_level_meter/README.md",
        "https://github.com/ggrecow/SQAT/tree/main/validation/EPNL_FAR_Part36",
        "https://github.com/ggrecow/SQAT/tree/v1.3/validation",
        "https://github.com/ggrecow/SQAT/blob/main/psychoacoustic_metrics/FluctuationStrength_Osses2016/FluctuationStrength_Osses2016.m",
        "https://github.com/ggrecow/SQAT/blob/v2.0/psychoacoustic_metrics/Roughness_Daniel1997/Roughness_Daniel1997.m",
        "https://github.com/ggrecow/SQAT/blob/v2.0/psychoacoustic_metrics/PsychoacousticAnnoyance_Zwicker1999/PsychoacousticAnnoyance_Zwicker1999.m",
        "https://github.com/ggrecow/SQAT/blob/v2.0/gui/SQAT_GUI.m",
        "https://github.com/ggrecow/SQAT/pull/84"
      ],
      "checked": "2026-10-19",
      "url": "https://zhenxianli.github.io/LISQM/projects/sqat.html",
      "last_commit": "2026-10-15",
      "latest_release": {
        "version": "v2.0",
        "date": "2026-10-15",
        "source": "GitHub release"
      },
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": 100,
      "group": "established"
    },
    {
      "id": "mosqito",
      "name": "MoSQITo",
      "repository": "https://github.com/Eomys/MoSQITo",
      "docs": "https://mosqito.readthedocs.io/en/latest/",
      "languages": [
        "Python"
      ],
      "kind": "library",
      "standing": "established",
      "highlight": "widely used",
      "license": "Apache-2.0",
      "packages": [
        {
          "registry": "pypi",
          "name": "mosqito"
        }
      ],
      "install": "pip install mosqito",
      "maintainers": [
        "Eomys / Green Forge Coop"
      ],
      "contributors": [
        "Daniel Jiménez-Caminero Costa"
      ],
      "summary": "Python library for sound quality metrics: ISO 532-1 loudness, DIN 45692 sharpness, Daniel & Weber roughness, ECMA-418-2 hearing-model loudness (Clause 5) and roughness (2nd edition), tone-to-noise and prominence ratios, and the speech intelligibility index. Widely used, but without a release or a commit since April 2024.",
      "ai_assistance": "not-stated",
      "paper": {
        "citation": "San Millán-Castillo, R., Latorre-Iglesias, E., Glesser, M., Wanty, S., Jiménez-Caminero, D., & Álvarez-Jimeno, J. M. (2021). MOSQITO: an open-source and free toolbox for sound quality metrics in the industry and education. *INTER-NOISE 2021*, INCE Conference Proceedings 263(5), 1164–1175.",
        "doi": "10.3397/IN-2021-1767"
      },
      "notes": [
        "Started by EOMYS in 2020. The default branch is `master`; its last commit and the last release (1.2.1) are both from 2024-04-22.",
        "The documentation lists Soundscapy as a user; several other projects (PsychoBox, Sonemeter and others) wrap it.",
        "Also computes the ANSI S3.5 speech intelligibility index (`sii_ansi`), which is outside the scope of this list.",
        "Open, unanswered pull requests add Aures tonality ([#97](https://github.com/Eomys/MoSQITo/pull/97), 2026), ECMA-418-2 roughness fixes ([#95](https://github.com/Eomys/MoSQITo/pull/95), 2026) and an ISO 1996-2 Annex K tone detector ([#52](https://github.com/Eomys/MoSQITo/pull/52), 2022).",
        "A C#/.NET port, Mosqito.NET, is listed separately; it was announced in issue [#98](https://github.com/Eomys/MoSQITo/issues/98).",
        "The documentation lists hearing-model tonality (citing ECMA-74) as under development; there is no function for it."
      ],
      "caveats": [
        "No maintainer has answered issues or pull requests opened since 2024, including bug reports on TNR/PR (#80, #81, #99) and on the ECMA-418-2 roughness low-pass filter (#92, #95).",
        "`import mosqito` fails when matplotlib is not installed, because it is imported but not declared as a dependency ([#100](https://github.com/Eomys/MoSQITo/issues/100)); install matplotlib yourself.",
        "Its ECMA-418-2 functions follow the 2nd edition (2022), two editions behind the current one."
      ],
      "implements": [
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "loudness_zwst",
            "loudness_zwst_perseg",
            "loudness_zwst_freq",
            "loudness_zwtv"
          ],
          "scope": "stationary (also per segment and from a spectrum) and time-varying",
          "status": "available",
          "since": "1.0.0",
          "validation": "standard-data",
          "validation_scope": "outcome not stated",
          "derived_from": [
            "BASIC program of DIN 45631 (Zwicker et al., 1991)"
          ],
          "validation_details": [
            "Validation scripts use the ISO 532-1 Annex B test signals; the documentation marks it as validated."
          ],
          "conventions": [
            "Signals sampled below 48 kHz are resampled to 48 kHz (FFT method) with a warning; time-varying loudness rejects rates above 48 kHz."
          ]
        },
        {
          "metric": "loudness-ecma-418-2",
          "reference": "ecma-418-2-ed2",
          "functions": [
            "loudness_ecma"
          ],
          "scope": "Clause 5 hearing-model specific and total loudness only; the Clause 8 loudness added in the 2nd edition is not implemented",
          "status": "available",
          "since": "1.2.0",
          "validation": "standard-data",
          "validation_scope": "outcome not stated",
          "validation_details": [
            "Validation scripts compare with figures of the standard."
          ],
          "note": "Followed the 1st edition (2020) in versions 1.0.0–1.1.1 and the 2nd edition (2022) from 1.2.0. It grew out of the hearing model that Daniel Jiménez-Caminero added in May 2021, which is also kept in MoSQITo-FDP."
        },
        {
          "metric": "sharpness",
          "reference": "din-45692-2009",
          "functions": [
            "sharpness_din_st",
            "sharpness_din_tv",
            "sharpness_din_perseg",
            "sharpness_din_from_loudness",
            "sharpness_din_freq"
          ],
          "scope": "weightings: DIN 45692, Aures, von Bismarck, Fastl",
          "status": "available",
          "since": "1.0.2",
          "validation": "standard-data",
          "validation_scope": "outcome not stated",
          "validation_details": [
            "Validation scripts use the DIN 45692 test signals; the documentation marks it as validated."
          ]
        },
        {
          "metric": "roughness-daniel-weber",
          "reference": "daniel-weber-1997",
          "functions": [
            "roughness_dw",
            "roughness_dw_freq"
          ],
          "status": "available",
          "since": "1.0.0",
          "validation": "standard-data",
          "validation_scope": "outcome not stated",
          "validation_details": [
            "The documentation marks it as validated against reference data."
          ]
        },
        {
          "metric": "roughness-ecma-418-2",
          "reference": "ecma-418-2-ed2",
          "functions": [
            "roughness_ecma"
          ],
          "status": "available",
          "since": "1.2.0",
          "validation": "standard-data",
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "A unit test checks the standard's reference signal (1 kHz tone, 100 % amplitude-modulated at 70 Hz, 60 dB), which should give 1 asper, within ±0.1 asper.",
            "A validation script compares the specific roughness of amplitude-modulated tones (carriers from 125 Hz to 4 kHz, 65 dB) with values computed in HEAD acoustics ArtemiS SUITE, within ±10 %."
          ],
          "note": "The documentation still lists it as under development. An open pull request (#95) fixes the low-pass filter range, which caused discrepancies with SQAT for time-varying signals."
        },
        {
          "metric": "tone-to-noise-prominence-ratio",
          "reference": "ecma-74-ed17",
          "functions": [
            "tnr_ecma_st",
            "tnr_ecma_perseg",
            "tnr_ecma_freq",
            "pr_ecma_st",
            "pr_ecma_perseg",
            "pr_ecma_freq"
          ],
          "status": "available",
          "since": "1.0.2",
          "validation": "not-stated",
          "validation_details": [
            "The documentation marks it as available but not validated."
          ],
          "note": "Docstrings say \"ECMA 418-1\" without an edition; the helper code and the bibliography cite ECMA-74 Annex D (17th edition, 2019)."
        },
        {
          "metric": "equal-loudness-contours",
          "reference": "iso-226-2003",
          "functions": [
            "equal_loudness_contours"
          ],
          "status": "available",
          "since": "0.3.5",
          "validation": "not-stated",
          "note": "The docstring gives no edition; it is based on Jeff Tackett's MATLAB code for ISO 226:2003."
        },
        {
          "metric": "tonality-aures",
          "reference": "aures-1985-euphony",
          "status": "proposed",
          "link": "https://github.com/Eomys/MoSQITo/pull/97",
          "validation": "not-stated",
          "note": "Pull request from April 2026 following the improved Aures metric of Estreder et al. (2023); no maintainer reply."
        },
        {
          "metric": "tonal-audibility-iso-1996-2",
          "reference": "iso-1996-2-2017",
          "scope": "Annex K prominent-tone detection",
          "status": "proposed",
          "link": "https://github.com/Eomys/MoSQITo/pull/52",
          "validation": "not-stated",
          "note": "Pull request from May 2022; no maintainer reply."
        }
      ],
      "cite": {
        "doi": "10.5281/zenodo.11026796",
        "cff": "https://github.com/Eomys/MoSQITo/blob/master/CITATION.cff"
      },
      "sources": [
        "https://github.com/Eomys/MoSQITo/blob/master/README.md",
        "https://github.com/Eomys/MoSQITo/blob/master/docs/source/user_guide/scope.rst",
        "https://github.com/Eomys/MoSQITo/tree/master/validations",
        "https://github.com/Eomys/MoSQITo/blob/master/tests/sq_metrics/roughness/test_roughness_ecma.py",
        "https://github.com/Eomys/MoSQITo/blob/master/CITATION.cff",
        "https://pypi.org/project/mosqito/",
        "https://github.com/Eomys/MoSQITo/issues/100",
        "https://github.com/Eomys/MoSQITo/pull/95",
        "https://github.com/Eomys/MoSQITo/pull/97",
        "https://github.com/Eomys/MoSQITo/blob/master/mosqito/sq_metrics/loudness/loudness_zwst/_main_loudness.py",
        "https://github.com/Eomys/MoSQITo/commit/04dab16b64041c820c08177aa74039fb3fc3ed20"
      ],
      "checked": "2026-10-08",
      "url": "https://zhenxianli.github.io/LISQM/projects/mosqito.html",
      "last_commit": "2024-04-22",
      "latest_release": {
        "version": "v1.2.1",
        "date": "2024-04-22",
        "source": "GitHub release"
      },
      "prerelease": null,
      "activity": "inactive",
      "archived": false,
      "stars": 178,
      "group": "established"
    },
    {
      "id": "sottek-hearing-model",
      "name": "sottek-hearing-model",
      "repository": "https://github.com/mlotinga/sottek-hearing-model",
      "languages": [
        "Python"
      ],
      "kind": "library",
      "based_on": "refmap-psychoacoustics",
      "language_note": "Needs Python 3.11 or newer. Translated from the MATLAB code used in SQAT and RefMap.",
      "standing": "established",
      "highlight": "a very good implementation",
      "license": "GPL-3.0-only",
      "license_note": "The LICENSE file has always been GPL-3.0 and the project metadata was changed to GPL-3.0-only on 2026-08-31; the metadata of the current PyPI release (0.1.14) still says AGPL-3.0-only.",
      "packages": [
        {
          "registry": "pypi",
          "name": "sottek-hearing-model"
        }
      ],
      "install": "pip install sottek-hearing-model",
      "maintainers": [
        "Mike Lotinga"
      ],
      "summary": "Python implementation of the ECMA-418-2:2025 (4th edition) Sottek Hearing Model metrics: loudness and roughness (with binaural combination), tonality (per channel), and fluctuation strength on the main branch. Translated from the MATLAB code used in SQAT and the RefMap project.",
      "ai_assistance": "not-stated",
      "paper": {
        "citation": "Lotinga, M. J. B., Torjussen, M., & Felix Greco, G. (2025). Verified implementations of the Sottek psychoacoustic Hearing Model standardised sound quality metrics (ECMA-418-2 loudness, tonality and roughness). *Forum Acusticum / Euronoise 2025*, Málaga.",
        "doi": "10.61782/fa.2025.0951"
      },
      "notes": [
        "The paper verifies the MATLAB implementations of the 3rd edition, from which this package was translated; it does not cover the Python package itself.",
        "Maintained by one person at the University of Salford (RefMap project). Requires Python 3.11 or newer.",
        "pySQAT calls this package for its ECMA-418-2 metrics."
      ],
      "maintainer_check": "In personal use, Zhenxian LI found its results in very good agreement with those of HEAD acoustics ArtemiS SUITE. This is a personal check, not a published comparison.",
      "conventions": [
        "Input at other sample rates is resampled to 48 kHz.",
        {
          "text": "Overall roughness and fluctuation strength are 90th percentiles computed with NumPy (linear interpolation, Hyndman–Fan type 7). The MATLAB code it was translated from uses `prctile`, which interpolates differently, so single values can differ slightly from RefMap and SQAT.",
          "metrics": [
            "roughness-ecma-418-2",
            "fluctuation-strength-ecma-418-2"
          ]
        }
      ],
      "caveats": [
        "Fluctuation strength is only on the main branch (not on PyPI yet) and its verification report is marked as a draft.",
        "Versions up to 0.1.13 are affected by an empty-array bug fixed in 0.1.14 ([#9](https://github.com/mlotinga/sottek-hearing-model/issues/9))."
      ],
      "implements": [
        {
          "metric": "loudness-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "shm_loudness_ecma",
            "shm_loudness_ecma_from_comp"
          ],
          "scope": "mono or stereo, with combined binaural output",
          "status": "available",
          "since": "0.1.9",
          "validation": "standard-data",
          "validation_scope": "calibration signals and one recording",
          "derived_by_author": true,
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Unit tests check the standard's calibration signals (1 kHz, 40 dB gives 1 sone_HMS).",
            "RefMap's verification compared the Python code, before it became this package, and the MATLAB original with HEAD acoustics ArtemiS v17.1 for the two calibration signals and a 30 s binaural street recording."
          ]
        },
        {
          "metric": "tonality-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "shm_tonality_ecma"
          ],
          "status": "available",
          "since": "0.1.9",
          "validation": "standard-data",
          "validation_scope": "reference signal and one recording",
          "derived_by_author": true,
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Unit tests check the standard's reference signal, which should give 1 tu_HMS, at 48 and 44.1 kHz.",
            "RefMap's verification against ArtemiS v17.1, as for loudness."
          ],
          "note": "Optional experimental tonal-annoyance weighting (Sottek & Becker, 2019) since 0.1.14."
        },
        {
          "metric": "roughness-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "shm_roughness_ecma"
          ],
          "scope": "with combined binaural output",
          "status": "available",
          "since": "0.1.9",
          "validation": "standard-data",
          "validation_scope": "reference signal and one recording",
          "derived_by_author": true,
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Unit tests check the standard's reference signal, which should give 1 asper_HMS, at 48 and 44.1 kHz.",
            "RefMap's verification against ArtemiS v17.1, as for loudness."
          ]
        },
        {
          "metric": "fluctuation-strength-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "shm_fluctuation_ecma"
          ],
          "scope": "needs at least 1.37 s of signal; binaural option",
          "status": "unreleased",
          "validation": "cross-implementation",
          "derived_by_author": true,
          "compared_with": [
            "refmap-psychoacoustics",
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "A draft report (18 September 2026) compares it with `acousticSHMFluctuation.m`, the MATLAB code it was translated from: equal to floating-point precision on the synthetic signals and on one channel of each recording, with a small difference in a short time window on the other channel.",
            "Against HEAD acoustics ArtemiS SUITE v17: 0.994 against 1.003 vacil_HMS for the calibration signal (the standard's target is 1.0), −8 % to +12 % for the overall values of three binaural recordings, and correlations of 0.91 to 0.998 for the time-dependent values."
          ],
          "note": "Merged on 2026-09-18. Five departures from the printed text are documented (four equations and one interpretation of Section 9.1.8)."
        }
      ],
      "cite": {
        "text": "The README asks for the paper above, which published the MATLAB code the package was translated from, and gives a BibTeX entry for it."
      },
      "sources": [
        "https://github.com/mlotinga/sottek-hearing-model/blob/main/README.md",
        "https://github.com/mlotinga/sottek-hearing-model/blob/main/LICENSE",
        "https://github.com/mlotinga/sottek-hearing-model/blob/main/docs/validation/fluctuation_strength_verification.md",
        "https://pypi.org/project/sottek-hearing-model/",
        "https://github.com/mlotinga/sottek-hearing-model/issues/9",
        "https://github.com/mlotinga/sottek-hearing-model/tree/main/tests",
        "https://github.com/acoustics-code-salford/refmap-psychoacoustics/blob/main/validation/ECMA-418-2/README.md"
      ],
      "checked": "2026-10-08",
      "url": "https://zhenxianli.github.io/LISQM/projects/sottek-hearing-model.html",
      "last_commit": "2026-09-18",
      "latest_release": {
        "version": "v0.1.14",
        "date": "2026-03-13",
        "source": "GitHub release"
      },
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": 23,
      "group": "established"
    },
    {
      "id": "acoustic-toolbox",
      "name": "acoustic-toolbox",
      "repository": "https://github.com/Universite-Gustave-Eiffel/acoustic-toolbox",
      "docs": "https://acoustic-toolbox.readthedocs.io/",
      "languages": [
        "Python"
      ],
      "based_on": "python-acoustics",
      "kind": "library",
      "standing": "established",
      "license": "BSD-3-Clause",
      "maintainers": [
        "Valentin Le Bescond",
        "Andrew Mitchell"
      ],
      "packages": [
        {
          "registry": "pypi",
          "name": "acoustic-toolbox"
        }
      ],
      "install": "pip install acoustic-toolbox",
      "summary": "Python acoustics library under the Université Gustave Eiffel GitHub organisation, continuing python-acoustics. For this list it is relevant for its tonal audibility and tonal adjustment after ISO 1996-2:2007.",
      "ai_assistance": "not-stated",
      "notes": [
        "Based on python-acoustics (per the README) and keeps its git history; development under the new name started in July 2024.",
        "It has no loudness, sharpness or roughness modules."
      ],
      "caveats": [
        "It follows ISO 1996-2:2007, which has been withdrawn; ISO 1996-2:2017 replaced its tonal audibility method with those of Annexes J and K."
      ],
      "implements": [
        {
          "metric": "tonal-audibility-iso-1996-2",
          "reference": "iso-1996-2-2007",
          "functions": [
            "Tonality",
            "tonal_audibility",
            "tonal_adjustment"
          ],
          "scope": "tonal audibility and tonal adjustment",
          "status": "available",
          "validation": "self-tests",
          "validation_details": [
            "As in python-acoustics, the test of the examples in the standard is commented out."
          ],
          "derived_from": [
            "python-acoustics"
          ],
          "note": "Module `acoustic_toolbox.standards.iso_1996_2_2007`, the same code lineage as python-acoustics."
        }
      ],
      "sources": [
        "https://github.com/Universite-Gustave-Eiffel/acoustic-toolbox",
        "https://github.com/Universite-Gustave-Eiffel/acoustic-toolbox/blob/main/README.md",
        "https://github.com/Universite-Gustave-Eiffel/acoustic-toolbox/blob/main/acoustic_toolbox/standards/iso_1996_2_2007.py",
        "https://pypi.org/project/acoustic-toolbox/",
        "https://github.com/Universite-Gustave-Eiffel/acoustic-toolbox/blob/main/pyproject.toml",
        "https://github.com/Universite-Gustave-Eiffel/acoustic-toolbox/blob/main/LICENSE",
        "https://github.com/Universite-Gustave-Eiffel/acoustic-toolbox/commit/5acd2a101b730b3bb740f38c678d4b2f066beaae"
      ],
      "checked": "2026-10-08",
      "url": "https://zhenxianli.github.io/LISQM/projects/acoustic-toolbox.html",
      "last_commit": "2026-02-12",
      "latest_release": {
        "version": "v0.2.2",
        "date": "2026-01-26",
        "source": "GitHub release"
      },
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": 30,
      "group": "established"
    },
    {
      "id": "amt",
      "name": "AMT",
      "full_name": "Auditory Modeling Toolbox",
      "repository": "https://sourceforge.net/p/amtoolbox/code/",
      "homepage": "https://amtoolbox.org",
      "languages": [
        "MATLAB",
        "Octave"
      ],
      "kind": "library",
      "language_note": "Runs in MATLAB and in GNU Octave. torch_amt and NumpyLibforPsychoAcoustic port some of its loudness models to Python.",
      "standing": "established",
      "standing_note": "A widely used toolbox for auditory modelling that also includes some psychoacoustic functions.",
      "license": "GPL-3.0",
      "license_note": "SourceForge lists the licence as GPLv3. The COPYING file of release 1.6.0 says that most files are under GPL 3.0 and some under other licences, each file stating its own; the headers of the loudness models (`moore1997`, `glasberg2002`, `moore2016`) allow version 3 or any later version.",
      "maintainers": [
        "AMT Team, Acoustics Research Institute (Austrian Academy of Sciences)"
      ],
      "packages": [
        {
          "registry": "other",
          "name": "amtoolbox",
          "url": "https://sourceforge.net/projects/amtoolbox/files/"
        }
      ],
      "summary": "MATLAB/Octave toolbox of auditory models for reproducible research. Its loudness models include the Moore–Glasberg models for stationary sounds (`moore1997`, `chen2011`), time-varying sounds (`glasberg2002`) and binaural loudness (`moore2016`).",
      "ai_assistance": "not-stated",
      "paper": {
        "citation": "Majdak, P., Hollomey, C., & Baumgartner, R. (2022). AMT 1.x: A toolbox for reproducible research in auditory modeling. *Acta Acustica*, 6, 19.",
        "doi": "10.1051/aacus/2022011"
      },
      "notes": [
        "Releases are published as downloads on SourceForge (`amtoolbox` and `amtoolbox-full`); the git repository's default branch is `develop`. The SourceForge project page mentions no GitHub or GitLab mirror.",
        "Also contains `bramslow2004`, a loudness model considering hearing loss (AUDMOD), with the experiment script `exp_bramslow2004`; it has no reference entry in this list.",
        "Neither the develop branch nor release 1.6.0 has a roughness, fluctuation strength, sharpness, tonality or annoyance model (`osses2021` is a monaural perceptual-similarity model).",
        "Python ports of some of its loudness models exist: [torch_amt](https://github.com/StefanoGiacomelli/torch_amt) (`glasberg2002`, `moore2016`) and [NumpyLibforPsychoAcoustic](https://github.com/Ryrybros/NumpyLibforPsychoAcoustic) (`moore1997`, `glasberg2002`). There is no official Python package (amtoolbox and pyamtoolbox are not on PyPI).",
        "The validation entries rest on AMT's design: each `exp_…` script is meant to reproduce figures of the model paper. The scripts' output was not checked for this list."
      ],
      "implements": [
        {
          "metric": "loudness-moore-glasberg",
          "reference": "moore-1997",
          "functions": [
            "moore1997"
          ],
          "status": "available",
          "validation": "standard-data",
          "validation_details": [
            "AMT's experiment scripts (`exp_…`) reproduce published results; this model has `exp_moore1997`."
          ],
          "note": "Listed as \"MOORE1997 - Loudness model for stationary signals\" in models/Contents.m."
        },
        {
          "metric": "loudness-moore-glasberg",
          "reference": "chen-2011",
          "functions": [
            "chen2011"
          ],
          "status": "available",
          "validation": "standard-data",
          "validation_details": [
            "Has the experiment script `exp_chen2011`; AMT's experiment scripts reproduce the results of the publication they are named after."
          ],
          "note": "Listed as \"CHEN2011 - Fast excitation pattern estimation\"."
        },
        {
          "metric": "loudness-moore-glasberg-time-varying",
          "reference": "glasberg-moore-2002",
          "functions": [
            "glasberg2002"
          ],
          "status": "available",
          "validation": "standard-data",
          "validation_details": [
            "Has the experiment script `exp_glasberg2002`; AMT's experiment scripts reproduce the results of the publication they are named after."
          ],
          "note": "Listed as \"GLASBERG2002 - Loudness model for time-variant signals\"."
        },
        {
          "metric": "loudness-moore-glasberg-time-varying",
          "reference": "moore-2016",
          "functions": [
            "moore2016"
          ],
          "scope": "binaural",
          "status": "available",
          "validation": "not-stated",
          "validation_details": [
            "There is no `exp_moore2016` experiment script on the develop branch."
          ],
          "note": "Listed as \"MOORE2016 - Binaural loudness model\". The header says Josef Schlittenlacher provided the original implementation for the AMT in 2018, from code written for ANSI S3.4-2007 and ISO 532-2:2017."
        }
      ],
      "sources": [
        "https://sourceforge.net/projects/amtoolbox/",
        "https://sourceforge.net/projects/amtoolbox/files/",
        "https://sourceforge.net/p/amtoolbox/code/ci/develop/tree/models/",
        "https://sourceforge.net/p/amtoolbox/code/ci/1.6.0/tree/models/",
        "https://sourceforge.net/p/amtoolbox/code/ci/develop/tree/experiments/",
        "https://sourceforge.net/p/amtoolbox/code/ci/develop/log/",
        "https://github.com/StefanoGiacomelli/torch_amt/blob/main/README.md",
        "https://sourceforge.net/projects/amtoolbox/files/AMT%201.x/"
      ],
      "checked": "2026-10-08",
      "url": "https://zhenxianli.github.io/LISQM/projects/amt.html",
      "last_commit": "2026-06-14",
      "latest_release": {
        "version": "1.6.0",
        "date": "2024-10-01",
        "source": ""
      },
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": null,
      "group": "established"
    },
    {
      "id": "refmap-psychoacoustics",
      "name": "refmap-psychoacoustics",
      "repository": "https://github.com/acoustics-code-salford/refmap-psychoacoustics",
      "languages": [
        "MATLAB",
        "Python"
      ],
      "kind": "research-code",
      "language_note": "MATLAB code with Python ports in the same repository. The Python port of its ECMA-418-2 code is published separately as sottek-hearing-model.",
      "standing": "established",
      "license": "GPL-3.0",
      "license_note": "The licences disagree: the LICENSE file holds the GPL-3.0 text, while pyproject.toml declares \"AGPL-3.0-only\". Neither says whether later GPL versions are allowed.",
      "maintainers": [
        "Mike Lotinga"
      ],
      "summary": "Research code of the REFMAP project at the University of Salford, in MATLAB with Python ports. Implements ECMA-418-2:2025 loudness, tonality and roughness, and also sharpness, impulsiveness, psychoacoustic annoyance and aural detectability models.",
      "ai_assistance": "not-stated",
      "paper": {
        "citation": "Lotinga, M. J. B., Torjussen, M., & Felix Greco, G. (2025). Verified implementations of the Sottek psychoacoustic Hearing Model standardised sound quality metrics (ECMA-418-2 loudness, tonality and roughness). *Forum Acusticum / Euronoise 2025*, Málaga.",
        "doi": "10.61782/fa.2025.0951"
      },
      "notes": [
        "Its MATLAB ECMA-418-2 code is the origin of SQAT's ECMA-418-2 functions, of the Python package sottek-hearing-model, and through SQAT of MetaSona's ECMA-418-2 kernels. The Python functions `shm_loudness_ecma`, `shm_tonality_ecma` and `shm_roughness_ecma` in this repository import parts of the sottek-hearing-model package, so they are listed under that package rather than here.",
        "The Python package defined in pyproject.toml (refmap-psychoacoustics 0.1.0) is not on PyPI.",
        "Tonality has an optional tonal annoyance weighting after Sottek & Becker (2019), which is not part of ECMA-418-2.",
        "Further metrics without an entry in this list: partial loudness and partial tonality of a target in a masker (\"based on ECMA-418-2:2025\", an extension of the standard), quasi-loudness from the spectral elements of ISO 532-1 with optional ISO 532-3:2023 or ECMA-418-2:2025 ear filters, tonal sharpness, and impulsiveness after Willemsen & Rao (2010) from ISO 532-1:2017 or ECMA-418-2:2025 loudness.",
        "The Python code also has annoyance models after Willemsen et al. (2010), Torija et al. (2022) and Boucher et al. (2024), which have no reference entry in this list.",
        "Also contains listening-test apps and analysis notebooks.",
        "sottek-hearing-model's fluctuation strength was translated from `acousticSHMFluctuation.m`, which its verification report places in this repository; the file is not on the `main` branch (checked 2026-10-07)."
      ],
      "caveats": [
        "The README calls it \"'work in progress' code for a research project. It is not a completed package or code library.\"",
        "Some code comments still cite clauses of \"ECMA 418-2:2022\"."
      ],
      "implements": [
        {
          "metric": "loudness-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "acousticSHMLoudness",
            "acousticSHMLoudnessFromComponent"
          ],
          "scope": "binaural and specific loudness",
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "MATLAB and Python verified against HEAD acoustics ArtemiS v17.1 for a 1 kHz tone at 40 dB SPL, a 1 kHz tone amplitude-modulated at 70 Hz at 60 dB SPL and a 30 s binaural street recording.",
            "The audio and reference results are on Zenodo (doi:10.5281/zenodo.18849587)."
          ]
        },
        {
          "metric": "tonality-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "acousticSHMTonality"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Verified against HEAD acoustics ArtemiS v17.1 with the same three signals as loudness."
          ]
        },
        {
          "metric": "roughness-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "acousticSHMRoughness"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "Verified against HEAD acoustics ArtemiS v17.1 with the same three signals as loudness."
          ]
        },
        {
          "metric": "sharpness",
          "reference": "din-45692-2009",
          "functions": [
            "acousticSharpnessSHM",
            "acousticSharpFromSHMLoud"
          ],
          "scope": "DIN 45692 weighting applied to ECMA-418-2 loudness",
          "status": "available",
          "validation": "not-stated",
          "note": "The DIN 45692 weighting is the option `widmann`; Aures (the default) and von Bismarck weightings are also offered. DIN 45692 itself is defined on Zwicker specific loudness. A further variant works from a Zwicker-based quasi-loudness (`acousticSharpFromQuasiLoud`). An inaccuracy in the Aures weighting was fixed on 2026-09-18."
        },
        {
          "metric": "psychoacoustic-annoyance",
          "reference": "widmann-1992",
          "functions": [
            "acousticPsychAnnoy",
            "widmannPA"
          ],
          "status": "available",
          "validation": "standard-data",
          "validation_details": [
            "A validation script (`validation/metrics/mlab/acousticPsychAnnoyValidation.m`) compares the MATLAB version with values from Widmann (1992)."
          ],
          "note": "The MATLAB header names the model Widmann (1992), \"commonly misattributed to Zwicker\". The Python `widmannPA` takes precomputed metric values."
        },
        {
          "metric": "psychoacoustic-annoyance",
          "reference": "more-2010",
          "functions": [
            "morePA"
          ],
          "scope": "Python, from precomputed metric values",
          "status": "available",
          "validation": "not-stated"
        },
        {
          "metric": "psychoacoustic-annoyance",
          "reference": "di-2016",
          "functions": [
            "diPA"
          ],
          "scope": "Python, from precomputed metric values",
          "status": "available",
          "validation": "not-stated"
        },
        {
          "metric": "aural-detectability",
          "reference": "fidell-1974",
          "functions": [
            "auralDetectability",
            "auralDetectFromLeq",
            "aural_detect",
            "aural_detect_from_lzeqt"
          ],
          "scope": "MATLAB and Python",
          "status": "available",
          "validation": "not-stated",
          "note": "Code headers describe the Fidell, Pearsons & Bennett (1974) model as \"developed further by NASA\" and cite \"Rizzi, SA et al, 2024\"; the README cites Rizzi et al. (2025), *Journal of Aircraft*, doi:10.2514/1.C038188."
        },
        {
          "metric": "aural-detectability",
          "reference": "rizzi-2025",
          "functions": [
            "auralDetectability",
            "aural_detect"
          ],
          "scope": "MATLAB and Python",
          "status": "available",
          "validation": "not-stated",
          "note": "The same functions; the README cites this paper for the NASA development of the model."
        }
      ],
      "cite": {
        "text": "The README asks for \"Lotinga, M.J.B. (2026). refmap-psychoacoustics. GitHub.\" with the repository URL; the ECMA-418-2 code is described in the paper above.",
        "cff": "https://github.com/acoustics-code-salford/refmap-psychoacoustics/blob/main/citation.cff"
      },
      "sources": [
        "https://github.com/acoustics-code-salford/refmap-psychoacoustics",
        "https://github.com/acoustics-code-salford/refmap-psychoacoustics/blob/main/README.md",
        "https://github.com/acoustics-code-salford/refmap-psychoacoustics/blob/main/validation/ECMA-418-2/README.md",
        "https://github.com/acoustics-code-salford/refmap-psychoacoustics/blob/main/pyproject.toml",
        "https://github.com/acoustics-code-salford/refmap-psychoacoustics/blob/main/LICENSE",
        "https://doi.org/10.5281/zenodo.18849587",
        "https://pypi.org/project/sottek-hearing-model/"
      ],
      "checked": "2026-10-07",
      "url": "https://zhenxianli.github.io/LISQM/projects/refmap-psychoacoustics.html",
      "last_commit": "2026-10-14",
      "latest_release": null,
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": 23,
      "group": "established"
    },
    {
      "id": "aarae",
      "name": "AARAE",
      "repository": "https://github.com/densilcabrera/aarae",
      "languages": [
        "MATLAB"
      ],
      "kind": "application",
      "standing": "established",
      "license": "BSD-3-Clause",
      "license_note": "`License for AARAE.txt` says that contributed files may carry their own licences; for example, the ISO 226 calculator `iso226.m` comes with its own `license.txt`.",
      "maintainers": [
        "Densil Cabrera",
        "Jonothan Holmes",
        "Ella Manor"
      ],
      "summary": "Audio and Acoustical Response Analysis Environment: a MATLAB environment with a graphical interface, made to support teaching and research in acoustics. Its analysers include ISO 532-1 and Chalupper–Fastl loudness, Moore–Glasberg loudness (stationary, time-varying and binaural), sharpness and Daniel & Weber roughness.",
      "ai_assistance": "not-stated",
      "paper": {
        "citation": "Cabrera, D., Jimenez, D., & Martens, W. L. (2014). Audio and Acoustical Response Analysis Environment (AARAE): a tool to support education and research in acoustics. *Proceedings of Inter-Noise 2014*, Melbourne, Australia.",
        "url": "https://www.acoustics.asn.au/conference_proceedings/INTERNOISE2014/papers/p235.pdf"
      },
      "notes": [
        "`LoudnessZwickerISO532.m` computes Zwicker loudness with the ISO 532 one-third-octave filter bank; the edition is not stated.",
        "`Fluctuation.m` (Ella Manor, 2017) implements the fluctuation-strength model of Zhou et al., \"A Model for Calculating Psychoacoustical Fluctuation Strength\" (JAES, September 2015), with 75 ERB channels and generalized modulation depth.",
        "`Tonality_thirdoctmethod.m` (May 2015) implements the one-third-octave tonality methods of ISO 1996-2 (edition not stated) and AS/NZS 2107.",
        "`iso226.m` calculates ISO 226 equal-loudness contours; the edition is not stated in its header."
      ],
      "caveats": [
        "Runs inside MATLAB and needs several commercial toolboxes: Audio, DSP System, Signal Processing, and Statistics and Machine Learning; some parts also use others, such as Curve Fitting.",
        "Apart from the ISO 532-1 analyser, the project does not state how the analysers were validated."
      ],
      "implements": [
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "Loudness_ISO532_1"
          ],
          "scope": "stationary and time-varying",
          "status": "available",
          "validation": "standard-data",
          "validation_scope": "time-varying signals only",
          "derived_from": [
            "ISO 532-1 Annex A reference program"
          ],
          "validation_details": [
            "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."
          ],
          "note": "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."
        },
        {
          "metric": "loudness-zwicker",
          "reference": "chalupper-fastl-2002",
          "functions": [
            "LoudnessCF"
          ],
          "scope": "time-varying",
          "status": "available",
          "validation": "not-stated",
          "derived_from": [
            "psysound3"
          ],
          "derived_by_author": true,
          "note": "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."
        },
        {
          "metric": "loudness-moore-glasberg",
          "reference": "moore-1997",
          "functions": [
            "Loudness_MGB2b"
          ],
          "scope": "one channel, or two channels for binaural loudness",
          "status": "available",
          "validation": "not-stated",
          "derived_from": [
            "psysound3"
          ],
          "derived_by_author": true,
          "note": "A port and extension of PsySound3's code by Densil Cabrera and Doheon Lee, version 1.02 (27 October 2015). Two-channel input gives binaural loudness after Moore & Glasberg (2007). The audio is resampled to 32 kHz."
        },
        {
          "metric": "loudness-moore-glasberg-time-varying",
          "reference": "glasberg-moore-2002",
          "functions": [
            "Loudness_MGB2b"
          ],
          "scope": "time-varying; one channel, or two channels for binaural loudness",
          "status": "available",
          "validation": "not-stated",
          "derived_from": [
            "psysound3"
          ],
          "derived_by_author": true,
          "note": "Same function as the stationary model; the binaural extension follows Moore & Glasberg (2007)."
        },
        {
          "metric": "sharpness",
          "reference": "fastl-zwicker-2007",
          "functions": [
            "sharpness_Fastl"
          ],
          "scope": "from the specific loudness of LoudnessCF",
          "status": "available",
          "validation": "not-stated",
          "note": "The header describes a weighting fitted to data in Zwicker & Fastl's *Psychoacoustics: Facts and Models* (edition not stated), names the method \"Fastl (1991)\" and credits Claire Churchill (2004)."
        },
        {
          "metric": "roughness-daniel-weber",
          "reference": "daniel-weber-1997",
          "functions": [
            "RoughnessDW"
          ],
          "status": "available",
          "validation": "not-stated",
          "derived_from": [
            "psysound3"
          ],
          "derived_by_author": true,
          "note": "Ported from PsySound3's `@RoughnessDW` by Ella Manor and Densil Cabrera (2015)."
        }
      ],
      "sources": [
        "https://github.com/densilcabrera/aarae",
        "https://github.com/densilcabrera/aarae/blob/master/README.txt",
        "https://github.com/densilcabrera/aarae/blob/master/License%20for%20AARAE.txt",
        "https://github.com/densilcabrera/aarae/tree/master/Analysers/Level%20and%20Strength",
        "https://github.com/densilcabrera/aarae/commits/master/Analysers/Level%20and%20Strength/Loudness_ISO532_1.m",
        "https://github.com/densilcabrera/aarae/blob/master/Analysers/Level%20and%20Strength/Loudness_MGB2b.m",
        "https://github.com/densilcabrera/aarae/blob/master/Analysers/Level%20and%20Strength/LoudnessCF.m"
      ],
      "checked": "2026-10-08",
      "url": "https://zhenxianli.github.io/LISQM/projects/aarae.html",
      "last_commit": "2024-08-09",
      "latest_release": null,
      "prerelease": null,
      "activity": "inactive",
      "archived": false,
      "stars": 36,
      "group": "established"
    },
    {
      "id": "js2251-iso532-3",
      "name": "iso532-3 (tv2018.m)",
      "repository": "https://github.com/js2251/iso532-3",
      "docs": "https://github.com/js2251/iso532-3/blob/main/readme%20TVL%202018.pdf",
      "languages": [
        "MATLAB"
      ],
      "kind": "reference-program",
      "standing": "established",
      "license": "none",
      "license_note": "No licence file. The readme PDF says: \"The code is provided free for any research purposes. For commercial use please contact Brian C. J. Moore.\"",
      "maintainers": [
        "Brian C. J. Moore",
        "Brian R. Glasberg",
        "Josef Schlittenlacher"
      ],
      "summary": "MATLAB code by Brian C. J. Moore, Brian R. Glasberg and Josef Schlittenlacher (Cambridge Hearing Group) for the loudness of time-varying sounds: the model of Moore et al. (2016) with the revised time constants of Moore et al. (2018). Its readme calls `tv2018.m` \"the reference Matlab code referred to in ISO 532-3\".",
      "ai_assistance": "not-stated",
      "notes": [
        "There is no README.md; the documentation is the PDF \"readme TVL 2018\", which includes a worked example with the file 1k100ms.wav.",
        "Takes a WAV file or a MATLAB variable with one or two channels and resamples it to 32 kHz. Outer- and middle-ear transfer functions for free-field, diffuse-field and eardrum presentation are included. Returns short-term and long-term loudness and the instantaneous loudness of each ear.",
        "Also contains sone/phon conversion functions for the TV2015 and TV2018 tables (`Phon2SoneTV2015`, `Sone2PhonTV2015`, `Phon2SoneTV2018`, `Sone2PhonTV2018`).",
        "The Python project LoudnessModel is a translation of the Cambridge MATLAB code for the same model.",
        "An [archived copy](https://web.archive.org/web/20251123130736/https://www.psychol.cam.ac.uk/hearing) of the Cambridge Hearing Group's programs page (November 2025) offers the TVL 2018 MATLAB code as a ZIP file: 23 of its 28 MATLAB files are identical to this repository, which adds the TV2018 conversion tables and the scripts for the standard's tables. The page itself now needs a University of Cambridge login."
      ],
      "caveats": [
        "The code was last changed in October 2021, before ISO 532-3 was published (July 2023); the readme refers to \"ISO 532-3 (2021)\". Whether it is identical to the source code supplied with the published standard is not stated.",
        "For its text-file output, `tv2018.m` converts sone to phon with `Sone2PhonTV2015`, although TV2018 conversion tables were added in October 2021.",
        "The WAV files that the Annex B script reads are not in the repository, and no computed tables are stored."
      ],
      "implements": [
        {
          "metric": "loudness-moore-glasberg-time-varying",
          "reference": "iso-532-3-2023",
          "functions": [
            "tv2018"
          ],
          "scope": "reference MATLAB code referred to in ISO 532-3, per its readme",
          "status": "available",
          "validation": "not-stated",
          "validation_details": [
            "The folder \"code for tables\" has scripts that compute Table 5 (sone to phon) and the values of Annexes B and C (AnnexC.m is headed \"Signals numbered as in ISO 532-2 Annex B\"); the scripts do not name ISO 532-3."
          ],
          "note": "Written by the model's authors (per the readme PDF)."
        }
      ],
      "sources": [
        "https://github.com/js2251/iso532-3",
        "https://github.com/js2251/iso532-3/blob/main/readme%20TVL%202018.pdf",
        "https://github.com/js2251/iso532-3/blob/main/tv2018.m",
        "https://github.com/js2251/iso532-3/tree/main/code%20for%20tables"
      ],
      "checked": "2026-10-07",
      "url": "https://zhenxianli.github.io/LISQM/projects/js2251-iso532-3.html",
      "last_commit": "2021-10-08",
      "latest_release": null,
      "prerelease": null,
      "activity": "inactive",
      "archived": false,
      "stars": 2,
      "group": "established"
    },
    {
      "id": "ita-toolbox",
      "name": "ITA-Toolbox",
      "repository": "https://git.rwth-aachen.de/ita/toolbox",
      "homepage": "https://www.ita-toolbox.org/",
      "languages": [
        "MATLAB"
      ],
      "kind": "library",
      "language_note": "MATLAB toolbox. The loudness functions call C code compiled as MEX files; the C sources and precompiled binaries for Windows, Linux and macOS are included.",
      "standing": "established",
      "standing_note": "A widely used toolbox for acoustic measurements and signal processing that also includes some psychoacoustic functions.",
      "license": "BSD-4-Clause",
      "license_note": "The root `license.txt` (2011) is the four-clause BSD licence: advertising material that mentions the software must acknowledge the Institute of Technical Acoustics (RWTH Aachen University). The psychoacoustics files refer to a licence in their own folder, which contains none.",
      "maintainers": [
        "Institute of Technical Acoustics (ITA)",
        "RWTH Aachen University"
      ],
      "summary": "MATLAB toolbox for acoustic measurements and signal processing from the Institute of Technical Acoustics, RWTH Aachen University, open source since 2010. Its psychoacoustics application computes stationary loudness after DIN 45631 / ISO 532 B, time-varying loudness after DIN 45631/A1, Daniel & Weber roughness and DIN 45681 tonality (2002 draft).",
      "ai_assistance": "not-stated",
      "paper": {
        "citation": "Berzborn, M., Bomhardt, R., Klein, J., Richter, J.-G., & Vorländer, M. (2017). The ITA-Toolbox: An open source MATLAB toolbox for acoustic measurements and signal processing. *Fortschritte der Akustik – DAGA 2017*, Kiel, 222–225.",
        "url": "https://publications.rwth-aachen.de/record/687308"
      },
      "notes": [
        "The psychoacoustic functions were written in 2010 (Martin Guski: loudness; Daniel Cragg: roughness, tonality and sharpness) and are in `applications/Psychoacoustics`, last changed in September 2022.",
        "`ita_sharpness` names no method; its weighting has the form of the DIN 45692 weighting, but as the code does not say which standard it follows, it is not listed as an implementation of DIN 45692.",
        "The repository is on RWTH Aachen University's GitLab, which announces a move to gitlab.git.nrw, so its address may change."
      ],
      "caveats": [
        "`ita_roughness_daniel` and `ita_sharpness` print that a newer version exists (`ita_psychoacoustic_roughness`, `ita_psychoacoustic_sharpness`). Those functions, like `ita_psychoacoustic_loudness` and `ita_psychoacoustic_fluctuationStrength` (2021), call the MATLAB Audio Toolbox, which is closed source, so they are not listed here.",
        "There are no releases; use the default branch."
      ],
      "implements": [
        {
          "metric": "loudness-zwicker",
          "reference": "din-45631-1991",
          "functions": [
            "ita_loudness"
          ],
          "scope": "stationary; free or diffuse field",
          "status": "available",
          "validation": "standard-data",
          "derived_from": [
            "BASIC program of DIN 45631 (Zwicker et al., 1991)"
          ],
          "validation_details": [
            "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."
          ],
          "conventions": [
            "Third-octave levels come from an FFT by default, or from a filter bank (`'mode', 'filter'`)."
          ],
          "note": "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."
        },
        {
          "metric": "loudness-zwicker",
          "reference": "din-45631-a1-2010",
          "functions": [
            "ita_loudness_timevariant"
          ],
          "scope": "time-varying, with N5",
          "status": "available",
          "validation": "standard-data",
          "validation_scope": "results plotted, not checked",
          "validation_details": [
            "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."
          ],
          "conventions": [
            "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."
          ],
          "note": "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\"."
        },
        {
          "metric": "roughness-daniel-weber",
          "reference": "daniel-weber-1997",
          "functions": [
            "ita_roughness_daniel"
          ],
          "status": "available",
          "validation": "standard-data",
          "validation_scope": "a code comment only",
          "validation_details": [
            "A code comment says that after major bug fixes the values \"more or less match those of the paper by Daniel\"; no test or comparison script is included."
          ],
          "note": "Uses sub-functions written by Martin Klemenz in 2000 (`external_packages/roughness_daniel`)."
        },
        {
          "metric": "tonality-din-45681",
          "reference": "din-45681-2002-draft",
          "functions": [
            "ita_tonality"
          ],
          "scope": "maximum tonal audibility and its frequency",
          "status": "available",
          "validation": "not-stated",
          "note": "The header cites \"DIN 45681 (2002)\", the draft that preceded DIN 45681:2005. A code comment says that no A-weighting is applied."
        }
      ],
      "sources": [
        "https://git.rwth-aachen.de/ita/toolbox",
        "https://git.rwth-aachen.de/ita/toolbox/-/blob/master/license.txt",
        "https://git.rwth-aachen.de/ita/toolbox/-/tree/master/applications/Psychoacoustics",
        "https://www.ita-toolbox.org/",
        "https://publications.rwth-aachen.de/record/687308"
      ],
      "checked": "2026-10-07",
      "url": "https://zhenxianli.github.io/LISQM/projects/ita-toolbox.html",
      "last_commit": "2025-09-22",
      "latest_release": null,
      "prerelease": null,
      "activity": "inactive",
      "archived": false,
      "stars": null,
      "group": "established"
    },
    {
      "id": "pd-psycho",
      "name": "PSYCHO",
      "repository": "https://github.com/porres/pd-psycho",
      "languages": [
        "Pure Data",
        "C"
      ],
      "kind": "plugin",
      "core": "C",
      "language_note": "Objects for Pure Data: C externals built with pd-lib-builder, and Pd abstractions.",
      "standing": "established",
      "license": "GPL-3.0-or-later",
      "license_note": "LICENSE.txt holds the GPL v3 text; the only licence notice in the sources (roughness.c) allows any later version.",
      "maintainers": [
        "Alexandre Torres Porres"
      ],
      "summary": "Pure Data library of psychoacoustic objects (C externals and abstractions) from the author's research on dissonance models. Includes ISO 226:2003 equal-loudness contours and phon, sone and dB conversions, as well as roughness, sharpness and tonalness objects.",
      "ai_assistance": "not-stated",
      "paper": {
        "citation": "Porres, A. T. (2011). Dissonance Model Toolbox in Pure Data. *Proceedings of the 4th Pure Data International Convention (PdCon11)*, Berlin."
      },
      "notes": [
        "The roughness objects (`[roughness]`, `[roughcurve]`) compute the sensory dissonance of a spectrum given as lists of frequencies and amplitudes, with a model \"derived from the work of Parncutt, Sethares, Vassilakis & Barlow\"; this is not one of the signal-based roughness metrics in this list.",
        "`[sharpness~]` is an abstraction built on `[barks~]` (24 Bark bands) and names no sharpness model.",
        "Tonalness, pitch salience and commonality follow Parncutt & Strasburger (1994), after Terhardt; they are not tonality metrics in the sense of this list.",
        "From the author's MSc and PhD work (2005–2012). Version 1.1 was released on 2025-10-14 (git tags 1.0 of 2019 and 1.1; no GitHub releases). It builds with pd-lib-builder."
      ],
      "caveats": [
        "The README calls the library \"still a work in progress\"."
      ],
      "implements": [
        {
          "metric": "equal-loudness-contours",
          "reference": "iso-226-2003",
          "functions": [
            "[iso226]"
          ],
          "status": "available",
          "validation": "not-stated",
          "note": "The help patch names ISO 226:2003. Related objects convert between phon and dB (`[phon2db]`, `[db2phon]`) and between phon and sone (`[phon2sone]`, `[sone2phon]`)."
        }
      ],
      "sources": [
        "https://github.com/porres/pd-psycho",
        "https://github.com/porres/pd-psycho/blob/master/README.md",
        "https://github.com/porres/pd-psycho/blob/master/LICENSE.txt",
        "https://github.com/porres/pd-psycho/tree/master/Classes",
        "https://github.com/porres/pd-psycho/tree/master/Help-files"
      ],
      "checked": "2026-10-06",
      "url": "https://zhenxianli.github.io/LISQM/projects/pd-psycho.html",
      "last_commit": "2025-10-14",
      "latest_release": {
        "version": "1.1",
        "date": "2025-10-14",
        "source": "GitHub release"
      },
      "prerelease": null,
      "activity": "inactive",
      "archived": false,
      "stars": 22,
      "group": "established"
    },
    {
      "id": "pydsm",
      "name": "PyDSM",
      "repository": "https://github.com/sergiocallegari/PyDSM",
      "docs": "https://pythonhosted.org/pydsm/pydsm.iso226.html",
      "languages": [
        "Python"
      ],
      "kind": "library",
      "standing": "established",
      "license": "GPL-3.0-or-later",
      "packages": [
        {
          "registry": "pypi",
          "name": "pydsm"
        }
      ],
      "install": "pip install pydsm",
      "maintainers": [
        "Sergio Callegari"
      ],
      "summary": "Python toolbox for the design and simulation of delta-sigma modulators. It contains a helper module, `pydsm.iso226`, with ISO 226:2003 equal-loudness contours.",
      "ai_assistance": "not-stated",
      "notes": [
        "The `pydsm.iso226` module was added in August 2013 and cites Jeff Tackett's 2005 MATLAB ISO 226 code. Its tables can optionally be extended with a data point at 20 kHz.",
        "A standalone extraction of the module, [jacobbaylesssmc/iso226](https://github.com/jacobbaylesssmc/iso226) (GPL-3.0, two commits on 2019-07-09), also exists."
      ],
      "caveats": [
        "ISO 226:2003 was withdrawn in 2023 and replaced by ISO 226:2023; the module follows the 2003 edition."
      ],
      "cite": {
        "text": "The README asks users to cite two papers by Callegari and Bizzarri on the design of ΔΣ modulators (the journal versions)."
      },
      "implements": [
        {
          "metric": "equal-loudness-contours",
          "reference": "iso-226-2003",
          "functions": [
            "pydsm.iso226"
          ],
          "scope": "tabled and interpolated contours; optional 20 kHz extension",
          "status": "available",
          "validation": "not-stated"
        }
      ],
      "sources": [
        "https://github.com/sergiocallegari/PyDSM",
        "https://github.com/sergiocallegari/PyDSM/blob/main/README.md",
        "https://github.com/sergiocallegari/PyDSM/blob/main/src/pydsm/iso226.py",
        "https://pypi.org/project/pydsm/",
        "https://github.com/jacobbaylesssmc/iso226"
      ],
      "checked": "2026-10-06",
      "url": "https://zhenxianli.github.io/LISQM/projects/pydsm.html",
      "last_commit": "2025-08-22",
      "latest_release": {
        "version": "0.15.2",
        "date": "2025-08-22",
        "source": "GitHub release"
      },
      "prerelease": null,
      "activity": "inactive",
      "archived": false,
      "stars": 22,
      "group": "established"
    },
    {
      "id": "metasona",
      "name": "MetaSona",
      "repository": "https://github.com/huaaudio/metasona",
      "docs": "https://github.com/huaaudio/metasona/tree/main/docs",
      "languages": [
        "C",
        "Python"
      ],
      "kind": "library",
      "based_on": "sqat",
      "language_note": "A CMake library in C11 with the header `metasona/metasona.h` and a documented C API. The Python package loads the compiled library with ctypes and ships prebuilt wheels for Windows x64, Linux x64 and ARM64 and macOS (Intel and Apple silicon), for Python 3.9 to 3.14. The C functions take 48 kHz input; the Python interface resamples.",
      "standing": "newly-released",
      "standing_note": "First released in September 2026.",
      "rank": 1,
      "license": "GPL-3.0-only AND Apache-2.0 AND BSD-3-Clause AND MIT",
      "license_note": "The combined distribution is GPL-3.0. MetaSona's own code is Apache-2.0; the ECMA-418-2 kernels (from SQAT/RefMap) and the current Aures tonality port are GPL-3.0; SQAT's ISO 532-1 filtering (BSD-3-Clause), SQAT's Daniel & Weber roughness (MIT), MoSQITo data (Apache-2.0) and PocketFFT (BSD-3-Clause) keep their notices.",
      "packages": [
        {
          "registry": "pypi",
          "name": "metasona"
        }
      ],
      "install": "pip install metasona",
      "maintainers": [
        "Jiahua Zhang"
      ],
      "summary": "C library with a typed Python interface and prebuilt wheels, written to make repeated psychoacoustic analysis fast. Covers Zwicker loudness, DIN 45692 sharpness, Daniel–Weber roughness, Aures tonality and ECMA-418-2:2025 loudness, roughness and tonality.",
      "ai_assistance": "disclosed",
      "ai_note": "README and NOTICE state that it was developed with assistance from OpenAI Codex.",
      "notes": [
        "First commit and first PyPI release on 2026-09-16.",
        "Ports SQAT revision `e6228b78` (2026-09-15), which includes the Daniel & Weber rewrite (#65) and the Aures tonality fixes (#66–#73) but not PR #77 (2026-09-17, in SQAT v2.0), a fix to the Terhardt filter bank that Daniel & Weber roughness uses. Model data come from MoSQITo; differences to both are listed in [THIRD_PARTY.md](https://github.com/huaaudio/metasona/blob/main/THIRD_PARTY.md).",
        "The README reports speed-ups over MoSQITo 1.2.1 (e.g. 73× for time-varying loudness on its benchmark signal)."
      ],
      "conventions": [
        "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."
      ],
      "caveats": [
        "Very new (first released in September 2026) and not yet seen to be widely used in the community; no independent verification has been published.",
        "The README calls the current version experimental, particularly roughness and tonality, and says standards conformance has not been established.",
        "Comparisons with SQAT and MoSQITo are described as kept outside the package repository, and the third-party notes say exact agreement with the MATLAB code is not established."
      ],
      "implements": [
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "stationary_loudness",
            "time_varying_loudness",
            "loudness_from_levels"
          ],
          "scope": "stationary and time-varying; also from 28 third-octave levels",
          "status": "available",
          "since": "0.1.0",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "derived_from": [
            "mosqito",
            "sqat"
          ],
          "validation_details": [
            "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."
          ]
        },
        {
          "metric": "sharpness",
          "reference": "din-45692-2009",
          "functions": [
            "sharpness_din45692"
          ],
          "scope": "from specific loudness",
          "status": "available",
          "since": "0.1.0",
          "validation": "not-stated"
        },
        {
          "metric": "roughness-daniel-weber",
          "reference": "daniel-weber-1997",
          "functions": [
            "roughness_daniel_weber"
          ],
          "status": "available",
          "since": "0.1.0",
          "validation": "cross-implementation",
          "derived_from": [
            "sqat",
            "mosqito"
          ],
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "The project says that detailed validation and reference comparisons are kept outside the repository; the results are not published.",
            "The API documentation calls the function experimental and says normative validation remains open."
          ],
          "note": "Follows SQAT revision `e6228b78`, which includes SQAT's September 2026 rewrite but not its later fix to the Terhardt filter bank (PR #77, in SQAT v2.0)."
        },
        {
          "metric": "tonality-aures",
          "reference": "aures-1985-euphony",
          "functions": [
            "tonality_aures"
          ],
          "status": "available",
          "since": "0.1.0",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "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."
          ],
          "note": "Follows SQAT's September 2026 revision (250 ms Hann windows, 125 ms hop)."
        },
        {
          "metric": "loudness-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "loudness_ecma",
            "ecma_tonal_analysis"
          ],
          "scope": "Clause 8 loudness with tonal/noise separation; mono or stereo",
          "status": "available",
          "since": "0.2.0",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "The project says that detailed validation and reference comparisons are kept outside the repository; the results are not published."
          ],
          "note": "Adapted from the SQAT/RefMap MATLAB code by Lotinga and Torjussen."
        },
        {
          "metric": "roughness-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "roughness_ecma"
          ],
          "scope": "mono or stereo; optional entropy weighting not applied",
          "status": "available",
          "since": "0.2.0",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "The project says that detailed validation and reference comparisons are kept outside the repository; the results are not published."
          ],
          "note": "Uses the standard's 20 ms grid and nominal calibration factor, where SQAT uses a slightly adjusted calibration."
        },
        {
          "metric": "tonality-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "tonality_ecma",
            "ecma_tonal_analysis"
          ],
          "scope": "mono or stereo",
          "status": "available",
          "since": "0.2.0",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "The project says that detailed validation and reference comparisons are kept outside the repository; the results are not published."
          ]
        }
      ],
      "sources": [
        "https://github.com/huaaudio/metasona/blob/main/README.md",
        "https://github.com/huaaudio/metasona/blob/main/THIRD_PARTY.md",
        "https://github.com/huaaudio/metasona/blob/main/NOTICE",
        "https://pypi.org/project/metasona/",
        "https://github.com/huaaudio/metasona/blob/main/python/metasona/_abi.py",
        "https://github.com/huaaudio/metasona/blob/main/docs/c-api.md",
        "https://github.com/huaaudio/metasona/blob/main/docs/python-api.md"
      ],
      "checked": "2026-10-08",
      "url": "https://zhenxianli.github.io/LISQM/projects/metasona.html",
      "last_commit": "2026-09-25",
      "latest_release": {
        "version": "v0.2.2",
        "date": "2026-09-25",
        "source": "GitHub release"
      },
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": 1,
      "group": "newly-released"
    },
    {
      "id": "ecma418-torch",
      "name": "ecma418-torch",
      "repository": "https://github.com/agrathwohl/ecma418-torch",
      "docs": "https://github.com/agrathwohl/ecma418-torch#readme",
      "languages": [
        "Python"
      ],
      "kind": "library",
      "language_note": "A PyTorch package (Python 3.10 or newer, PyTorch 2.0 or newer) that computes in float64 and is differentiable end to end, so the metrics can serve as terms in gradient-based optimisation. Not on PyPI yet.",
      "standing": "newly-released",
      "standing_note": "First published on GitHub on 2026-10-11 (version 0.1.0 in its metadata); no release or PyPI package yet.",
      "license": "MIT",
      "maintainers": [
        "Andrew Grathwohl"
      ],
      "summary": "Roughness (Clause 7) and fluctuation strength (Clause 9) of ECMA-418-2:2025 (4th edition) in PyTorch, differentiable end to end, with the binaural combination of two channels. The code cites the formula numbers of the standard and lists the places where it reads a printed formula differently.",
      "ai_assistance": "not-stated",
      "notes": [
        "The README describes the gradient as the derivative of the metric wherever the metric is differentiable; the tests check it against central differences and with the Taylor remainder (`tests/test_gradients.py`).",
        "The tests run sottek-hearing-model as an oracle: its outputs for five test signals are stored in `tests/fixtures`, with the commit they were made with. The fluctuation strength of sottek-hearing-model used there is not in a release yet.",
        "The README reports 22 s forward and 32 s backward for 240 s of stereo audio at 44.1 kHz on an RTX 3090 Ti (10.6 GiB peak memory), for roughness and fluctuation strength together."
      ],
      "conventions": [
        "Input at other sample rates is resampled to 48 kHz (band-limited, by the Fourier method).",
        "The single value is the 90th percentile from `torch.quantile` (linear interpolation) of the time-dependent values, after the first 16 (roughness) or 36 (fluctuation strength) values at 50 Hz are left out.",
        "The outer and middle ear filter uses the coefficients as printed in Table 1 of the standard, where sottek-hearing-model uses unrounded ones."
      ],
      "caveats": [
        "Very new (first published in October 2026) and not yet seen to be widely used in the community; no independent verification has been published.",
        "Single author; one commit so far."
      ],
      "implements": [
        {
          "metric": "roughness-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "roughness"
          ],
          "scope": "with binaural combination; without the optional entropy weighting of Section 7.1.6",
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sottek-hearing-model",
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "validation_details": [
            "The 1 kHz tone amplitude-modulated at 70 Hz (60 dB SPL) gives 0.9999987 asper for 10 s (the test allows 1e-4 around 1), and the average specific roughness in band 17 is 0.37348, against 0.374 from ArtemiS v17 as quoted in the tests of sottek-hearing-model.",
            "Against sottek-hearing-model run as an oracle on three signals (the calibration tone, noise and a mixture of modulated tones and noise), the time-dependent values differ by at most 2e-5 asper and the single values by at most 2e-5; the README traces the residual to the rounded filter coefficients.",
            "The tests also check that two identical channels give the mono result and that input at 44.1 kHz gives the 48 kHz result within 0.2 %."
          ]
        },
        {
          "metric": "fluctuation-strength-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "fluctuation_strength"
          ],
          "scope": "with binaural combination",
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sottek-hearing-model",
            "ArtemiS SUITE (HEAD acoustics)"
          ],
          "conventions": [
            "By default it follows the printed text in three places where sottek-hearing-model decides otherwise: the step limit of Formula (152) (2e-4 Hz, against 0.2), no fundamental required for an assumed order in Section 9.1.8, and machine epsilon for ε0 (against 1e-12). The options `newton_cap` and `require_fundamental` give sottek-hearing-model's choices.",
            "Formula (127) is computed with π instead of the printed 2π in the phase term, and Formula (144) without the printed \"− 1\", which the code says would shift every rate down one bin."
          ],
          "validation_details": [
            "The 1 kHz tone amplitude-modulated at 4 Hz (60 dB SPL) gives 0.99579 vacil for 10 s (the test allows 1e-2 around 1), and the average specific fluctuation strength in band 17 is 0.38876, against 0.395 from ArtemiS v17 as quoted in the tests of sottek-hearing-model.",
            "Against sottek-hearing-model run as an oracle on two signals: with that package's three choices, the time-dependent values differ by at most 6.3e-5 vacil and the single values by at most 6.3e-5; with the defaults, which follow the printed text, the single values differ by 0.2 % and 0.5 %."
          ]
        }
      ],
      "sources": [
        "https://github.com/agrathwohl/ecma418-torch/blob/master/README.md",
        "https://github.com/agrathwohl/ecma418-torch/blob/master/LICENSE",
        "https://github.com/agrathwohl/ecma418-torch/blob/master/pyproject.toml",
        "https://github.com/agrathwohl/ecma418-torch/blob/master/benchmarks/evidence.md",
        "https://github.com/agrathwohl/ecma418-torch/blob/master/tests/test_fidelity.py",
        "https://github.com/agrathwohl/ecma418-torch/blob/master/tests/fixtures/make_oracle_fixtures.py",
        "https://github.com/agrathwohl/ecma418-torch/blob/master/src/ecma418_torch/fluctuation.py"
      ],
      "checked": "2026-10-17",
      "url": "https://zhenxianli.github.io/LISQM/projects/ecma418-torch.html",
      "last_commit": "2026-10-11",
      "latest_release": null,
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": null,
      "group": "newly-released"
    },
    {
      "id": "iso532-1-rs",
      "name": "iso532-1-rs",
      "repository": "https://github.com/cclin99/iso532-1-rs",
      "languages": [
        "Rust",
        "C",
        "Python"
      ],
      "kind": "library",
      "core": "Rust",
      "language_note": "It has a C ABI and a Python module built with PyO3 and maturin. Neither the crate nor the Python module is published, so both are built from the repository.",
      "standing": "newly-released",
      "standing_note": "First version tagged in July 2026.",
      "license": "Apache-2.0",
      "maintainers": [
        "cclin99"
      ],
      "summary": "Rust engine (README title \"ISO532\") for ISO 532-1:2017 Zwicker loudness: stationary, time-varying and a streaming interface, with a C ABI and a Python binding (PyO3/maturin). Only ISO 532-1 loudness is implemented.",
      "ai_assistance": "disclosed",
      "ai_note": "The README describes \"An AI-assisted Rust engine\" developed \"through human-directed AI collaboration\"; 16 commits from July 2026 carry Claude co-author lines, and the repository contains Codex agent configuration.",
      "notes": [
        "Not published on crates.io or PyPI (the crate and the Python module are named `iso532`). Version 0.1.0 exists as a git tag of 2026-07-19 and in CHANGELOG.md and CITATION.cff; there is no GitHub release.",
        "MoSQITo 1.2.1 is the reference implementation, credited in THIRD_PARTY_NOTICES.md; the stationary front end follows MoSQITo's `noct_spectrum` path.",
        "Expects calibrated pressure in pascals at 48 kHz. The stream outputs sone, phon and status flags on a 2 ms grid and marks the first 580 frames as warm-up."
      ],
      "caveats": [
        "The MoSQITo golden data and the ISO Annex B fixtures are gitignored and must be regenerated locally; the README says \"Hosted CI does not by itself prove the local MoSQITo/Annex B golden chain\"."
      ],
      "implements": [
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "loudness_zwst",
            "loudness_zwtv",
            "ZwtvStream"
          ],
          "scope": "stationary, time-varying and streaming",
          "status": "available",
          "since": "0.1.0",
          "validation": "standard-data",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "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."
          ],
          "note": "Python uses the same names (`iso532.loudness_zwst` …); the C API has `iso532_loudness_zwst`, `iso532_loudness_zwtv` and `iso532_stream_*`."
        }
      ],
      "cite": {
        "cff": "https://github.com/cclin99/iso532-1-rs/blob/main/CITATION.cff"
      },
      "sources": [
        "https://github.com/cclin99/iso532-1-rs",
        "https://github.com/cclin99/iso532-1-rs/blob/main/README.md",
        "https://github.com/cclin99/iso532-1-rs/blob/main/CHANGELOG.md",
        "https://github.com/cclin99/iso532-1-rs/blob/main/THIRD_PARTY_NOTICES.md",
        "https://github.com/cclin99/iso532-1-rs/blob/main/docs/ISO-ANNEXB-NUMERICAL-ERROR-2026-07-04.md"
      ],
      "checked": "2026-10-06",
      "url": "https://zhenxianli.github.io/LISQM/projects/iso532-1-rs.html",
      "last_commit": "2026-07-21",
      "latest_release": {
        "version": "0.1.0",
        "date": "2026-07-19",
        "source": ""
      },
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": 1,
      "group": "newly-released"
    },
    {
      "id": "kirin-hypha",
      "name": "Kirin Hypha",
      "repository": "https://github.com/heyalohaloha/kirin_hypha",
      "languages": [
        "Rust"
      ],
      "kind": "plugin",
      "language_note": "A measurement plug-in for digital audio workstations (AU and VST3 on macOS, VST3 on Windows); the psychoacoustic engine is the Rust crate `kirin_measure` in the repository.",
      "standing": "newly-released",
      "standing_note": "First public commit in April 2026; v1.0.0 was released in May 2026.",
      "license": "GPL-3.0",
      "maintainers": [
        "Daisuke Nishio"
      ],
      "summary": "Free PRE/POST measurement plug-in for mixing and mastering. Besides programme loudness (LUFS, ITU-R BS.1770), true peak and spectrum, it computes ISO 532-1 time-varying Zwicker loudness and DIN 45692 sharpness, ported from MoSQITo to Rust.",
      "ai_assistance": "disclosed",
      "ai_note": "The repository contains `CLAUDE.md` and `AGENTS.md` files (instructions for AI coding agents), and its design notes refer to Claude Code and Codex work branches.",
      "notes": [
        "The loudness and sharpness code is a port of MoSQITo v1.2.1 (`loudness_zwtv` and its stages); the sources and changes are listed in `THIRD_PARTY_NOTICES.md`.",
        "Zwicker loudness N is computed and stored in the recorded data but is not one of the plug-in's display cells; sharpness is shown. For several channels, both are computed per channel and averaged.",
        "Programme loudness (LUFS) and true peak follow ITU-R BS.1770, which is outside the scope of this list."
      ],
      "caveats": [
        "The loudness engine works on mono audio at 48 kHz; the plug-in measures each input channel separately."
      ],
      "implements": [
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "kirin_measure::phase_d"
          ],
          "scope": "time-varying, per channel at 48 kHz; stored in the recorded data",
          "status": "available",
          "since": "1.0.0",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "derived_from": [
            "mosqito"
          ],
          "validation_details": [
            "Tests assert specific loudness within a relative 1e-3 of MoSQITo."
          ],
          "note": "Ported from MoSQITo v1.2.1."
        },
        {
          "metric": "sharpness",
          "reference": "din-45692-2009",
          "functions": [
            "kirin_measure::phase_d::sharpness"
          ],
          "scope": "from the time-varying specific loudness; shown in the plug-in",
          "status": "available",
          "since": "1.0.0",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "derived_from": [
            "mosqito"
          ],
          "validation_details": [
            "Tests assert agreement with MoSQITo within 0.05 acum."
          ]
        }
      ],
      "sources": [
        "https://github.com/heyalohaloha/kirin_hypha",
        "https://github.com/heyalohaloha/kirin_hypha/blob/main/README.md",
        "https://github.com/heyalohaloha/kirin_hypha/blob/main/THIRD_PARTY_NOTICES.md",
        "https://github.com/heyalohaloha/kirin_hypha/tree/main/crates/kirin_measure/src/phase_d",
        "https://github.com/heyalohaloha/kirin_hypha/releases"
      ],
      "checked": "2026-10-07",
      "url": "https://zhenxianli.github.io/LISQM/projects/kirin-hypha.html",
      "last_commit": "2026-10-14",
      "latest_release": {
        "version": "v1.1.50",
        "date": "2026-09-21",
        "source": "GitHub release"
      },
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": 6,
      "group": "newly-released"
    },
    {
      "id": "mosqito-net",
      "name": "Mosqito.NET",
      "repository": "https://github.com/onur-akaydin/Mosqito.NET",
      "languages": [
        "C#"
      ],
      "kind": "library",
      "based_on": "mosqito",
      "language_note": "Native C# for .NET 8 (it does not call Python), with MathNet.Numerics and NAudio. The project file has NuGet metadata, but no package was found on nuget.org (checked 2026-10-07); build it from the repository.",
      "standing": "newly-released",
      "standing_note": "First published on GitHub in April 2026.",
      "license": "Apache-2.0",
      "license_note": "NOTICE.md states that it is derived from MoSQITo 1.2.1 (Apache-2.0).",
      "maintainers": [
        "onur-akaydin"
      ],
      "summary": "C# (.NET 8) port of MoSQITo 1.2.1 with the same metrics: ISO 532-1 loudness, ECMA-418-2 (2nd edition) loudness and roughness, DIN 45692 sharpness, Daniel & Weber roughness, and ECMA-74 tone-to-noise and prominence ratios.",
      "ai_assistance": "disclosed",
      "ai_note": "The README says the port \"was produced largely with AI assistance (Claude)\"; most commits of 16 and 17 April 2026 have Claude as co-author.",
      "notes": [
        "First commit on 2026-04-16; 16 commits, the latest on 2026-06-07. There is no GitHub release.",
        "Also ports MoSQITo's speech intelligibility index (ANSI S3.5), which is outside the scope of this list."
      ],
      "caveats": [
        "Very new and not yet seen to be widely used in the community; the README asks users to validate results against their own reference data before relying on them.",
        "Its ECMA-418-2 functions follow the 2nd edition (2022), two editions behind the current one, as in MoSQITo."
      ],
      "conventions": [
        {
          "text": "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.",
          "metrics": [
            "loudness-zwicker",
            "roughness-ecma-418-2"
          ]
        }
      ],
      "implements": [
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "Sq.LoudnessZwst",
            "Sq.LoudnessZwstFreq",
            "Sq.LoudnessZwstPerSeg",
            "Sq.LoudnessZwtv"
          ],
          "scope": "stationary (also per segment and from a spectrum) and time-varying",
          "status": "available",
          "validation": "standard-data",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "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)."
          ]
        },
        {
          "metric": "loudness-ecma-418-2",
          "reference": "ecma-418-2-ed2",
          "functions": [
            "Sq.LoudnessEcma"
          ],
          "scope": "Clause 5 hearing-model loudness only, as in MoSQITo",
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "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); MoSQITo's unit tests are ported too."
          ]
        },
        {
          "metric": "sharpness",
          "reference": "din-45692-2009",
          "functions": [
            "Sq.SharpnessDinSt",
            "Sq.SharpnessDinTv",
            "Sq.SharpnessDinPerSeg",
            "Sq.SharpnessDinFreq"
          ],
          "scope": "weightings: DIN 45692, Aures, von Bismarck, Fastl",
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "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); MoSQITo's unit tests are ported too."
          ]
        },
        {
          "metric": "roughness-daniel-weber",
          "reference": "daniel-weber-1997",
          "functions": [
            "Sq.RoughnessDw",
            "Sq.RoughnessDwFreq"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "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); MoSQITo's unit tests are ported too."
          ]
        },
        {
          "metric": "roughness-ecma-418-2",
          "reference": "ecma-418-2-ed2",
          "functions": [
            "Sq.RoughnessEcma"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "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); MoSQITo's unit tests are ported too."
          ]
        },
        {
          "metric": "tone-to-noise-prominence-ratio",
          "reference": "ecma-74-ed17",
          "functions": [
            "Sq.TnrEcmaSt",
            "Sq.TnrEcmaFreq",
            "Sq.TnrEcmaPerSeg",
            "Sq.PrEcmaSt",
            "Sq.PrEcmaFreq",
            "Sq.PrEcmaPerSeg"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "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); MoSQITo's unit tests are ported too."
          ],
          "note": "The README cites ECMA-74 Annex D."
        },
        {
          "metric": "equal-loudness-contours",
          "reference": "iso-226-2003",
          "functions": [
            "Sq.EqualLoudnessContours"
          ],
          "status": "available",
          "validation": "not-stated",
          "note": "Code comments say ISO 226:1987, but the tables are ported from MoSQITo, whose code follows Jeff Tackett's ISO 226:2003 implementation."
        }
      ],
      "sources": [
        "https://github.com/onur-akaydin/Mosqito.NET",
        "https://github.com/onur-akaydin/Mosqito.NET/blob/master/README.md",
        "https://github.com/onur-akaydin/Mosqito.NET/blob/master/NOTICE.md",
        "https://github.com/onur-akaydin/Mosqito.NET/commits/master/",
        "https://github.com/Eomys/MoSQITo/issues/98"
      ],
      "checked": "2026-10-07",
      "url": "https://zhenxianli.github.io/LISQM/projects/mosqito-net.html",
      "last_commit": "2026-06-07",
      "latest_release": null,
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": 0,
      "group": "newly-released"
    },
    {
      "id": "numpylib-psychoacoustic",
      "name": "NumpyLibforPsychoAcoustic",
      "repository": "https://github.com/Ryrybros/NumpyLibforPsychoAcoustic",
      "languages": [
        "Python"
      ],
      "kind": "research-code",
      "based_on": "amt",
      "language_note": "NumPy adaptation of the AMT functions `moore1997` and `glasberg2002`.",
      "standing": "newly-released",
      "standing_note": "First published on GitHub in November 2025.",
      "license": "none",
      "maintainers": [
        "Ryrybros"
      ],
      "summary": "Python (NumPy) adaptation of loudness models from the Auditory Modeling Toolbox (AMT), written as a second-year student project at Mines School of Nancy: the stationary model of Moore, Glasberg & Baer (1997) and the time-varying model of Glasberg & Moore (2002).",
      "ai_assistance": "not-stated",
      "notes": [
        "The implementation document says the Moore (1997) model is \"the same code as the amt-toolbox one\"; the data preparation follows AMT's Glasberg (2002) data function.",
        "GitHub labels the repository TypeScript because of the React/Vite user interface in UI/Model_UI; the models are Python."
      ],
      "caveats": [
        "No licence file, so reuse is not permitted by default.",
        "The implementation document describes only the Moore (1997) model as implemented; `glasberg2002` is in the code (with data/Glasberg2002.json) but not documented."
      ],
      "implements": [
        {
          "metric": "loudness-moore-glasberg",
          "reference": "moore-1997",
          "functions": [
            "model.moore1997",
            "equalSones.getEqualSones"
          ],
          "status": "available",
          "validation": "standard-data",
          "compared_with": [
            "amt"
          ],
          "validation_details": [
            "The implementation document says the model is compared with the results shown in the original article (plots of its Fig. 8 and Fig. 12).",
            "Numerical error reports (PDF) compare intermediate arrays, such as the outer- and middle-ear filter, with AMT's MATLAB output."
          ]
        },
        {
          "metric": "loudness-moore-glasberg-time-varying",
          "reference": "glasberg-moore-2002",
          "functions": [
            "model.glasberg2002"
          ],
          "status": "available",
          "validation": "not-stated",
          "note": "Present in the code but not described in the implementation document."
        }
      ],
      "sources": [
        "https://github.com/Ryrybros/NumpyLibforPsychoAcoustic",
        "https://github.com/Ryrybros/NumpyLibforPsychoAcoustic/blob/main/README.md",
        "https://github.com/Ryrybros/NumpyLibforPsychoAcoustic/blob/main/Documentation/Implementation_documentation.pdf",
        "https://github.com/Ryrybros/NumpyLibforPsychoAcoustic/tree/main/Numerical_error_report"
      ],
      "checked": "2026-10-06",
      "url": "https://zhenxianli.github.io/LISQM/projects/numpylib-psychoacoustic.html",
      "last_commit": "2026-06-07",
      "latest_release": null,
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": 0,
      "group": "newly-released"
    },
    {
      "id": "phonometry",
      "name": "phonometry",
      "repository": "https://github.com/jmrplens/phonometry",
      "docs": "https://jmrplens.github.io/phonometry/",
      "languages": [
        "Python"
      ],
      "kind": "library",
      "language_note": "Pure Python; needs only NumPy and SciPy.",
      "standing": "newly-released",
      "standing_note": "Its psychoacoustics module was first released in July 2026 (version 3.1.0).",
      "license": "MIT",
      "packages": [
        {
          "registry": "pypi",
          "name": "phonometry"
        }
      ],
      "install": "pip install phonometry",
      "maintainers": [
        "José M. Requena Plens"
      ],
      "summary": "Python acoustics library (formerly PyOctaveBand) that added a large psychoacoustics module in July 2026: ISO 532-1, -2 and -3 loudness, ECMA-418-2:2025 loudness, tonality, roughness and fluctuation strength (monaural), DIN 45692 sharpness, Osses fluctuation strength, ECMA-418-1:2024 TNR/PR, tonal audibility, impulsiveness, EPNL and ISO 226:2023. Only NumPy and SciPy are required.",
      "ai_assistance": "disclosed",
      "ai_note": "The draft paper (`paper/paper.md`) has an AI usage disclosure: language models drafted code, tests and documentation from the author's clause-by-clause readings, under the author's direction and review. 34 commits from July 2026 contain Claude Code session links.",
      "notes": [
        "Renamed from PyOctaveBand (octave-band filtering) at 3.0.0 on 2026-07-06; the psychoacoustics module arrived in 3.1.0 on 2026-07-13. 873 of its 905 commits are from 2026.",
        "The README reports 1793 of 1793 conformance checks passing across 519 standards, generated by the project's own CI ([CONFORMANCE.md](https://github.com/jmrplens/phonometry/blob/main/docs/CONFORMANCE.md)).",
        "Keeps a public errata list of misprints found in standards, including ECMA-418-1:2024 and ECMA-418-2:2025 ([ERRATA.md](https://github.com/jmrplens/phonometry/blob/main/docs/ERRATA.md)).",
        "A JOSS-format paper draft exists in the repository; no published paper yet. Version 4.0 (release candidate since 2026-09-10) moves modules.",
        "Not implemented: Daniel & Weber roughness, Aures tonality, More and Di annoyance, and binaural combination for ECMA-418-2."
      ],
      "caveats": [
        "Very new (psychoacoustics module first released in July 2026) and not yet seen to be widely used in the community; no independent verification has been published.",
        "Single maintainer; all validation comes from the project's own tests.",
        "The ECMA-418-2 checks only use the calibration signals, and no comparison with another implementation is reported. Its loudness reads 0.984 sone_HMS at the calibration point, which its own documentation says is outside the adjustment the standard allows.",
        "Requires Python 3.13 or newer."
      ],
      "implements": [
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "loudness_zwicker",
            "loudness_zwicker_from_spectrum"
          ],
          "scope": "stationary and time-varying",
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "derived_from": [
            "ISO 532-1 Annex A reference program"
          ],
          "validation_details": [
            "Annex B test signals are used in the tests."
          ]
        },
        {
          "metric": "loudness-moore-glasberg",
          "reference": "iso-532-2-2017",
          "functions": [
            "loudness_moore_glasberg",
            "loudness_moore_glasberg_from_spectrum",
            "loudness_moore_glasberg_from_third_octave"
          ],
          "scope": "with binaural inhibition",
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "validation_details": [
            "The documentation says it reproduces the Annex B tone and broadband cases to within a percent or two."
          ]
        },
        {
          "metric": "loudness-moore-glasberg-time-varying",
          "reference": "iso-532-3-2023",
          "functions": [
            "loudness_moore_glasberg_time"
          ],
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "validation_details": [
            "A documented deviation: the Annex B WAV-file cases are not reproduced, and Annex C values are used instead."
          ],
          "conventions": [
            "Documented deviation: it runs at the native sample rate instead of resampling to 32 kHz."
          ]
        },
        {
          "metric": "loudness-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "loudness_ecma"
          ],
          "scope": "mono only",
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "validation_scope": "calibration signal only; outside the allowed adjustment",
          "validation_details": [
            "Checked at the calibration signal only, where it gives 0.9843 sone_HMS (−1.55 %)."
          ]
        },
        {
          "metric": "tonality-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "tonality_ecma"
          ],
          "scope": "mono only",
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "validation_scope": "calibration signal only",
          "validation_details": [
            "Checked at the calibration signal only."
          ]
        },
        {
          "metric": "roughness-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "roughness_ecma"
          ],
          "scope": "mono only; no entropy weighting",
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "validation_scope": "calibration signal only",
          "validation_details": [
            "Checked at the calibration signal only."
          ]
        },
        {
          "metric": "fluctuation-strength-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "fluctuation_strength_ecma"
          ],
          "scope": "mono only",
          "status": "available",
          "since": "3.3.0",
          "validation": "standard-data",
          "validation_scope": "calibration signal only",
          "validation_details": [
            "Checked at the calibration signal only (0.993 vacil_HMS)."
          ],
          "note": "Misprints found in Clause 9 are listed in the project's errata."
        },
        {
          "metric": "sharpness",
          "reference": "din-45692-2009",
          "functions": [
            "sharpness_din",
            "sharpness_din_from_specific"
          ],
          "scope": "also the informative Aures and von Bismarck variants",
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "validation_details": [
            "Checked with the DIN 45692 reference signal and Tables A.2 and A.3."
          ]
        },
        {
          "metric": "fluctuation-strength-osses",
          "reference": "osses-2016",
          "functions": [
            "fluctuation_strength"
          ],
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with the literature values in Table 1 of Osses et al. (2016): for amplitude-modulated 70 dB tones the Pearson correlation is about 0.98, within a factor of about 2.1 at every point. SQAT's `FluctuationStrength_Osses2016` was consulted as a numeric reference for the shape of the sweep.",
            "Validated for amplitude modulation only; a steady 1 kHz tone reads about 0.09 vacil."
          ]
        },
        {
          "metric": "fluctuation-strength-osses",
          "reference": "fastl-zwicker-2007",
          "functions": [
            "fluctuation_strength_am_noise"
          ],
          "scope": "closed-form expression for amplitude-modulated noise",
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "validation_details": [
            "A conformance row checks Eq. (10.2) of Fastl & Zwicker for amplitude-modulated broadband noise."
          ]
        },
        {
          "metric": "psychoacoustic-annoyance",
          "reference": "zwicker-fastl-1999",
          "functions": [
            "psychoacoustic_annoyance",
            "psychoacoustic_annoyance_from_signal"
          ],
          "status": "available",
          "since": "3.1.0",
          "validation": "self-tests",
          "validation_details": [
            "Tests compare one set of inputs (N5 = 30 sone, S = 2.0 acum, F = 0.5 vacil, R = 0.3 asper) with the value worked out by hand from Eqs. 16.2–16.4 (37.0478, within 0.001) and check the terms of the formula; no published example is used."
          ],
          "note": "Follows Eqs. 16.2–16.4 of Fastl & Zwicker (2007), the textbook form of Widmann's model."
        },
        {
          "metric": "tone-to-noise-prominence-ratio",
          "reference": "ecma-418-1-ed3",
          "functions": [
            "tone_to_noise_ratio",
            "prominence_ratio",
            "assess_tones"
          ],
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "validation_scope": "formula examples; no published TNR or PR value",
          "validation_details": [
            "Tests check worked examples printed in ECMA-418-1:2024: the critical band at 500 Hz and 1 kHz (Clause 10, Formula 2), its band edges at 1 kHz (Clause 12.2) and the proximity spacing at 150 and 850 Hz (Clause 11.6, Formula 14).",
            "TNR and PR of a 1 kHz tone in white noise are compared with the values expected from the standard's formulas (within 0.4 dB for TNR and 0.1 dB for PR); no TNR or PR value published in the standard is checked."
          ],
          "note": "The \"prominent\" flag applies the numeric criterion only."
        },
        {
          "metric": "tonal-audibility-iso-20065",
          "reference": "iso-pas-20065-2016",
          "functions": [
            "tone_audibility",
            "analyze_spectrum",
            "audibility_from_levels",
            "mean_audibility",
            "audibility_uncertainty"
          ],
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "compared_with": [
            "DIN 45681 Annex J reference program"
          ],
          "validation_details": [
            "Reproduces the Annex E worked example.",
            "Parts are checked against DIN 45681:2005 and its Annex J reference program."
          ],
          "note": "Follows the 2016 PAS, not the 2022 TS. Does not apply the A-weighting required by clause 5.3.2. DIN 45681 itself is not implemented."
        },
        {
          "metric": "equal-loudness-contours",
          "reference": "iso-226-2023",
          "functions": [
            "equal_loudness_contour",
            "equal_loudness_contours",
            "loudness_level",
            "hearing_threshold"
          ],
          "status": "available",
          "since": "3.1.0",
          "validation": "standard-data",
          "validation_details": [
            "Tests compare 17 points of Table B.1 (20 to 90 phon, 20 Hz to 12.5 kHz) and 6 points of Table B.2 with the computed contours and loudness levels, within 0.05 dB or phon, and the hearing threshold with Table 1."
          ]
        },
        {
          "metric": "tonal-audibility-iso-1996-2",
          "reference": "iso-1996-2-2007",
          "scope": "Annex C; in the phonometry.environment namespace",
          "status": "available",
          "validation": "not-stated"
        },
        {
          "metric": "tonal-audibility-iso-1996-2",
          "reference": "iso-1996-2-2017",
          "scope": "Annex K survey method and Table J.1; in the phonometry.environment namespace",
          "status": "available",
          "validation": "not-stated"
        },
        {
          "metric": "tonal-audibility-iec-61400-11",
          "reference": "iec-61400-11-2012",
          "functions": [
            "wind_turbine_tonality"
          ],
          "status": "available",
          "validation": "not-stated"
        },
        {
          "metric": "impulsiveness",
          "reference": "nt-acou-112-2002",
          "scope": "in the phonometry.environment namespace",
          "status": "available",
          "validation": "not-stated"
        },
        {
          "metric": "impulsiveness",
          "reference": "iso-pas-1996-3-2022",
          "scope": "in the phonometry.environment namespace",
          "status": "available",
          "validation": "not-stated"
        },
        {
          "metric": "epnl",
          "reference": "icao-annex-16-vol-1",
          "scope": "PNL, PNLT and EPNL, in the phonometry.aircraft namespace",
          "status": "available",
          "validation": "standard-data",
          "validation_details": [
            "Tested with the EPNL example of ICAO Doc 9501 (Environmental Technical Manual)."
          ]
        }
      ],
      "cite": {
        "doi": "10.5281/zenodo.21215280",
        "cff": "https://github.com/jmrplens/phonometry/blob/main/CITATION.cff"
      },
      "sources": [
        "https://github.com/jmrplens/phonometry/blob/main/README.md",
        "https://github.com/jmrplens/phonometry/blob/main/CHANGELOG.md",
        "https://github.com/jmrplens/phonometry/blob/main/docs/CONFORMANCE.md",
        "https://github.com/jmrplens/phonometry/blob/main/docs/ERRATA.md",
        "https://github.com/jmrplens/phonometry/blob/main/tests/psychoacoustics/quality/test_tonality.py",
        "https://github.com/jmrplens/phonometry/blob/main/tests/psychoacoustics/quality/test_annoyance.py",
        "https://github.com/jmrplens/phonometry/blob/main/tests/psychoacoustics/loudness/test_contours.py",
        "https://github.com/jmrplens/phonometry/blob/main/CITATION.cff",
        "https://github.com/jmrplens/phonometry/blob/main/paper/paper.md",
        "https://jmrplens.github.io/phonometry/",
        "https://pypi.org/project/phonometry/",
        "https://github.com/jmrplens/phonometry/blob/main/src/phonometry/psychoacoustics/quality/fluctuation_strength.py"
      ],
      "checked": "2026-10-08",
      "url": "https://zhenxianli.github.io/LISQM/projects/phonometry.html",
      "last_commit": "2026-10-14",
      "latest_release": {
        "version": "v3.3.0",
        "date": "2026-07-26",
        "source": "GitHub release"
      },
      "prerelease": {
        "date": "2026-09-10",
        "version": "4.0.0rc1"
      },
      "activity": "active",
      "archived": false,
      "stars": 125,
      "group": "newly-released"
    },
    {
      "id": "psychoacousticmetrics-jl",
      "name": "PsychoacousticMetrics.jl",
      "repository": "https://github.com/slink/PsychoacousticMetrics.jl",
      "languages": [
        "Julia"
      ],
      "kind": "library",
      "language_note": "Builds on ZwickerLoudness.jl by the same author: sharpness takes its loudness result, and the time-varying annoyance takes the output of ZwickerLoudnessAudio.jl's `loudness_zwtv`. Roughness and fluctuation strength take audio.",
      "standing": "newly-released",
      "standing_note": "First registered in July 2026.",
      "license": "MIT",
      "license_note": "Test data, the roughness implementation and several weighting tables are derived from MoSQITo (Apache-2.0); fluctuation-strength tables and annoyance constants reference SQAT (CC BY-NC 4.0) as factual data, without reusing its code (README, `test/data/NOTICE`).",
      "packages": [
        {
          "registry": "julia",
          "name": "PsychoacousticMetrics"
        }
      ],
      "install": "using Pkg; Pkg.add(\"PsychoacousticMetrics\")",
      "maintainers": [
        "slink"
      ],
      "summary": "Julia package for the Zwicker family of sound-quality metrics on top of ZwickerLoudness.jl: DIN 45692:2009 sharpness (with Aures, von Bismarck and Fastl weightings), Daniel & Weber roughness, Osses et al. (2016) fluctuation strength and Widmann (1992) psychoacoustic annoyance.",
      "ai_assistance": "not-stated",
      "notes": [
        "Roughness follows MoSQITo's `roughness_dw` (\"as implemented by MoSQITo\"), not Daniel and Weber's original code.",
        "Annoyance comes in two forms: the canonical percentile convention (N5, S5, R5 and FS5 from time-varying tracks, since 0.5.0) and a documented stationary approximation from whole-signal values (since 0.4.0)."
      ],
      "implements": [
        {
          "metric": "sharpness",
          "reference": "din-45692-2009",
          "functions": [
            "sharpness"
          ],
          "scope": "weightings: DIN 45692 (default), Aures, von Bismarck, Fastl; from a ZwickerLoudness.jl result",
          "status": "available",
          "since": "0.2.0",
          "validation": "standard-data",
          "compared_with": [
            "mosqito"
          ],
          "uses": [
            "zwickerloudness-jl"
          ],
          "validation_details": [
            "Tested against all 41 reference signals of DIN 45692:2009 chapter 6 (21 narrowband, 20 broadband) within the standard's tolerance of ±max(5 %, 0.05 acum).",
            "Cross-checked against MoSQITo for all four weightings.",
            "Total loudness N is computed as the Riemann sum over the 240-bin specific loudness (`0.1 * sum`), not taken from `ZwickerResult.loudness` (see the `sharpness` docstring)."
          ]
        },
        {
          "metric": "roughness-daniel-weber",
          "reference": "daniel-weber-1997",
          "functions": [
            "roughness_dw"
          ],
          "status": "available",
          "since": "0.2.0",
          "validation": "standard-data",
          "compared_with": [
            "mosqito"
          ],
          "derived_from": [
            "mosqito"
          ],
          "validation_details": [
            "Tested against the Zwicker & Fastl reference curves on MoSQITo's validation grid (7 carrier × 11 modulation frequencies) within ±0.1 asper, and cross-checked against MoSQITo's `roughness_dw` on identical signals.",
            "Five points at a 2 kHz carrier miss the ±0.1 asper gate. MoSQITo misses them by the same amount (and overshoots Daniel & Weber's own curve there by 15–31 %), so these five are checked for agreement with MoSQITo to 5e-3 asper instead.",
            "Against the Daniel & Weber curves themselves, 63 of the 77 grid points are within 30 % of the reference (reported, not gated)."
          ]
        },
        {
          "metric": "fluctuation-strength-osses",
          "reference": "osses-2016",
          "functions": [
            "fluctuation_strength_osses"
          ],
          "status": "available",
          "since": "0.3.0",
          "validation": "reference-code",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Cross-checked against SQAT's `FluctuationStrength_Osses2016`, run under Octave, on identical signals: 26 cases, including all 18 points of Fastl & Zwicker's AM/FM reference grid (Osses 2018 thesis, Table B.1), each reproduced to a relative tolerance of 1e-6 (measured 3e-9).",
            "The grid stimuli are synthesised following the Osses et al. (2016) validation files that SQAT's own validation reads; the tests also check that each synthetic stimulus gives the value SQAT gives on the real file (tones to 5e-3, noise to 25 % across random draws).",
            "Against the published curves, 11 of the 18 points are within 30 %, and exactly those 11 are gated. The other seven are misses of the reference model itself (FM tones with a modulation frequency above 4 Hz overestimated three- to fourfold, thesis §B.4.1; the shoulder and tail points of AM tones and noise), which SQAT's own validation figures also show."
          ],
          "conventions": [
            "Needs audio at 44.1 or 48 kHz (an error otherwise); SQAT resamples other rates itself."
          ]
        },
        {
          "metric": "psychoacoustic-annoyance",
          "reference": "widmann-1992",
          "functions": [
            "psychoacoustic_annoyance_widmann"
          ],
          "scope": "percentile convention (N5, S5, R5, FS5) and a stationary approximation",
          "status": "available",
          "since": "0.4.0",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "uses": [
            "zwickerloudness-jl"
          ],
          "validation_details": [
            "Cross-checked against SQAT's `PsychoacousticAnnoyance_Widmann1992`: an 840-case formula grid, reproduced bit-exactly, and six signal-level cases with SQAT's own N5, S5, R5 and FS5 vendored, so that every deviation is attributed to a component.",
            "Checked at the published 1 au anchor (a 1 kHz tone at 40 dB SPL): on the 4 s cross-check case, the percentile convention lands 0.1 % from it and the stationary approximation 0.8 %; on the README's 5 s examples, 0.3 % and 1.4 %."
          ],
          "conventions": [
            "The percentile form needs 48 kHz input.",
            "Percentiles are Hyndman–Fan type 7 quantiles (linear interpolation); SQAT takes the nearest rank, which the README says differs by a full order-statistic step on the coarse fluctuation-strength track."
          ]
        }
      ],
      "cite": {
        "text": "The README links a [Zenodo DOI](https://zenodo.org/badge/latestdoi/1292553110) for the latest version."
      },
      "sources": [
        "https://github.com/slink/PsychoacousticMetrics.jl",
        "https://github.com/slink/PsychoacousticMetrics.jl/blob/main/README.md#conformance",
        "https://github.com/slink/PsychoacousticMetrics.jl/blob/main/test/data/NOTICE",
        "https://github.com/slink/PsychoacousticMetrics.jl/blob/main/Project.toml",
        "https://github.com/JuliaRegistries/General/tree/master/P/PsychoacousticMetrics"
      ],
      "checked": "2026-10-08",
      "url": "https://zhenxianli.github.io/LISQM/projects/psychoacousticmetrics-jl.html",
      "last_commit": "2026-09-03",
      "latest_release": {
        "version": "v0.5.0",
        "date": "2026-09-02",
        "source": "GitHub release"
      },
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": 1,
      "group": "newly-released"
    },
    {
      "id": "rota-order",
      "name": "rota-order",
      "full_name": "ROTA: Rotational Order Tracking and Analysis",
      "repository": "https://github.com/ZhenxianLi/rota-order",
      "docs": "https://github.com/ZhenxianLi/rota-order#readme",
      "languages": [
        "Python"
      ],
      "kind": "library",
      "language_note": "Python 3.10 or newer; depends only on NumPy and SciPy. The PyPI package is `rota-order`, imported as `rota`. The wrappers of `rota.bridges` (since version 0.6.0) call MoSQITo or sottek-hearing-model in Python, and SQAT in a local MATLAB through the MATLAB Engine API for Python; all three are optional and installed by the user. The figures of `rota.plot` (since 0.7.0) need Matplotlib, also optional.",
      "standing": "newly-released",
      "standing_note": "First released in October 2026; the README calls it pre-alpha.",
      "license": "GPL-3.0-or-later",
      "packages": [
        {
          "registry": "pypi",
          "name": "rota-order"
        }
      ],
      "install": "pip install rota-order",
      "maintainers": [
        "Zhenxian LI"
      ],
      "summary": "Order analysis of noise and vibration from rotating machinery such as engines, electric motors and gearboxes. It finds the shaft speed from a tachometer or from the signal itself, resamples signals to the shaft angle, computes Campbell and order maps, extracts and removes orders with a Vold-Kalman filter, resynthesises sound from order tables and plots these results. On top of this it computes the ECMA-418-1:2024 tone-to-noise ratio and prominence ratio of machine orders along a run-up, and its wrappers compute loudness, sharpness, roughness and tonality with MoSQITo, sottek-hearing-model or SQAT and bin the results along rpm.",
      "ai_assistance": "disclosed",
      "ai_note": "The README says that Claude (Anthropic) was used as an assistant during development.",
      "notes": [
        "The order analysis follows the published literature cited in each docstring and is tested on synthetic signals with known speed, angle and order amplitudes; the README gives the tolerances, for example 0.2 dB for order amplitudes on stationary segments.",
        "Versions 0.6.0 (the wrappers of `rota.bridges`) and 0.7.0 (the figures of `rota.plot`) were released on 2026-10-28, both tagged and on PyPI.",
        "The README places the psychoacoustic metrics themselves (loudness, sharpness, roughness, tonality) outside the project's scope. The wrappers of `rota.bridges` call the public functions of the toolboxes at run time, never copy their code, and state each toolbox's licence and how its authors ask to be cited.",
        "The repository was renamed from ROTA to rota-order in October 2026; the old address redirects."
      ],
      "conventions": [
        {
          "text": "The method `vs_rpm` of 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.",
          "metrics": [
            "loudness-zwicker",
            "sharpness",
            "roughness-daniel-weber"
          ]
        },
        {
          "text": "For the ECMA-418-2 metrics, `vs_rpm` takes by default the mean of the loudness and the tonality in each speed bin, the tonality only above 0.02 tu_HMS, and the 90th percentile of the roughness, after about 0.3 s (0.6 s for SQAT's tonality).",
          "metrics": [
            "loudness-ecma-418-2",
            "tonality-ecma-418-2",
            "roughness-ecma-418-2"
          ]
        },
        "Input in any unit is turned into sound pressure in Pa by an explicit calibration factor and resampled to 48 kHz."
      ],
      "caveats": [
        "Very new (first released in October 2026) and not yet seen to be widely used in the community; no independent verification has been published.",
        "The README calls the current version pre-alpha and says that functions and signatures may still change before 1.0.",
        "The SQAT wrappers need a licensed local MATLAB with the Signal Processing Toolbox and a checkout of SQAT v2.0."
      ],
      "implements": [
        {
          "metric": "tone-to-noise-prominence-ratio",
          "reference": "ecma-418-1-ed3",
          "functions": [
            "rota.tonal.tone_prominence",
            "rota.tonal.order_prominence",
            "rota.tonal.prominence_criterion"
          ],
          "scope": "tones in a power spectrum, and orders of a rotating machine along a run-up",
          "status": "available",
          "since": "0.5.0",
          "validation": "standard-data",
          "validation_scope": "formula examples; no published TNR or PR value",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "Tests check worked examples printed in ECMA-418-1:2024: the critical bandwidth at 500 Hz and 1 kHz (Clause 10), the band edges at 1 kHz (Clause 12.2) and the proximity spacing at 150 and 850 Hz (Clause 11.6). The criteria are checked at 100 Hz, 1 kHz and 5 kHz.",
            "TNR and PR of tones at 140 Hz, 1 kHz and 3 kHz in white noise are compared with the values that the standard's formulas give for the known tone and noise powers, within 0.5 dB; on spectra built line by line they agree to within 1e-9 dB for TNR and 0.03 dB for PR. No TNR or PR value published in the standard is checked.",
            "For an order in a synthetic run-up, `order_prominence` gives the TNR within 1 dB of the analytic value in every speed bin, with a mean error below 0.4 dB.",
            "A test compares the TNR of tones at 130 Hz to 4 kHz in flat noise with MoSQITo's `tnr_ecma_st` and requires agreement within 1.5 dB. MoSQITo follows ECMA-74:2019, so the comparison crosses editions. The test runs only where MoSQITo is installed, which the project's continuous integration does not do."
          ],
          "conventions": [
            "`order_prominence` analyses orders on the order-tracked (angle-domain) spectrum, so that an order stays one spectral line in every frame of a run-up. The docstring and a test show that a fixed time window long enough for the resolution the standard asks for at low frequency spreads a fast-sweeping order over the band and biases its TNR low, by about 19 dB in the test case.",
            "Where the text of the 3rd edition is inconsistent, the module notes how it is read: the secondary tone is added in Formulae (A.7) and (A.8), the tone spacing is |f_s − f_p|, 500 Hz takes arithmetic centring, the criteria cover 89.1 Hz to 11 200 Hz, and the misprints of Formulae (21) and (23) are resolved with their Annex B counterparts."
          ],
          "note": "The \"prominent\" flag applies the numeric criterion only; the aural check of audibility (Sections 11.8 and 12.8) is not assessed."
        },
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "rota.bridges.mosqito.loudness"
          ],
          "scope": "time-varying, through MoSQITo's loudness_zwtv",
          "status": "available",
          "since": "0.6.0",
          "via": "mosqito",
          "validation": "self-tests",
          "validation_details": [
            "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_rpm` gives what binning the values by hand gives."
          ]
        },
        {
          "metric": "sharpness",
          "reference": "din-45692-2009",
          "functions": [
            "rota.bridges.mosqito.sharpness"
          ],
          "scope": "through MoSQITo's sharpness_din_from_loudness",
          "status": "available",
          "since": "0.6.0",
          "via": "mosqito",
          "validation": "self-tests",
          "validation_details": [
            "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, also when the sharpness is computed from an earlier loudness result."
          ]
        },
        {
          "metric": "roughness-daniel-weber",
          "reference": "daniel-weber-1997",
          "functions": [
            "rota.bridges.mosqito.roughness"
          ],
          "scope": "through MoSQITo's roughness_dw",
          "status": "available",
          "since": "0.6.0",
          "via": "mosqito",
          "validation": "self-tests",
          "validation_details": [
            "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."
          ]
        },
        {
          "metric": "tonality-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "rota.bridges.sottek_hearing_model.tonality"
          ],
          "scope": "through sottek-hearing-model's shm_tonality_ecma",
          "status": "available",
          "since": "0.6.0",
          "via": "sottek-hearing-model",
          "validation": "self-tests",
          "validation_details": [
            "Tests, which run only where sottek-hearing-model is installed (the project's continuous integration does not install it), check that the wrappers return what direct calls of the package give, that one speed bin reproduces the package's single values, and that the dominant tonal frequency of a tone in noise maps to its order."
          ]
        },
        {
          "metric": "loudness-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "rota.bridges.sottek_hearing_model.loudness"
          ],
          "scope": "through sottek-hearing-model's shm_loudness_ecma_from_comp",
          "status": "available",
          "since": "0.6.0",
          "via": "sottek-hearing-model",
          "validation": "self-tests",
          "validation_details": [
            "Tests, which run only where sottek-hearing-model is installed (the project's continuous integration does not install it), check that the wrapper returns what a direct call of the package gives."
          ]
        },
        {
          "metric": "roughness-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "rota.bridges.sottek_hearing_model.roughness"
          ],
          "scope": "through sottek-hearing-model's shm_roughness_ecma",
          "status": "available",
          "since": "0.6.0",
          "via": "sottek-hearing-model",
          "validation": "self-tests",
          "validation_details": [
            "Tests, which run only where sottek-hearing-model is installed (the project's continuous integration does not install it), check that the wrapper returns what a direct call of the package gives."
          ]
        },
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "rota.bridges.sqat.loudness"
          ],
          "scope": "time-varying, through SQAT v2.0's Loudness_ISO532_1 in MATLAB",
          "status": "available",
          "since": "0.6.0",
          "via": "sqat",
          "validation": "self-tests",
          "validation_details": [
            "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."
          ]
        },
        {
          "metric": "sharpness",
          "reference": "din-45692-2009",
          "functions": [
            "rota.bridges.sqat.sharpness"
          ],
          "scope": "through SQAT v2.0's Sharpness_DIN45692_from_loudness in MATLAB",
          "status": "available",
          "since": "0.6.0",
          "via": "sqat",
          "validation": "self-tests",
          "validation_details": [
            "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."
          ]
        },
        {
          "metric": "roughness-daniel-weber",
          "reference": "daniel-weber-1997",
          "functions": [
            "rota.bridges.sqat.roughness"
          ],
          "scope": "through SQAT v2.0's Roughness_Daniel1997 in MATLAB",
          "status": "available",
          "since": "0.6.0",
          "via": "sqat",
          "validation": "self-tests",
          "validation_details": [
            "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."
          ]
        },
        {
          "metric": "tonality-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "rota.bridges.sqat.tonality"
          ],
          "scope": "through SQAT v2.0's Tonality_ECMA418_2 in MATLAB",
          "status": "available",
          "since": "0.6.0",
          "via": "sqat",
          "validation": "self-tests",
          "validation_details": [
            "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."
          ]
        }
      ],
      "cite": {
        "text": "The README points to `CITATION.cff` (\"Cite this repository\" on GitHub); a Zenodo DOI is planned for version 1.0.",
        "cff": "https://github.com/ZhenxianLi/rota-order/blob/main/CITATION.cff"
      },
      "sources": [
        "https://github.com/ZhenxianLi/rota-order/blob/main/README.md",
        "https://github.com/ZhenxianLi/rota-order/blob/main/LICENSE",
        "https://github.com/ZhenxianLi/rota-order/blob/main/CITATION.cff",
        "https://github.com/ZhenxianLi/rota-order/blob/main/CHANGELOG.md",
        "https://github.com/ZhenxianLi/rota-order/blob/main/src/rota/_prominence.py",
        "https://github.com/ZhenxianLi/rota-order/blob/main/src/rota/bridges/__init__.py",
        "https://github.com/ZhenxianLi/rota-order/blob/main/src/rota/bridges/_common.py",
        "https://github.com/ZhenxianLi/rota-order/blob/main/src/rota/bridges/mosqito.py",
        "https://github.com/ZhenxianLi/rota-order/blob/main/src/rota/bridges/sottek_hearing_model.py",
        "https://github.com/ZhenxianLi/rota-order/blob/main/src/rota/bridges/sqat.py",
        "https://github.com/ZhenxianLi/rota-order/blob/main/tests/test_prominence.py",
        "https://github.com/ZhenxianLi/rota-order/blob/main/tests/test_bridge_mosqito.py",
        "https://github.com/ZhenxianLi/rota-order/blob/main/tests/test_bridge_shm.py",
        "https://github.com/ZhenxianLi/rota-order/blob/main/tests/test_bridges.py",
        "https://github.com/ZhenxianLi/rota-order/blob/main/tests/test_bridges_sqat.py",
        "https://github.com/ZhenxianLi/rota-order/blob/main/pyproject.toml",
        "https://github.com/ZhenxianLi/rota-order/blob/main/.github/workflows/tests.yml",
        "https://pypi.org/project/rota-order/"
      ],
      "checked": "2026-10-28",
      "url": "https://zhenxianli.github.io/LISQM/projects/rota-order.html",
      "last_commit": "2026-10-28",
      "latest_release": {
        "version": "0.7.0",
        "date": "2026-10-28",
        "source": ""
      },
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": null,
      "group": "newly-released"
    },
    {
      "id": "soundpalette",
      "name": "SoundPalette",
      "repository": "https://github.com/onyx-prismantium/soundpalette",
      "languages": [
        "C++"
      ],
      "kind": "application",
      "language_note": "C++: a static library, a command-line tool and a desktop app.",
      "standing": "newly-released",
      "standing_note": "Its psychoacoustic metrics were added in July 2026 (v0.5.0).",
      "license": "FSL-1.1-Apache-2.0",
      "license_note": "Functional Source License 1.1, a source-available licence that is not OSI-approved: it allows any use except a competing commercial product or service, and each release becomes Apache-2.0 two years after publication. The README states that releases up to and including v0.7.0 were published under Apache-2.0.",
      "maintainers": [
        "onyx-prismantium"
      ],
      "summary": "C++ tool for game audio that analyses a folder of sound effects and draws each file as a glyph in a palette, built as a static library, a command-line tool (including a lint mode for CI) and a desktop app. Its psychoacoustic block reports ISO 532-1 loudness (N5), DIN 45692 sharpness, Daniel & Weber roughness and an experimental fluctuation strength.",
      "ai_assistance": "disclosed",
      "ai_note": "The repository contains a `CLAUDE.md` file, and 49 of its 54 commits carry \"Co-Authored-By: Claude\" trailers.",
      "notes": [
        "The psychoacoustic metrics were added in v0.5.0 (July 2026), with \"mapping v2\".",
        "Calibration convention: a signal measuring −23 LUFS is assumed to play at `ref_spl` dB SPL (default 75, allowed range 60–85). The value is stored in every manifest and profile, and comparisons between different `ref_spl` values are refused.",
        "Also computes fluctuation strength in vacil, flagged as experimental; the README names no model for it."
      ],
      "caveats": [
        "The Functional Source License is source-available, not an OSI-approved open-source licence; check its competing-use restriction before reusing the code.",
        "`NOTES.md` documents simplifications: the third-octave bands come from an STFT rather than the standard's filter bank, the temporal processing was tuned to MoSQITo's N5 values, and roughness uses a fixed 70 Hz weighting and 28 instead of 47 channels. Tolerances (±5 % for stationary loudness and sharpness, ±10 % for N5, ±15 % for roughness) are the acceptance criterion.",
        "Loudness in sones depends on the declared playback level (`ref_spl`), not on a measured calibration."
      ],
      "implements": [
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "sp::compute_psycho"
          ],
          "scope": "time-varying, reported as N5; monaural",
          "status": "available",
          "since": "v0.5.0",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "Compared with MoSQITo 1.2.1 on calibrated test signals, used as a development-time reference (`NOTES.md`, `tools/psycho_oracle`)."
          ],
          "note": "No MoSQITo code is ported."
        },
        {
          "metric": "sharpness",
          "reference": "din-45692-2009",
          "functions": [
            "sp::compute_psycho"
          ],
          "scope": "from time-averaged specific loudness",
          "status": "available",
          "since": "v0.5.0",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "Compared with MoSQITo 1.2.1 (tolerance ±5 %)."
          ]
        },
        {
          "metric": "roughness-daniel-weber",
          "reference": "daniel-weber-1997",
          "functions": [
            "sp::compute_psycho"
          ],
          "status": "available",
          "since": "v0.5.0",
          "validation": "cross-implementation",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "Compared with MoSQITo 1.2.1 with a wider tolerance (±15 %); the README notes that published Daniel & Weber implementations differ by about 10–20 %."
          ]
        }
      ],
      "sources": [
        "https://github.com/onyx-prismantium/soundpalette",
        "https://github.com/onyx-prismantium/soundpalette/blob/main/README.md",
        "https://github.com/onyx-prismantium/soundpalette/blob/main/LICENSE.md",
        "https://github.com/onyx-prismantium/soundpalette/blob/main/NOTES.md",
        "https://github.com/onyx-prismantium/soundpalette/blob/main/core/include/soundpalette/psycho.h"
      ],
      "checked": "2026-10-06",
      "url": "https://zhenxianli.github.io/LISQM/projects/soundpalette.html",
      "last_commit": "2026-09-27",
      "latest_release": {
        "version": "v0.8.0",
        "date": "2026-09-27",
        "source": ""
      },
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": 0,
      "group": "newly-released"
    },
    {
      "id": "torch-amt",
      "name": "torch_amt",
      "repository": "https://github.com/StefanoGiacomelli/torch_amt",
      "docs": "https://torch-amt.readthedocs.io/",
      "languages": [
        "Python"
      ],
      "kind": "library",
      "based_on": "amt",
      "language_note": "PyTorch: differentiable, and runs on GPU.",
      "standing": "newly-released",
      "standing_note": "First released in February 2026.",
      "license": "GPL-3.0-or-later",
      "packages": [
        {
          "registry": "pypi",
          "name": "torch-amt"
        }
      ],
      "install": "pip install torch-amt",
      "maintainers": [
        "Stefano Giacomelli"
      ],
      "summary": "PyTorch implementations of models from the MATLAB Auditory Modeling Toolbox (AMT), differentiable and able to run on GPU. For loudness it has the time-varying models of Glasberg & Moore (2002) and Moore et al. (2016, binaural).",
      "ai_assistance": "not-stated",
      "notes": [
        "The README asks users to cite both the software and the AMT paper (Majdak, Hollomey & Baumgartner, 2022).",
        "The other models in the package (Dau1997, King2019, Osses2021, Paulick2024) are not psychoacoustic metrics in the sense of this list. There is no port of AMT's `moore1997`, `chen2011` or `bramslow2004`, and no roughness, sharpness or fluctuation strength."
      ],
      "caveats": [
        "The documentation claims \"Matching MATLAB AMT v1.6.0 implementations\", but the tests contain no stored AMT or MATLAB reference outputs."
      ],
      "implements": [
        {
          "metric": "loudness-moore-glasberg-time-varying",
          "reference": "glasberg-moore-2002",
          "functions": [
            "torch_amt.models.Glasberg2002"
          ],
          "scope": "short-term and long-term loudness",
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "amt"
          ],
          "validation_details": [
            "Agreement with AMT is claimed in the documentation, without stored reference data."
          ],
          "note": "Ported from AMT `glasberg2002`."
        },
        {
          "metric": "loudness-moore-glasberg-time-varying",
          "reference": "moore-2016",
          "functions": [
            "torch_amt.models.Moore2016"
          ],
          "scope": "binaural",
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "amt"
          ],
          "validation_details": [
            "Agreement with AMT is claimed in the documentation, without stored reference data."
          ],
          "note": "Described as a \"1:1 port\" of AMT `moore2016`, with outer and middle ear per ANSI S3.4-2007 (docstring)."
        }
      ],
      "cite": {
        "cff": "https://github.com/StefanoGiacomelli/torch_amt/blob/main/CITATION.cff"
      },
      "sources": [
        "https://github.com/StefanoGiacomelli/torch_amt",
        "https://github.com/StefanoGiacomelli/torch_amt/blob/main/README.md",
        "https://github.com/StefanoGiacomelli/torch_amt/blob/main/docs/source/index.rst",
        "https://pypi.org/project/torch-amt/"
      ],
      "checked": "2026-10-06",
      "url": "https://zhenxianli.github.io/LISQM/projects/torch-amt.html",
      "last_commit": "2026-03-19",
      "latest_release": {
        "version": "0.2.0",
        "date": "2026-02-10",
        "source": "PyPI"
      },
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": 3,
      "group": "newly-released"
    },
    {
      "id": "zwickerloudness-jl",
      "name": "ZwickerLoudness.jl",
      "repository": "https://github.com/slink/ZwickerLoudness.jl",
      "languages": [
        "Julia"
      ],
      "kind": "library",
      "language_note": "Takes one-third-octave band levels, not audio; ZwickerLoudnessAudio.jl adds that.",
      "standing": "newly-released",
      "standing_note": "First registered in February 2026.",
      "license": "MIT",
      "packages": [
        {
          "registry": "julia",
          "name": "ZwickerLoudness"
        }
      ],
      "install": "using Pkg; Pkg.add(\"ZwickerLoudness\")",
      "maintainers": [
        "slink"
      ],
      "summary": "Julia package that computes ISO 532-1:2017 Zwicker loudness from one-third-octave band levels: the stationary method (clause 5) from 28 band levels and, since v0.3.0, the time-varying method (clause 6) with N5 and N10 from a band-level time series. It does not take audio; ZwickerLoudnessAudio.jl is its front end for waveforms.",
      "ai_assistance": "not-stated",
      "notes": [
        "Version 0.1.0 (February 2026) was described as \"ISO 532B\" and was never registered; the code was rewritten for ISO 532-1:2017 in 0.2.0, the first version in the Julia General registry (2026-02-11).",
        "The time-varying kernel takes a 28 × n matrix of band levels at the standard's 2000 Hz block rate. Its transcription reference is MoSQITo's `loudness_zwtv` at commit `d990c33f94f1`.",
        "Free-field and diffuse-field listening conditions are supported."
      ],
      "caveats": [
        "N5 and N10 use Hyndman–Fan type 7 quantiles; the README notes that MATLAB's `prctile` (type 5), used by SQAT, can differ by a few percent on the same data."
      ],
      "implements": [
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "zwicker_loudness"
          ],
          "scope": "stationary, from 28 one-third-octave band levels",
          "status": "available",
          "since": "0.2.0",
          "validation": "standard-data",
          "validation_scope": "one Annex B signal",
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "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)."
          ]
        },
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "zwicker_loudness_time_varying"
          ],
          "scope": "time-varying, from band levels at 2000 Hz; N5 and N10",
          "status": "available",
          "since": "0.3.0",
          "validation": "standard-data",
          "validation_scope": "one Annex B signal",
          "derived_from": [
            "mosqito"
          ],
          "compared_with": [
            "mosqito"
          ],
          "validation_details": [
            "Stages are tested against MoSQITo `loudness_zwtv` intermediates (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."
          ]
        }
      ],
      "cite": {
        "text": "The README links a [Zenodo DOI](https://zenodo.org/badge/latestdoi/1152458596) for the latest version."
      },
      "sources": [
        "https://github.com/slink/ZwickerLoudness.jl",
        "https://github.com/slink/ZwickerLoudness.jl/blob/main/README.md",
        "https://github.com/slink/ZwickerLoudness.jl/blob/main/test/fixtures/NOTICE.md",
        "https://github.com/slink/ZwickerLoudness.jl/releases",
        "https://github.com/JuliaRegistries/General/tree/master/Z/ZwickerLoudness",
        "https://github.com/slink/ZwickerLoudness.jl/blob/main/src/method2.jl"
      ],
      "checked": "2026-10-08",
      "url": "https://zhenxianli.github.io/LISQM/projects/zwickerloudness-jl.html",
      "last_commit": "2026-09-02",
      "latest_release": {
        "version": "v0.3.0",
        "date": "2026-09-02",
        "source": "GitHub release"
      },
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": 4,
      "group": "newly-released"
    },
    {
      "id": "pysqat",
      "name": "pySQAT",
      "repository": "https://github.com/PALILA-TUDelft/pySQAT",
      "languages": [
        "Python"
      ],
      "kind": "library",
      "based_on": "sqat",
      "language_note": "Python port of SQAT with a PySide6 interface; its ECMA-418-2 functions call sottek-hearing-model.",
      "standing": "developing",
      "license": "none",
      "license_note": "No licence file at the repository root. The bundled copy of SQAT v1.3 (MATLAB, used as the validation reference) carries SQAT's CC-BY-NC-4.0 licence.",
      "maintainers": [
        "Gerard Mendoza Ferrandis"
      ],
      "summary": "Python port of the MATLAB toolbox SQAT (README title \"SQAT4PY\") with a PySide6 graphical interface. Covers ISO 532-1 loudness, DIN 45692 sharpness, Daniel & Weber roughness, Osses fluctuation strength, Aures tonality, three psychoacoustic annoyance models and EPNL; its ECMA-418-2 functions call sottek-hearing-model.",
      "ai_assistance": "not-stated",
      "notes": [
        "Developed since May 2025 under the PALILA-TUDelft GitHub organisation; no release or tag yet.",
        "Its PySide6 interface, `main_UI.py`, dates from January 2026. The graphical interface that SQAT added in v2.0 follows its layout, as the header of SQAT's `SQAT_GUI.m` says."
      ],
      "caveats": [
        "Without a licence, reuse rights are unclear, and the bundled MATLAB code is licensed for non-commercial use only.",
        "The ports follow SQAT v1.3 and do not include the 2026 fixes to ISO 532-1 time-varying loudness, Daniel & Weber roughness and Aures tonality that SQAT released in v2.0."
      ],
      "implements": [
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "Loudness_ISO532_1"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with SQAT v1.3, run in MATLAB, by `validation/FINAL_VAL.py`; the generated reports are not committed."
          ]
        },
        {
          "metric": "sharpness",
          "reference": "din-45692-2009",
          "functions": [
            "Sharpness_DIN45692",
            "Sharpness_DIN45692_from_loudness"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with SQAT v1.3, run in MATLAB, by `validation/FINAL_VAL.py`; the generated reports are not committed."
          ]
        },
        {
          "metric": "roughness-daniel-weber",
          "reference": "daniel-weber-1997",
          "functions": [
            "Roughness_Daniel1997"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with SQAT v1.3, run in MATLAB, by `validation/FINAL_VAL.py`; the generated reports are not committed."
          ],
          "note": "Follows SQAT v1.3, before SQAT's September 2026 rewrite."
        },
        {
          "metric": "fluctuation-strength-osses",
          "reference": "osses-2016",
          "functions": [
            "FluctuationStrength_Osses2016"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with SQAT v1.3, run in MATLAB, by `validation/FINAL_VAL.py`; the generated reports are not committed."
          ]
        },
        {
          "metric": "tonality-aures",
          "reference": "aures-1985-euphony",
          "functions": [
            "Tonality_Aures1985"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with SQAT v1.3, run in MATLAB, by `validation/FINAL_VAL.py`; the generated reports are not committed."
          ],
          "note": "A June 2026 commit corrected its calibration; it predates SQAT's September 2026 fixes."
        },
        {
          "metric": "psychoacoustic-annoyance",
          "reference": "zwicker-fastl-1999",
          "functions": [
            "PsychoacousticAnnoyance_Zwicker1999"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with SQAT v1.3, run in MATLAB, by `validation/FINAL_VAL.py`; the generated reports are not committed."
          ]
        },
        {
          "metric": "psychoacoustic-annoyance",
          "reference": "more-2010",
          "functions": [
            "PsychoacousticAnnoyance_More2010"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with SQAT v1.3, run in MATLAB, by `validation/FINAL_VAL.py`; the generated reports are not committed."
          ]
        },
        {
          "metric": "psychoacoustic-annoyance",
          "reference": "di-2016",
          "functions": [
            "PsychoacousticAnnoyance_Di2016"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with SQAT v1.3, run in MATLAB, by `validation/FINAL_VAL.py`; the generated reports are not committed."
          ]
        },
        {
          "metric": "epnl",
          "reference": "cfr-14-part-36",
          "functions": [
            "EPNL_FAR_Part36"
          ],
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared with SQAT v1.3, run in MATLAB, by `validation/FINAL_VAL.py`; the generated reports are not committed."
          ]
        },
        {
          "metric": "loudness-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "Loudness_ECMA418_2"
          ],
          "status": "available",
          "via": "sottek-hearing-model",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared by `validation/FINAL_VAL.py` with the bundled SQAT v1.3 MATLAB code, which follows ECMA-418-2:2024 (3rd edition), so the comparison crosses editions."
          ]
        },
        {
          "metric": "roughness-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "Roughness_ECMA418_2"
          ],
          "status": "available",
          "via": "sottek-hearing-model",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared by `validation/FINAL_VAL.py` with the bundled SQAT v1.3 MATLAB code, which follows ECMA-418-2:2024 (3rd edition), so the comparison crosses editions."
          ]
        },
        {
          "metric": "tonality-ecma-418-2",
          "reference": "ecma-418-2-ed4",
          "functions": [
            "Tonality_ECMA418_2"
          ],
          "status": "available",
          "via": "sottek-hearing-model",
          "validation": "cross-implementation",
          "compared_with": [
            "sqat"
          ],
          "validation_details": [
            "Compared by `validation/FINAL_VAL.py` with the bundled SQAT v1.3 MATLAB code, which follows ECMA-418-2:2024 (3rd edition), so the comparison crosses editions."
          ]
        }
      ],
      "sources": [
        "https://github.com/PALILA-TUDelft/pySQAT/blob/main/README.md",
        "https://github.com/PALILA-TUDelft/pySQAT/tree/main/validation",
        "https://github.com/PALILA-TUDelft/pySQAT/blob/main/validation/FINAL_VAL.py",
        "https://github.com/PALILA-TUDelft/pySQAT/issues/1",
        "https://github.com/PALILA-TUDelft/pySQAT/blob/main/main_UI.py",
        "https://github.com/PALILA-TUDelft/pySQAT/blob/main/original_matlab/citation.cff",
        "https://github.com/ggrecow/SQAT/blob/v2.0/gui/SQAT_GUI.m"
      ],
      "checked": "2026-10-19",
      "url": "https://zhenxianli.github.io/LISQM/projects/pysqat.html",
      "last_commit": "2026-06-27",
      "latest_release": null,
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": 6,
      "group": "developing"
    },
    {
      "id": "loudnessmodel",
      "name": "LoudnessModel",
      "repository": "https://github.com/MalcolmSlaney/LoudnessModel",
      "languages": [
        "Python"
      ],
      "kind": "research-code",
      "based_on": "js2251-iso532-3",
      "language_note": "Python translation of the Cambridge MATLAB code (tv2018), in a NumPy version and a JAX version.",
      "standing": "developing",
      "license": "BSD-2-Clause",
      "license_note": "The README also says \"The source code is provided free for any research purposes\"; the readme of the Cambridge MATLAB code tv2018.m (see iso532-3) uses similar wording and asks commercial users to contact Brian C. J. Moore.",
      "maintainers": [
        "Jeremy JX Hsiao",
        "Malcolm Slaney"
      ],
      "summary": "Python translation of the Cambridge MATLAB code for the TVL2018 loudness model: Moore et al. (2016) with the revised time constants of Moore et al. (2018). Computes instantaneous, short-term and long-term loudness, in a NumPy version and a JAX version.",
      "ai_assistance": "not-stated",
      "notes": [
        "The README credits Brian C. J. Moore, Brian R. Glasberg and Josef Schlittenlacher for the MATLAB model and links the original MATLAB code (the first download on https://www.psychol.cam.ac.uk/hearing#programs). That page now needs a University of Cambridge login; an [archived copy](https://web.archive.org/web/20251123130736/https://www.psychol.cam.ac.uk/hearing) from November 2025 still links the code, an earlier version of the code in [iso532-3](https://github.com/js2251/iso532-3).",
        "The Python function names largely mirror the MATLAB files of tv2018 (see [iso532-3](https://github.com/js2251/iso532-3)), e.g. `agc_next_frame` for `AGCNextFrame.m`. ISO 532-3 is not mentioned in the repository.",
        "Outer- and middle-ear transfer functions for free-field, diffuse-field and eardrum presentation are included for 32 kHz.",
        "There is no packaging metadata (no pyproject.toml or setup.py) and no PyPI package; the README installs from a clone with requirements.txt. A Colab notebook with demos is linked."
      ],
      "caveats": [
        "The README says the JAX version \"does not compile as there are several portions of the implementation that are not pure\"."
      ],
      "implements": [
        {
          "metric": "loudness-moore-glasberg-time-varying",
          "reference": "moore-2018",
          "functions": [
            "tvl2018.compute_loudness",
            "tvl2018_jax.compute_loudness"
          ],
          "scope": "instantaneous, short-term and long-term loudness; binaural",
          "status": "available",
          "validation": "self-tests",
          "validation_details": [
            "Tests run in GitHub Actions compare overall loudness, the first five short-term and long-term values and selected intermediate stages for one input (1 kHz tone, 100 ms, 32 kHz) with hard-coded expected values.",
            "The README calls this \"a known accurate output\", but neither it nor the tests say where the values come from."
          ]
        }
      ],
      "sources": [
        "https://github.com/MalcolmSlaney/LoudnessModel",
        "https://github.com/MalcolmSlaney/LoudnessModel/blob/main/README.md",
        "https://github.com/MalcolmSlaney/LoudnessModel/blob/main/tvl2018_test.py",
        "https://github.com/MalcolmSlaney/LoudnessModel/blob/main/LICENSE"
      ],
      "checked": "2026-10-06",
      "url": "https://zhenxianli.github.io/LISQM/projects/loudnessmodel.html",
      "last_commit": "2025-03-20",
      "latest_release": null,
      "prerelease": null,
      "activity": "inactive",
      "archived": false,
      "stars": 19,
      "group": "developing"
    },
    {
      "id": "deeuu-loudness",
      "name": "deeuu/loudness",
      "repository": "https://github.com/deeuu/loudness",
      "languages": [
        "C++",
        "Python"
      ],
      "kind": "library",
      "core": "C++",
      "language_note": "Python bindings generated by SWIG; building needs SWIG 3, libsndfile, FFTW and zlib. The Python package was never published on PyPI.",
      "standing": "developing",
      "license": "GPL-3.0-or-later",
      "maintainers": [
        "Dominic Ward"
      ],
      "summary": "C++ library with SWIG Python bindings for building loudness models from cascaded processing modules. Includes Moore–Glasberg models for stationary sounds (ANSI S3.4-2007, Chen et al. 2011) and time-varying sounds (Glasberg & Moore 2002, Chen & Hu 2012), and stationary Zwicker loudness after DIN 45631:1991.",
      "ai_assistance": "not-stated",
      "notes": [
        "Also includes the dynamic loudness model of Chen & Hu (2012) (`DynamicLoudnessCH2012`) and partial-loudness stages after Moore, Glasberg & Baer (1997) and Chen et al. (2011) (`SpecificPartialLoudnessMGB1997`, `SpecificPartialLoudnessCHGM2011`); neither has an entry in this list.",
        "The interface is modelled on AIM-C. Building needs libsndfile, FFTW and zlib; the Python bindings need SWIG 3.",
        "The last commit touching the source code, bindings or Python package was on 2017-06-01; the last commit (2019-08-08) updated the README.",
        "`swig/setup.py` names the Python package `loudness` 0.0.1, but it was never published on PyPI."
      ],
      "caveats": [
        "The README says \"This project is still in heavy development so is not stable\".",
        "The PyPI package named `loudness` is an unrelated LUFS (ITU-R BS.1770) project (iver56/loudness); this library has to be built from source."
      ],
      "implements": [
        {
          "metric": "loudness-moore-glasberg",
          "reference": "ansi-s3-4-2007",
          "functions": [
            "StationaryLoudnessANSIS342007"
          ],
          "scope": "with the binaural inhibition of Moore & Glasberg (2007) for two ears",
          "status": "available",
          "validation": "self-tests",
          "validation_details": [
            "Unit tests cover each module and model.",
            "A validation script writes computed and expected loudness of pure tones to CSV; the expected values are labelled \"Table 7\" and \"Example 2\" without naming their source."
          ]
        },
        {
          "metric": "loudness-moore-glasberg",
          "reference": "chen-2011",
          "functions": [
            "StationaryLoudnessCHGM2011"
          ],
          "status": "available",
          "validation": "self-tests"
        },
        {
          "metric": "loudness-moore-glasberg-time-varying",
          "reference": "glasberg-moore-2002",
          "functions": [
            "DynamicLoudnessGM2002"
          ],
          "status": "available",
          "validation": "self-tests",
          "note": "Per the header, excitation patterns follow ANSI S3.4-2007, and parameter sets use the modified long-term time constants of Moore et al. (2003) and the ANSI S3.4-2007 equation for specific loudness at high levels."
        },
        {
          "metric": "loudness-zwicker",
          "reference": "din-45631-1991",
          "functions": [
            "StationaryLoudnessDIN456311991"
          ],
          "scope": "stationary only",
          "status": "available",
          "validation": "cross-implementation",
          "compared_with": [
            "GENESIS ACOUSTICS code (Python port)"
          ],
          "derived_from": [
            "BASIC program of DIN 45631 (Zwicker et al., 1991)"
          ],
          "validation_details": [
            "Tested against \"a quick and dirty Python port of the Matlab code private by GENESIS ACOUSTICS\"."
          ],
          "note": "Uses 28 third-octave filters with third-order Butterworth responses after ANSI S1.11:1986; there is no time-varying (DIN 45631/A1) model."
        }
      ],
      "sources": [
        "https://github.com/deeuu/loudness",
        "https://github.com/deeuu/loudness/blob/master/README.md",
        "https://github.com/deeuu/loudness/tree/master/src/models",
        "https://github.com/deeuu/loudness/tree/master/python/tests",
        "https://pypi.org/project/loudness/"
      ],
      "checked": "2026-10-06",
      "url": "https://zhenxianli.github.io/LISQM/projects/deeuu-loudness.html",
      "last_commit": "2019-08-08",
      "latest_release": null,
      "prerelease": null,
      "activity": "inactive",
      "archived": false,
      "stars": 40,
      "group": "legacy"
    },
    {
      "id": "fluctuation-strength-tue",
      "name": "fluctuation-strength-TUe",
      "repository": "https://github.com/aosses-tue/fluctuation-strength-TUe",
      "languages": [
        "MATLAB"
      ],
      "kind": "research-code",
      "standing": "established",
      "license": "none",
      "maintainers": [
        "Alejandro Osses"
      ],
      "summary": "MATLAB code of the fluctuation strength model of Osses, García & Kohlrausch (2016) (`FluctuationStrength_TUe.m`), with the stimuli of the paper and a demo that reproduces its figures.",
      "ai_assistance": "not-stated",
      "paper": {
        "citation": "Osses, A., García, R., & Kohlrausch, A. (2016). Modelling the sensation of fluctuation strength. *Proceedings of Meetings on Acoustics*, 28, 050005.",
        "doi": "10.1121/2.0000410"
      },
      "notes": [
        "The header says the algorithm was \"adapted from the Roughness model\" and programmed by Alejandro Osses and Rodrigo García at TU/e, 2014–2016.",
        "The model is also documented in Osses Vecchi (2018), PhD thesis, TU Eindhoven (Chapter 2 and Appendix B), linked from the README.",
        "Version 1.0 is a git tag of 2019-12-31; the code was optimised after the tag, on 2020-01-02."
      ],
      "caveats": [
        "No licence file, so reuse is not permitted by default."
      ],
      "implements": [
        {
          "metric": "fluctuation-strength-osses",
          "reference": "osses-2016",
          "functions": [
            "FluctuationStrength_TUe"
          ],
          "status": "available",
          "since": "1.0",
          "validation": "standard-data",
          "validation_details": [
            "`demos/demo_osses2016a.m` reproduces the figures of the paper with the included stimuli (AM and FM tones, AM noise and excerpts of real sounds)."
          ]
        }
      ],
      "sources": [
        "https://github.com/aosses-tue/fluctuation-strength-TUe",
        "https://github.com/aosses-tue/fluctuation-strength-TUe/blob/master/README.md",
        "https://github.com/aosses-tue/fluctuation-strength-TUe/blob/master/FluctuationStrength_TUe.m",
        "https://doi.org/10.1121/2.0000410",
        "https://research.tue.nl/files/103868563/20180919_Osses_Vecchi.pdf"
      ],
      "checked": "2026-10-06",
      "url": "https://zhenxianli.github.io/LISQM/projects/fluctuation-strength-tue.html",
      "last_commit": "2020-01-02",
      "latest_release": {
        "version": "v1.0",
        "date": "2019-12-31",
        "source": "GitHub release"
      },
      "prerelease": null,
      "activity": "inactive",
      "archived": false,
      "stars": 1,
      "group": "legacy"
    },
    {
      "id": "haw-specific-loudness",
      "name": "HAW loudness tool",
      "full_name": "Specific loudness of time-varying sounds (MATLAB tool)",
      "repository": "https://zenodo.org/records/7361480",
      "homepage": "https://reposit.haw-hamburg.de/handle/20.500.12738/14892",
      "languages": [
        "MATLAB"
      ],
      "kind": "application",
      "standing": "established",
      "license": "CC-BY-4.0",
      "license_note": "Licence of the HAW Hamburg repository record; the archive itself has no licence file.",
      "maintainers": [
        "Christian Sabrautzky",
        "Robert Mores"
      ],
      "summary": "MATLAB tool with a graphical interface, from HAW Hamburg, that shows the specific loudness of time-varying sounds: a Moore–Glasberg front end on ERB bands with temporal processing after Glasberg & Moore (2002), Chalupper & Fastl (2002) or Baumgarte (2000). Written in 2007 for a diploma thesis and published on Zenodo in 2022.",
      "ai_assistance": "not-stated",
      "paper": {
        "citation": "Sabrautzky, C. (2007). *Erweiterung eines Lautheitsmodells von Moore und Glasberg zur Berechnung der spezifischen Lautheit dynamischer Audiosignale* [Diploma thesis, HAW Hamburg]."
      },
      "notes": [
        "Code by Christian Sabrautzky (2007, revision 0.7), with changes by Robert Mores (2013) and a playback toolbar by Nico Schäfer. The Zenodo record (2022-12-16) includes an English overview of the models and the German thesis.",
        "Offers free-field and diffuse-field outer-ear filters and three spectral analyses: FFT with a Blackman–Harris or Hann window, and a Fourier-time transform."
      ],
      "caveats": [
        "Not an implementation of ANSI S3.4-2007 or ISO 532-2/-3. It follows Glasberg & Moore (2002) with the constants A, α and E_THRQ read from published graphs and interpolated, and its Chalupper–Fastl and Baumgarte options apply those models' temporal processing to Moore–Glasberg specific loudness."
      ],
      "conventions": [
        "Input must be sampled at 32 kHz; the reference level is entered as the sound pressure level of a full-scale sine."
      ],
      "cite": {
        "doi": "10.5281/zenodo.7361480"
      },
      "implements": [
        {
          "metric": "loudness-moore-glasberg-time-varying",
          "reference": "glasberg-moore-2002",
          "functions": [
            "loud_gui",
            "matlab_loud"
          ],
          "scope": "specific loudness over time on ERB bands; three temporal models",
          "status": "available",
          "validation": "reference-code",
          "compared_with": [
            "LOUDAES and TVL (Glasberg & Moore's programs)"
          ],
          "validation_details": [
            "The thesis compares the total loudness of pure tones (30–100 dB) with LOUDAES, Glasberg & Moore's program for stationary sounds: mostly within 5 %, with larger deviations at low levels near 50 Hz and above 5 kHz (−9.3 % for 5 kHz at 30 dB).",
            "For two equal-level tones at 1 and 2 kHz, the deviation from LOUDAES ranges from −4.4 % to +3.8 % with the Hann-window FFT and reaches +6.7 % with the Fourier-time transform.",
            "For the stationary part of signals the thesis reports good agreement with TVL, Glasberg & Moore's program for time-varying sounds, without figures."
          ]
        }
      ],
      "sources": [
        "https://zenodo.org/records/7361480",
        "https://reposit.haw-hamburg.de/handle/20.500.12738/14892"
      ],
      "checked": "2026-10-07",
      "url": "https://zhenxianli.github.io/LISQM/projects/haw-specific-loudness.html",
      "last_commit": "2022-12-16",
      "latest_release": {
        "version": "1",
        "date": "2022-12-16",
        "source": "Zenodo"
      },
      "prerelease": null,
      "activity": "inactive",
      "archived": false,
      "stars": null,
      "group": "legacy"
    },
    {
      "id": "iosr-matlab-toolbox",
      "name": "IoSR Matlab Toolbox",
      "repository": "https://github.com/IoSR-Surrey/MatlabToolbox",
      "languages": [
        "MATLAB"
      ],
      "kind": "library",
      "standing": "established",
      "license": "MIT",
      "maintainers": [
        "Christopher Hummersone"
      ],
      "summary": "General-purpose MATLAB toolbox from the Institute of Sound Recording (University of Surrey) for auditory modelling, signal processing, source separation, statistics and plotting. For this list it provides ISO 226:2003 equal-loudness contours; it has no loudness, sharpness or roughness models.",
      "ai_assistance": "not-stated",
      "notes": [
        "`iosr.auditory.loudWeight` returns loudness-weighting coefficients derived from the 65-phon ISO 226:2003 contour.",
        "The two functions are also published on MATLAB File Exchange, as submissions 50348 (\"ISO 226:2003 Normal equal-loudness-level contours\") and 50349 (\"Loudness weighting coefficients\")."
      ],
      "caveats": [
        "ISO 226:2003 was withdrawn in 2023 and replaced by ISO 226:2023; the function follows the 2003 edition.",
        "No commits since August 2017."
      ],
      "implements": [
        {
          "metric": "equal-loudness-contours",
          "reference": "iso-226-2003",
          "functions": [
            "iosr.auditory.iso226"
          ],
          "status": "available",
          "validation": "not-stated"
        }
      ],
      "sources": [
        "https://github.com/IoSR-Surrey/MatlabToolbox",
        "https://github.com/IoSR-Surrey/MatlabToolbox/blob/master/README.md",
        "https://github.com/IoSR-Surrey/MatlabToolbox/blob/master/+iosr/+auditory/iso226.m",
        "https://github.com/IoSR-Surrey/MatlabToolbox/blob/master/+iosr/+auditory/loudWeight.m"
      ],
      "checked": "2026-10-06",
      "url": "https://zhenxianli.github.io/LISQM/projects/iosr-matlab-toolbox.html",
      "last_commit": "2017-08-18",
      "latest_release": {
        "version": "v2.8",
        "date": "2017-06-17",
        "source": "GitHub release"
      },
      "prerelease": null,
      "activity": "inactive",
      "archived": false,
      "stars": 133,
      "group": "legacy"
    },
    {
      "id": "mosqito-fdp",
      "name": "MoSQITo-FDP",
      "repository": "https://github.com/djcaminero/MoSQITo-FDP",
      "languages": [
        "Python"
      ],
      "based_on": "mosqito",
      "kind": "research-code",
      "standing": "developing",
      "license": "Apache-2.0",
      "maintainers": [
        "Daniel Jiménez-Caminero Costa"
      ],
      "summary": "Archived Python snapshot of a MoSQITo fork made for a final-degree project. It adds the Sottek Hearing Model with specific and total loudness (ECMA-418-2, 1st edition) as a step towards hearing-model tonality, and contains tone-to-noise ratio and prominence ratio after ECMA-74 Annex D.",
      "ai_assistance": "not-stated",
      "notes": [
        "Commits run from 2021-06-13 to 2021-07-05. The package inside is still named `mosqito`, and later work went into MoSQITo itself.",
        "The hearing-model code cites both ECMA-418-2 (1st edition, 2020) and ECMA-74 Annex F (17th edition, 2019).",
        "Also contains the Zwicker loudness, DIN 45692 sharpness and Daniel & Weber roughness of the MoSQITo version it was forked from."
      ],
      "caveats": [
        "Archived snapshot without releases or maintenance.",
        "The README marks hearing-model tonality (ECMA-74:2019 Annex G) as under development; the repository contains the hearing-model stages, but no separate tonality function was found."
      ],
      "implements": [
        {
          "metric": "loudness-ecma-418-2",
          "reference": "ecma-418-2-ed1",
          "functions": [
            "comp_loudness"
          ],
          "scope": "hearing model with specific and total loudness",
          "status": "available",
          "validation": "standard-data",
          "validation_details": [
            "Validation scripts compare the ear filter and model output with figures and values from ECMA-418-2 and ECMA-74 Annex F."
          ],
          "derived_by_author": true,
          "note": "Module `mosqito.functions.hearing_model`. Its author committed the same hearing model to MoSQITo on 2021-05-30, two weeks before this snapshot."
        },
        {
          "metric": "tone-to-noise-prominence-ratio",
          "reference": "ecma-74-ed17",
          "functions": [
            "comp_tnr",
            "comp_pr"
          ],
          "scope": "Annex D",
          "status": "available",
          "validation": "self-tests",
          "validation_details": [
            "The README lists TNR/PR as available but not validated; the tests use synthetic tones in white noise."
          ]
        }
      ],
      "sources": [
        "https://github.com/djcaminero/MoSQITo-FDP",
        "https://github.com/djcaminero/MoSQITo-FDP/blob/master/readme.md",
        "https://github.com/djcaminero/MoSQITo-FDP/tree/master/mosqito/functions/hearing_model",
        "https://github.com/djcaminero/MoSQITo-FDP/tree/master/mosqito/validations/hearing_model",
        "https://github.com/Eomys/MoSQITo/commit/04dab16b64041c820c08177aa74039fb3fc3ed20"
      ],
      "checked": "2026-10-08",
      "url": "https://zhenxianli.github.io/LISQM/projects/mosqito-fdp.html",
      "last_commit": "2021-07-05",
      "latest_release": null,
      "prerelease": null,
      "activity": "archived",
      "archived": true,
      "stars": 2,
      "group": "legacy"
    },
    {
      "id": "psychoacoustic-parameters-measurer",
      "name": "PsychoacousticParametersMeasurer",
      "repository": "https://github.com/AndreaCastiella/PsychoacousticParametersMeasurer",
      "languages": [
        "Python"
      ],
      "kind": "research-code",
      "standing": "developing",
      "license": "none",
      "maintainers": [
        "Andrea Castiella Aguirrezabala"
      ],
      "summary": "Python scripts, commented in Spanish, that translate psychoacoustic parameters described in Zwicker and Fastl's book: Zwicker loudness (stationary and time-varying, from third-octave levels), sharpness, roughness, fluctuation strength and psychoacoustic annoyance.",
      "ai_assistance": "not-stated",
      "notes": [
        "There is no README. The GitHub description calls the project \"the translation to python of the most important parameters in the field of Psychoacoustics based on the book of Zwicker and Fastl\".",
        "Roughness (`acousticRoughness`) follows the formula in Zwicker & Fastl's book, which is not one of the roughness metrics in this list.",
        "Also contains A-weighting, voice-activity detection and the scripts Main.py and Main_WAV.py for microphone or WAV input."
      ],
      "caveats": [
        "No licence file, so reuse is not permitted by default.",
        "No documentation and no stated validation."
      ],
      "implements": [
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "loudness_ISO532",
            "loudness_ISO532_time"
          ],
          "scope": "stationary and time-varying, from third-octave levels",
          "status": "available",
          "validation": "not-stated",
          "note": "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."
        },
        {
          "metric": "sharpness",
          "reference": "din-45692-2009",
          "functions": [
            "calc_sharpness"
          ],
          "status": "available",
          "validation": "not-stated",
          "note": "The file header says \"Sharpness DIN 45692\"; the function also returns the von Bismarck and Aures variants."
        },
        {
          "metric": "fluctuation-strength-osses",
          "reference": "fastl-zwicker-2007",
          "functions": [
            "acousticFluctuation",
            "fmoddetection"
          ],
          "scope": "Zwicker & Fastl formula",
          "status": "available",
          "validation": "not-stated",
          "note": "The header cites Zwicker & Fastl, \"Psychoacoustics: Facts and Models\", without naming an edition."
        },
        {
          "metric": "psychoacoustic-annoyance",
          "reference": "zwicker-fastl-1999",
          "functions": [
            "psychoacousticAnnoyance"
          ],
          "status": "available",
          "validation": "not-stated",
          "note": "The header cites Zwicker & Fastl, \"Psychoacoustics: Facts and Models\", without naming an edition."
        }
      ],
      "sources": [
        "https://github.com/AndreaCastiella/PsychoacousticParametersMeasurer",
        "https://github.com/AndreaCastiella/PsychoacousticParametersMeasurer/blob/main/loudness_ISO532.py",
        "https://github.com/AndreaCastiella/PsychoacousticParametersMeasurer/blob/main/Sharpness.py",
        "https://github.com/AndreaCastiella/PsychoacousticParametersMeasurer/blob/main/FluctuationStrength.py",
        "https://github.com/AndreaCastiella/PsychoacousticParametersMeasurer/blob/main/PsychoacousticAnnoyance.py"
      ],
      "checked": "2026-10-06",
      "url": "https://zhenxianli.github.io/LISQM/projects/psychoacoustic-parameters-measurer.html",
      "last_commit": "2021-06-06",
      "latest_release": null,
      "prerelease": null,
      "activity": "inactive",
      "archived": false,
      "stars": 13,
      "group": "legacy"
    },
    {
      "id": "psysound3",
      "name": "PsySound3",
      "repository": "https://github.com/densilcabrera/psysound3",
      "languages": [
        "MATLAB"
      ],
      "kind": "application",
      "standing": "established",
      "license": "none",
      "license_note": "The repository has no licence file, only a no-warranty disclaimer (`README-NO_WARRANTY`). The licence of the original Google Code project was not checked.",
      "maintainers": [
        "Densil Cabrera",
        "Samuel Ferguson"
      ],
      "summary": "MATLAB program with a graphical interface for analysing sound recordings. Its analysers include the Chalupper–Fastl dynamic loudness model, Moore–Glasberg–Baer loudness and Daniel & Weber roughness.",
      "ai_assistance": "not-stated",
      "paper": {
        "citation": "PsySound3: a program for the analysis of sound recordings (2008). Acoustics'08 abstract, *The Journal of the Acoustical Society of America*, 123(5_Supplement), 3247.",
        "url": "https://pubs.aip.org/asa/jasa/article/123/5_Supplement/3247/712568/"
      },
      "notes": [
        "The GitHub repository is an automatic export of the Google Code project `psysound3`; its commits run from January 2009 to March 2015. It also bundles MIRtoolbox functions.",
        "`@LoudnessMG` computes loudness with a \"Moore et al. static model\" adapted from PsySound2; the model version is not stated.",
        "Search results describe PsySound3 as also covering sharpness and fluctuation strength. In this mirror, the descriptions of `@LoudnessCF` and `@LoudnessMG` list sharpness among their outputs; a fluctuation-strength analyser was not confirmed."
      ],
      "caveats": [
        "`README-BUGSISSUES` lists open problems, including \"Various Accuracy Bugs\", \"Calibration Problems\" and \"Revisit calibration modes\".",
        "The project states no validation, and there have been no commits since March 2015.",
        "With no licence file, the terms for reuse and redistribution are unclear."
      ],
      "implements": [
        {
          "metric": "loudness-zwicker",
          "reference": "chalupper-fastl-2002",
          "functions": [
            "@LoudnessCF"
          ],
          "scope": "time-varying",
          "status": "available",
          "validation": "not-stated",
          "note": "The analyser names J. Chalupper and H. Fastl as authors."
        },
        {
          "metric": "loudness-moore-glasberg",
          "reference": "moore-1997",
          "functions": [
            "@LoudnessMGB"
          ],
          "status": "available",
          "validation": "not-stated",
          "note": "Also cites Glasberg & Moore (1990) for the auditory filters. The analyser description says it covers time-varying and binaural loudness, and it also cites Glasberg & Moore (2002) and Moore & Glasberg (2007)."
        },
        {
          "metric": "loudness-moore-glasberg-time-varying",
          "reference": "glasberg-moore-2002",
          "functions": [
            "@LoudnessMGB"
          ],
          "scope": "time-varying and binaural",
          "status": "available",
          "validation": "not-stated",
          "note": "The same analyser as the stationary entry; its description cites Glasberg & Moore (2002)."
        },
        {
          "metric": "roughness-daniel-weber",
          "reference": "daniel-weber-1997",
          "functions": [
            "@RoughnessDW"
          ],
          "status": "available",
          "validation": "not-stated",
          "note": "Adapted for PsySound3 by Matt Flax (2006), with changes by Farhan Rizwi (2007). AARAE's `RoughnessDW.m` is a port of this analyser."
        }
      ],
      "sources": [
        "https://github.com/densilcabrera/psysound3",
        "https://github.com/densilcabrera/psysound3/blob/master/README-BUGSISSUES",
        "https://github.com/densilcabrera/psysound3/blob/master/README-NO_WARRANTY",
        "https://github.com/densilcabrera/psysound3/blob/master/AudioAnalysers/@LoudnessCF/getAuthors.m",
        "https://github.com/densilcabrera/psysound3/blob/master/AudioAnalysers/@LoudnessCF/getDescription.m",
        "https://github.com/densilcabrera/psysound3/blob/master/AudioAnalysers/@LoudnessMG/getDescription.m",
        "https://github.com/densilcabrera/psysound3/blob/master/AudioAnalysers/@LoudnessMGB/getDescription.m",
        "https://github.com/densilcabrera/psysound3/blob/master/AudioAnalysers/@RoughnessDW/getDescription.m"
      ],
      "checked": "2026-10-06",
      "url": "https://zhenxianli.github.io/LISQM/projects/psysound3.html",
      "last_commit": "2015-03-28",
      "latest_release": null,
      "prerelease": null,
      "activity": "inactive",
      "archived": false,
      "stars": 17,
      "group": "legacy"
    },
    {
      "id": "python-acoustics",
      "name": "python-acoustics",
      "repository": "https://github.com/python-acoustics/python-acoustics",
      "docs": "https://python-acoustics.github.io/python-acoustics/",
      "languages": [
        "Python"
      ],
      "kind": "library",
      "standing": "established",
      "license": "BSD-3-Clause",
      "packages": [
        {
          "registry": "pypi",
          "name": "acoustics"
        }
      ],
      "install": "pip install acoustics",
      "maintainers": [
        "Frederik Rietdijk"
      ],
      "summary": "General Python library for acousticians, published on PyPI as `acoustics`. For this list it is relevant for its tonal audibility and tonal adjustment after ISO 1996-2:2007. Archived in February 2024 and continued as acoustic-toolbox.",
      "ai_assistance": "not-stated",
      "notes": [
        "The successor is [acoustic-toolbox](https://github.com/Universite-Gustave-Eiffel/acoustic-toolbox), which continues the same code.",
        "It has no loudness, sharpness or roughness modules."
      ],
      "caveats": [
        "The repository was archived on 2024-02-07 and is read-only.",
        "A fix to the default window of the tonality code (2023-08-20) is on the default branch but not in the last PyPI release (0.2.6, July 2022).",
        "It follows ISO 1996-2:2007, which has been withdrawn; ISO 1996-2:2017 replaced its tonal audibility method with those of Annexes J and K."
      ],
      "implements": [
        {
          "metric": "tonal-audibility-iso-1996-2",
          "reference": "iso-1996-2-2007",
          "functions": [
            "Tonality",
            "tonal_audibility",
            "tonal_adjustment"
          ],
          "scope": "tonal audibility and tonal adjustment",
          "status": "available",
          "validation": "self-tests",
          "validation_details": [
            "A test of the examples in the standard, using DELTA tone files, is commented out."
          ],
          "note": "Module `acoustics.standards.iso_1996_2_2007`. The `Tonality` docstring uses the title of Annex C (\"Objective method for assessing the audibility of tones in noise\"), though the code does not name the annex."
        }
      ],
      "sources": [
        "https://github.com/python-acoustics/python-acoustics",
        "https://github.com/python-acoustics/python-acoustics/blob/master/README.md",
        "https://github.com/python-acoustics/python-acoustics/blob/master/acoustics/standards/iso_1996_2_2007.py",
        "https://github.com/python-acoustics/python-acoustics/blob/master/tests/standards/test_iso_1996_2_2007.py",
        "https://pypi.org/project/acoustics/",
        "https://github.com/python-acoustics/python-acoustics/blob/master/docs/conf.py"
      ],
      "checked": "2026-10-08",
      "url": "https://zhenxianli.github.io/LISQM/projects/python-acoustics.html",
      "last_commit": "2023-08-20",
      "latest_release": {
        "version": "0.2.6",
        "date": "2022-07-08",
        "source": "PyPI"
      },
      "prerelease": null,
      "activity": "archived",
      "archived": true,
      "stars": 563,
      "group": "legacy"
    },
    {
      "id": "suave",
      "name": "SUAVE",
      "repository": "https://github.com/suavecode/SUAVE",
      "languages": [
        "Python"
      ],
      "kind": "library",
      "standing": "established",
      "license": "LGPL-2.1",
      "maintainers": [
        "SUAVE team (Stanford Aerospace Design Lab)"
      ],
      "summary": "Python environment for the multi-fidelity conceptual design of aircraft (\"An Aerospace Vehicle Environment\"). Its noise tools compute perceived noise level (PNL), tone-corrected PNL (PNLT) and effective perceived noise level (EPNL) from one-third-octave spectra.",
      "ai_assistance": "not-stated",
      "notes": [
        "The noise tools are in `SUAVE/Methods/Noise/Fidelity_One/Noise_Tools`, written by C. Ilario (2015) and modified by E. Botero (2016). The same folder has SENEL, dBA and noise-certification-limit helpers."
      ],
      "caveats": [
        "Development appears to have stopped in 2022: the last release (2.5.2) is from March 2022 and the last commit from December 2022.",
        "No validation of the noise metrics is stated."
      ],
      "implements": [
        {
          "metric": "epnl",
          "reference": "icao-annex-16-vol-1",
          "functions": [
            "pnl_noise",
            "noise_tone_correction",
            "epnl_noise"
          ],
          "scope": "PNL, PNLT and EPNL; the code cites no edition",
          "status": "available",
          "validation": "not-stated",
          "note": "EPNL is computed from a PNLT time history. The noise tools cite neither ICAO Annex 16 nor 14 CFR Part 36, nor an edition; their docstrings give \"Source: None\"."
        }
      ],
      "sources": [
        "https://github.com/suavecode/SUAVE",
        "https://github.com/suavecode/SUAVE/blob/develop/README.md",
        "https://github.com/suavecode/SUAVE/tree/develop/trunk/SUAVE/Methods/Noise/Fidelity_One/Noise_Tools"
      ],
      "checked": "2026-10-06",
      "url": "https://zhenxianli.github.io/LISQM/projects/suave.html",
      "last_commit": "2022-12-23",
      "latest_release": {
        "version": "2.5.2",
        "date": "2022-03-17",
        "source": "GitHub release"
      },
      "prerelease": null,
      "activity": "inactive",
      "archived": false,
      "stars": 532,
      "group": "legacy"
    },
    {
      "id": "rapid-loudness-sharpness",
      "name": "Swift & Gee codes",
      "full_name": "Codes for the rapid calculation of loudness and sharpness",
      "repository": "https://www.mathworks.com/matlabcentral/fileexchange/73808-codes-for-the-rapid-calculation-of-loudness-and-sharpness",
      "languages": [
        "MATLAB"
      ],
      "kind": "research-code",
      "standing": "established",
      "license": "BSD-3-Clause",
      "license_note": "`license.txt`: Copyright (c) 2019, Stephen Hales Swift.",
      "packages": [
        {
          "registry": "file-exchange",
          "name": "73808",
          "url": "https://www.mathworks.com/matlabcentral/fileexchange/73808-codes-for-the-rapid-calculation-of-loudness-and-sharpness"
        }
      ],
      "maintainers": [
        "Stephen Hales Swift"
      ],
      "summary": "MATLAB code by S. Hales Swift (Brigham Young University) on MATLAB File Exchange for fast Moore–Glasberg loudness: ANSI S3.4-2007 stationary loudness and Glasberg & Moore (2002) time-varying loudness, each with the sharpness of Swift & Gee (2017), which is computed from Moore–Glasberg specific loudness.",
      "ai_assistance": "not-stated",
      "paper": {
        "citation": "Swift, S. H., & Gee, K. L. (2019). Techniques for the rapid calculation of the excitation pattern in the time varying extensions to ANSI S3.4-2007. *Proceedings of Meetings on Acoustics*, 36, 040002."
      },
      "notes": [
        "Version 1.0.0 (2020-01-24) is the only update after the first upload (2019-12-31). There is no public commit history; the files can be read online on File Exchange without logging in.",
        "The sharpness code is by the authors of the sharpness model."
      ],
      "caveats": [
        "No validation is described.",
        "Without the Signal Processing Toolbox, the File Exchange page says a file from the Cambridge Hearing Group's website is needed; that page now needs a University of Cambridge login."
      ],
      "conventions": [
        "The code works at 32 kHz; other rates are resampled with the Signal Processing Toolbox's `resample`."
      ],
      "cite": {
        "text": "The File Exchange page asks for the paper above for the loudness code and for Swift & Gee (2017) for the sharpness code."
      },
      "implements": [
        {
          "metric": "loudness-moore-glasberg",
          "reference": "ansi-s3-4-2007",
          "functions": [
            "stationaryLoudness"
          ],
          "status": "available",
          "validation": "not-stated"
        },
        {
          "metric": "loudness-moore-glasberg-time-varying",
          "reference": "glasberg-moore-2002",
          "functions": [
            "Glasberg_loudness"
          ],
          "status": "available",
          "validation": "not-stated"
        },
        {
          "metric": "sharpness",
          "reference": "swift-gee-2017",
          "functions": [
            "stationaryLoudness",
            "Glasberg_loudness"
          ],
          "scope": "from Moore–Glasberg specific loudness, stationary and time-varying",
          "status": "available",
          "validation": "not-stated"
        }
      ],
      "sources": [
        "https://www.mathworks.com/matlabcentral/fileexchange/73808-codes-for-the-rapid-calculation-of-loudness-and-sharpness",
        "https://viewer.mathworks.com/addons/73808/latest",
        "https://doi.org/10.1121/1.5016193"
      ],
      "checked": "2026-10-07",
      "url": "https://zhenxianli.github.io/LISQM/projects/rapid-loudness-sharpness.html",
      "last_commit": "2020-01-24",
      "latest_release": {
        "version": "1.0.0",
        "date": "2020-01-24",
        "source": "MATLAB File Exchange"
      },
      "prerelease": null,
      "activity": "inactive",
      "archived": false,
      "stars": null,
      "group": "legacy"
    },
    {
      "id": "zhen-ni-epnl",
      "name": "Zhen-Ni/epnl",
      "repository": "https://github.com/Zhen-Ni/epnl",
      "languages": [
        "Rust"
      ],
      "kind": "library",
      "standing": "developing",
      "license": "none",
      "maintainers": [
        "Zhen-Ni"
      ],
      "summary": "Small Rust crate that computes perceived noisiness (noy), perceived noise level (PNL) and tone-corrected perceived noise level (PNLT) from 24 one-third-octave band levels, citing ICAO Annex 16, Volume I, Appendix 2 in its code comments.",
      "ai_assistance": "not-stated",
      "notes": [
        "The crate (version 0.1.0) has no README and is not published on crates.io; input.txt holds two example 24-band spectra."
      ],
      "caveats": [
        "The GitHub description reads \"Calculate Effective Perceived Noise Level (EPNL) for aircrafts\", but EPNL itself is not implemented: there is no time integration or duration correction.",
        "No licence file, so reuse is not permitted by default."
      ],
      "implements": [
        {
          "metric": "epnl",
          "reference": "icao-annex-16-vol-1",
          "functions": [
            "SPL",
            "Noy",
            "PNL",
            "PNLT"
          ],
          "scope": "PNL and PNLT only; no duration correction to EPNL",
          "partial": true,
          "status": "available",
          "validation": "not-stated",
          "note": "Code comments cite \"Annex 16 - Volume I, APP 2-16 / 2-17\" and number the 24 bands \"consistent with ICAO ANNEX 16\". The quantities are Rust types converted into each other with `From`."
        }
      ],
      "sources": [
        "https://github.com/Zhen-Ni/epnl",
        "https://github.com/Zhen-Ni/epnl/blob/master/Cargo.toml",
        "https://github.com/Zhen-Ni/epnl/tree/master/src"
      ],
      "checked": "2026-10-06",
      "url": "https://zhenxianli.github.io/LISQM/projects/zhen-ni-epnl.html",
      "last_commit": "2023-07-10",
      "latest_release": null,
      "prerelease": null,
      "activity": "inactive",
      "archived": false,
      "stars": 0,
      "group": "legacy"
    },
    {
      "id": "zwickerloudness-sourceforge",
      "name": "zwickerloudness",
      "full_name": "Zwicker's Loudness Calculation SW + Tool (ISO 532B)",
      "repository": "https://sourceforge.net/projects/zwickerloudness/",
      "languages": [
        "C"
      ],
      "kind": "application",
      "language_note": "C console program for BSD, Linux and Windows that reads one-third-octave band levels from files.",
      "standing": "developing",
      "license": "GPL-2.0",
      "license_note": "SourceForge lists \"GNU General Public License version 2.0\", but the `license` file in the release archive (loudness-020) has the author's own BSD-style terms, with a fourth clause: a significantly different project that reuses parts of the code must be open source as well and must reference the original code.",
      "maintainers": [
        "V. Portet"
      ],
      "summary": "Console program in C, for BSD, Linux and Windows, that calculates the loudness of stationary sounds with Zwicker's method (ISO 532B / DIN 45631) from one-third-octave band levels. A companion tool analyses WAV files to produce those input files.",
      "ai_assistance": "not-stated",
      "notes": [
        "Partly ported from the BASIC \"Program for calculating loudness according to DIN 45631 (ISO 532B)\", published in the Journal of the Acoustical Society of Japan in 1991, as obtained from Osaka University's website.",
        "Distributed as release archives on SourceForge, from release 010 (2010-04-15) to zwickerloudness-020 (2011-07-01). The last-commit date given here (2018-06-05) is the project's \"Last Update\" date on SourceForge, not a commit date."
      ],
      "caveats": [
        "Stationary sounds only; there is no procedure for time-varying sounds."
      ],
      "implements": [
        {
          "metric": "loudness-zwicker",
          "reference": "din-45631-1991",
          "scope": "stationary, from one-third-octave band levels",
          "status": "available",
          "validation": "self-tests",
          "derived_from": [
            "BASIC program of DIN 45631 (Zwicker et al., 1991)"
          ],
          "validation_details": [
            "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."
          ],
          "note": "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."
        }
      ],
      "sources": [
        "https://sourceforge.net/projects/zwickerloudness/",
        "https://sourceforge.net/projects/zwickerloudness/files/",
        "https://sourceforge.net/projects/zwickerloudness/files/README.TXT/download",
        "https://sourceforge.net/projects/zwickerloudness/files/zwickerloudness-020/loudness-020.tar.gz/download"
      ],
      "checked": "2026-10-08",
      "url": "https://zhenxianli.github.io/LISQM/projects/zwickerloudness-sourceforge.html",
      "last_commit": "2018-06-05",
      "latest_release": {
        "version": "zwickerloudness-020",
        "date": "2011-07-01",
        "source": ""
      },
      "prerelease": null,
      "activity": "inactive",
      "archived": false,
      "stars": null,
      "group": "legacy"
    },
    {
      "id": "psychobox",
      "name": "PsychoBox",
      "repository": "https://github.com/henriquealende/PsychoBox",
      "docs": "https://github.com/henriquealende/PsychoBox/tree/main/Documentation",
      "languages": [
        "Python"
      ],
      "kind": "application",
      "standing": "developing",
      "license": "MIT",
      "summary": "Desktop application (PySide6 GUI) for playing, editing, filtering and analysing audio. Its psychoacoustic metrics are computed by MoSQITo 1.2.1: Zwicker loudness, ECMA-418-2 loudness, DIN 45692 sharpness, Daniel & Weber roughness and ECMA-418-2 roughness.",
      "ai_assistance": "not-stated",
      "notes": [
        "`requirements.txt` pins `mosqito==1.2.1`; PsychoBox itself states no standard editions.",
        "Also does recording and binaural playback correction. An install guide and a tutorial (PDF) are in the Documentation folder.",
        "Listed as an end-user application, although its metric values come from MoSQITo. Wrappers that are neither an application nor an established library are recorded in `data/ignored.yaml` instead."
      ],
      "caveats": [
        "All metric values come from MoSQITo 1.2.1, whose ECMA-418-2 functions follow the 2nd edition (2022), two editions behind the current one."
      ],
      "implements": [
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "Loudness.loudnessZWK"
          ],
          "scope": "stationary",
          "status": "available",
          "via": "mosqito",
          "validation": "not-stated",
          "note": "Calls `loudness_zwst` of MoSQITo 1.2.1."
        },
        {
          "metric": "loudness-ecma-418-2",
          "reference": "ecma-418-2-ed2",
          "functions": [
            "Loudness.loudnessECMA"
          ],
          "scope": "Clause 5 hearing-model loudness only",
          "status": "available",
          "via": "mosqito",
          "validation": "not-stated",
          "note": "Calls `loudness_ecma` of MoSQITo 1.2.1 (ECMA-418-2:2022, Clause 5 only)."
        },
        {
          "metric": "sharpness",
          "reference": "din-45692-2009",
          "functions": [
            "Sharpnes_DIN.sharpnessCalculation"
          ],
          "status": "available",
          "via": "mosqito",
          "validation": "not-stated",
          "note": "Calls `sharpness_din_st` of MoSQITo 1.2.1 with the DIN weighting."
        },
        {
          "metric": "roughness-daniel-weber",
          "reference": "daniel-weber-1997",
          "functions": [
            "Roughness.roughnessDW"
          ],
          "status": "available",
          "via": "mosqito",
          "validation": "not-stated",
          "note": "Calls `roughness_dw` of MoSQITo 1.2.1."
        },
        {
          "metric": "roughness-ecma-418-2",
          "reference": "ecma-418-2-ed2",
          "functions": [
            "Roughness.roughnessECMA"
          ],
          "status": "available",
          "via": "mosqito",
          "validation": "not-stated",
          "note": "Calls `roughness_ecma` of MoSQITo 1.2.1, whose bibliography cites ECMA-418-2:2022."
        }
      ],
      "sources": [
        "https://github.com/henriquealende/PsychoBox",
        "https://github.com/henriquealende/PsychoBox/blob/main/README.md",
        "https://github.com/henriquealende/PsychoBox/blob/main/requirements.txt",
        "https://github.com/henriquealende/PsychoBox/tree/main/Psychoacoustics",
        "https://github.com/Eomys/MoSQITo/blob/master/docs/ref.bib"
      ],
      "checked": "2026-10-06",
      "url": "https://zhenxianli.github.io/LISQM/projects/psychobox.html",
      "last_commit": "2026-03-16",
      "latest_release": null,
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": 10,
      "group": "others",
      "calls": [
        "mosqito"
      ]
    },
    {
      "id": "soundscapy",
      "name": "Soundscapy",
      "repository": "https://github.com/MitchellAcoustics/Soundscapy",
      "docs": "https://soundscapy.readthedocs.io/en/latest/",
      "languages": [
        "Python"
      ],
      "kind": "library",
      "standing": "established",
      "license": "BSD-3-Clause",
      "packages": [
        {
          "registry": "pypi",
          "name": "soundscapy"
        }
      ],
      "install": "pip install \"soundscapy[audio]\"",
      "maintainers": [
        "Andrew Mitchell"
      ],
      "summary": "Python library for soundscape assessment. Its optional audio module computes psychoacoustic metrics of binaural recordings, per channel, by calling MoSQITo: time-varying Zwicker loudness, DIN 45692 sharpness and Daniel & Weber roughness.",
      "ai_assistance": "disclosed",
      "ai_note": "Commit metadata only; the README does not mention AI. At least 31 commits from March to May 2026 carry co-author lines for Claude or Copilot, and eight commits are authored by copilot-swe-agent[bot].",
      "paper": {
        "citation": "Mitchell, A., Aletta, F., & Kang, J. (2022). How to analyse and represent quantitative soundscape data. *JASA Express Letters*, 2, 037201.",
        "doi": "10.1121/10.0009794"
      },
      "notes": [
        "The psychoacoustic functions need the optional `audio` extra (MoSQITo 1.2.1 or newer). Environmental acoustic metrics come from acoustic-toolbox and ecoacoustic indices from scikit-maad.",
        "Issue [#123](https://github.com/MitchellAcoustics/Soundscapy/issues/123), open since 2025-10-29, plans to integrate sottek-hearing-model for ECMA-418-2 metrics; its branch has no such code yet.",
        "The paper the README asks users to cite covers soundscape data analysis, not the psychoacoustic functions."
      ],
      "caveats": [
        "The psychoacoustic values are computed by MoSQITo, so their editions and accuracy are those of the installed MoSQITo version."
      ],
      "implements": [
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "Binaural.mosqito_metric",
            "process_all_metrics"
          ],
          "scope": "time-varying, per channel",
          "status": "available",
          "via": "mosqito",
          "validation": "not-stated",
          "note": "Calls `loudness_zwtv`."
        },
        {
          "metric": "sharpness",
          "reference": "din-45692-2009",
          "functions": [
            "Binaural.mosqito_metric",
            "process_all_metrics"
          ],
          "status": "available",
          "via": "mosqito",
          "validation": "not-stated",
          "note": "Calls `sharpness_din_from_loudness`, `sharpness_din_perseg` or `sharpness_din_tv`; the weighting can be chosen."
        },
        {
          "metric": "roughness-daniel-weber",
          "reference": "daniel-weber-1997",
          "functions": [
            "Binaural.mosqito_metric",
            "process_all_metrics"
          ],
          "status": "available",
          "via": "mosqito",
          "validation": "not-stated",
          "note": "Calls `roughness_dw`."
        }
      ],
      "cite": {
        "cff": "https://github.com/MitchellAcoustics/Soundscapy/blob/main/CITATION.cff"
      },
      "sources": [
        "https://github.com/MitchellAcoustics/Soundscapy",
        "https://github.com/MitchellAcoustics/Soundscapy/blob/main/README.md",
        "https://github.com/MitchellAcoustics/Soundscapy/blob/main/src/soundscapy/audio/metrics.py",
        "https://github.com/MitchellAcoustics/Soundscapy/issues/123",
        "https://pypi.org/project/soundscapy/"
      ],
      "checked": "2026-10-06",
      "url": "https://zhenxianli.github.io/LISQM/projects/soundscapy.html",
      "last_commit": "2026-05-14",
      "latest_release": {
        "version": "v0.8.5",
        "date": "2026-05-12",
        "source": "GitHub release"
      },
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": 59,
      "group": "others",
      "calls": [
        "mosqito"
      ]
    },
    {
      "id": "zwickerloudnessaudio-jl",
      "name": "ZwickerLoudnessAudio.jl",
      "repository": "https://github.com/slink/ZwickerLoudnessAudio.jl",
      "languages": [
        "Julia"
      ],
      "kind": "library",
      "standing": "newly-released",
      "standing_note": "First registered in June 2026.",
      "license": "MIT",
      "license_note": "The README credits MoSQITo (Apache-2.0) for the transcribed time-varying filter tables.",
      "packages": [
        {
          "registry": "julia",
          "name": "ZwickerLoudnessAudio"
        }
      ],
      "install": "using Pkg; Pkg.add(\"ZwickerLoudnessAudio\")",
      "maintainers": [
        "slink"
      ],
      "summary": "Julia front end to ZwickerLoudness.jl that computes ISO 532-1:2017 Zwicker loudness from waveforms or WAV files: stationary loudness, and since v0.3.0 time-varying loudness with N5 and N10.",
      "ai_assistance": "not-stated",
      "notes": [
        "Depends on ZwickerLoudness.jl (compat 0.3), which does the loudness calculation from band levels; this package computes the band levels.",
        "First registered in the Julia General registry as version 0.2.0 (2026-06-01)."
      ],
      "implements": [
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "loudness_zwst",
            "band_levels"
          ],
          "scope": "stationary, from a waveform or WAV file",
          "status": "available",
          "since": "0.2.0",
          "via": "zwickerloudness-jl",
          "validation": "standard-data",
          "validation_details": [
            "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)."
          ],
          "conventions": [
            "Stationary loudness resamples input below 48 kHz to 48 kHz (polyphase), with a warning."
          ],
          "note": "Computes the third-octave levels itself (per-band Butterworth filters of order 3 by default, as in MoSQITo) and passes them to ZwickerLoudness.jl for the loudness."
        },
        {
          "metric": "loudness-zwicker",
          "reference": "iso-532-1-2017",
          "functions": [
            "loudness_zwtv"
          ],
          "scope": "time-varying, from a waveform or WAV file at 48 kHz",
          "status": "available",
          "since": "0.3.0",
          "via": "zwickerloudness-jl",
          "validation": "standard-data",
          "compared_with": [
            "mosqito"
          ],
          "derived_from": [
            "mosqito"
          ],
          "validation_details": [
            "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."
          ],
          "conventions": [
            "Time-varying loudness accepts 48 kHz input only (an error otherwise)."
          ],
          "note": "The Annex A filter cascade is transcribed from MoSQITo (`_third_octave_levels`, `_square_and_smooth`)."
        }
      ],
      "cite": {
        "text": "The README links a [Zenodo DOI](https://zenodo.org/badge/latestdoi/1253784080) for the latest version."
      },
      "sources": [
        "https://github.com/slink/ZwickerLoudnessAudio.jl",
        "https://github.com/slink/ZwickerLoudnessAudio.jl/blob/main/README.md",
        "https://github.com/slink/ZwickerLoudnessAudio.jl/releases",
        "https://github.com/JuliaRegistries/General/tree/master/Z/ZwickerLoudnessAudio"
      ],
      "checked": "2026-10-06",
      "url": "https://zhenxianli.github.io/LISQM/projects/zwickerloudnessaudio-jl.html",
      "last_commit": "2026-09-02",
      "latest_release": {
        "version": "v0.3.0",
        "date": "2026-09-02",
        "source": "GitHub release"
      },
      "prerelease": null,
      "activity": "active",
      "archived": false,
      "stars": 2,
      "group": "others",
      "calls": [
        "zwickerloudness-jl"
      ]
    },
    {
      "id": "psytools",
      "name": "PsyTools",
      "repository": "https://gitlab.tugraz.at/11F34386B3DC1474/psytools",
      "languages": [
        "Python"
      ],
      "kind": "library",
      "access": "restricted",
      "access_note": "It redirects to the TU Graz GitLab login page, while the author's profile page on the same server is public (checked 2026-10-07).",
      "claim": "A conference paper describes an open-source Python toolbox for standardised psychoacoustic analysis: loudness, sharpness, fluctuation strength, roughness, tonality, psychoacoustic annoyance, LAeq and LAmax, following ISO 532-1, DIN 45692 and ECMA-418, with the Zwicker model and the Sottek Hearing Model.",
      "standing": "newly-released",
      "standing_note": "Described in a conference paper in May 2026.",
      "license": "unknown",
      "maintainers": [
        "Eugen-Maximilian Stangl",
        "Julia Donnerer"
      ],
      "summary": "Python toolbox for psychoacoustic analysis from TU Graz, described in a 2026 student conference paper.",
      "ai_assistance": "not-stated",
      "paper": {
        "citation": "Stangl, E.-M., & Donnerer, J. (2026). PsyTools: An open-source Python toolbox for standardized psychoacoustic analysis. *POSTERS 2026: Proceedings of the International Student Scientific Conference Poster*, Czech Technical University in Prague, 172–173.",
        "url": "https://tugraz.elsevierpure.com/en/publications/psytools-an-open-source-python-toolbox-for-standardized-psychoaco/"
      },
      "sources": [
        "https://tugraz.elsevierpure.com/en/publications/psytools-an-open-source-python-toolbox-for-standardized-psychoaco/",
        "https://gitlab.tugraz.at/11F34386B3DC1474/psytools"
      ],
      "checked": "2026-10-07",
      "url": "https://zhenxianli.github.io/LISQM/projects/psytools.html",
      "last_commit": null,
      "latest_release": null,
      "prerelease": null,
      "activity": "unknown",
      "archived": false,
      "stars": null,
      "group": "unknown"
    }
  ],
  "gaps": [
    "roughness-din-38455",
    "tonality-din-45681",
    "tonal-audibility-iso-20065"
  ],
  "newly_released_only": [
    "loudness-moore-glasberg",
    "fluctuation-strength-ecma-418-2",
    "tone-to-noise-prominence-ratio",
    "tonal-audibility-iso-1996-2",
    "tonal-audibility-iec-61400-11",
    "impulsiveness",
    "equal-loudness-contours"
  ],
  "leads": [
    {
      "name": "Genesis Loudness Toolbox",
      "url": "http://www.genesis-acoustics.com/index.php?page=32",
      "languages": [
        "MATLAB"
      ],
      "claim": "Free MATLAB toolbox (2010) said to cover ISO 532B / DIN 45631, ANSI S3.4-2007, Zwicker's time-varying model, Glasberg & Moore (2002) and Boullet's (2006) loudness model for impulsive sounds.",
      "why": "An [archived copy](https://web.archive.org/web/20150306205824/http://genesis-acoustics.com/index.php?page=32) of the page (2015) says the ZIP file contains MATLAB source files, validation WAV files and a Readme with the terms of use, but the download page was not archived and the website could not be reached, so the code and its licence could not be checked.",
      "checked": "2026-10-07"
    },
    {
      "name": "Salford sound quality MATLAB codes",
      "url": "https://acoustics.salford.ac.uk/psychoacoustics/sound-quality-making-products-sound-better/an-introduction-to-sound-quality-testing/matlab-codes/",
      "languages": [
        "MATLAB"
      ],
      "claim": "Functions named `loudness_1991` (Zwicker loudness, free or diffuse field), `sharpness_Fastl` and `roughness4`.",
      "why": "The page describes the functions, but its \"Download the MATLAB codes\" item has no link, also in an [archived copy](https://web.archive.org/web/20250709072252/https://acoustics.salford.ac.uk/psychoacoustics/sound-quality-making-products-sound-better/an-introduction-to-sound-quality-testing/matlab-codes/) of July 2025, so the code could not be obtained.",
      "checked": "2026-10-07"
    }
  ],
  "updates": [
    {
      "date": "2026-10-27",
      "title": "Version 0.5.10: rota-order added",
      "body": "Added rota-order (ROTA), a newly released Python library for order analysis of noise and vibration from rotating\nmachinery. It computes the ECMA-418-1:2024 tone-to-noise ratio and prominence ratio of machine orders along a\nrun-up, and since its version 0.6.0 it wraps MoSQITo, sottek-hearing-model and SQAT to bin loudness, sharpness,\nroughness and tonality along rpm; the project map shows these links.\n"
    },
    {
      "date": "2026-10-19",
      "title": "Version 0.5.9: SQAT's interface follows pySQAT's layout",
      "body": "The FAQ, the SQAT and pySQAT pages and the Languages page now say that the graphical interface SQAT added in\nv2.0 follows the layout of pySQAT's interface, as the header of its code says.\n"
    },
    {
      "date": "2026-10-19",
      "title": "Version 0.5.8: SQAT's graphical interface",
      "body": "The SQAT page and the Languages page describe the graphical interface that SQAT added in v2.0, and the FAQ\nnames the SQAT version that pySQAT ports (v1.3).\n"
    },
    {
      "date": "2026-10-17",
      "title": "Version 0.5.7: SQAT v2.0 and ecma418-torch",
      "body": "- SQAT v2.0 is out. Its 4th-edition ECMA-418-2 functions and the Widmann annoyance model are now in a release,\n  the release is under the GPL, and the SQAT page says what changed from v1.3.\n- Added ecma418-torch, a newly released Python package with differentiable ECMA-418-2:2025 roughness and\n  fluctuation strength in PyTorch. It was found by the scheduled search for new projects.\n"
    },
    {
      "date": "2026-10-14",
      "title": "Version 0.5.6: the maps agree",
      "body": "The whole project map now shows every line of every metric page's map: a project with its author's own code for\none metric and ported code for another has both lines, and a comparison for one metric is drawn beside a code\nline for another. Only a same-contributor line is left out beside a line of the author's own code.\n"
    },
    {
      "date": "2026-10-10",
      "title": "Version 0.5.5: the map before the implementations",
      "body": "On each metric page the project map now comes right after the editions, before the table of implementations.\nOn the Projects page the legend of the map is back above the picture.\n"
    },
    {
      "date": "2026-10-10",
      "title": "Version 0.5.4: metric maps keep to their metric",
      "body": "A line on the map of a metric page now joins only projects listed for that metric; the whole project map still\nshows every recorded relation.\n"
    },
    {
      "date": "2026-10-10",
      "title": "Version 0.5.3: the Projects page",
      "body": "The Projects page opens with how its lists are ordered, then the project map with its legend under it.\n"
    },
    {
      "date": "2026-10-10",
      "title": "Version 0.5.2: tidier maps and links",
      "body": "- On the map of each metric page, projects that no line joins are laid out in rows instead of a column.\n- A link to a standard or a paper opens the Standards page at its whole row, which is marked.\n"
    },
    {
      "date": "2026-10-09",
      "title": "Version 0.5: search",
      "body": "A search field in the tab bar finds metrics, standards and papers, projects and function names; on phones it\nopens from the Search button. On the Projects page, a filter shows only the projects that match, for example a\nlanguage, a licence or a metric.\n\n- The project map gives every line its own end, so that lines no longer meet at one point, and joins every\n  pair of projects that share a contributor. Code from another project is \"ported or adapted\"; projects that\n  no line joins are drawn as boxes without lines, also on the map of each metric page.\n- Each standard or paper on the Home timeline links to its entry on the Standards page.\n- All text has one reading width; only tables, the timeline and the maps are wider.\n- Validation tags name HEAD acoustics ArtemiS SUITE wherever a project compared its results with it, now also\n  for SQAT's ECMA-418-2 loudness, roughness and tonality.\n- Metric pages and the Languages page flag licences that limit use; the FAQ says what a listing does not\n  certify.\n- Corrections from a review of the site.\n"
    },
    {
      "date": "2026-10-08",
      "title": "Version 0.4: the project map",
      "body": "A new page, the [project map](https://zhenxianli.github.io/LISQM/projects/map.html), shows how the listed\nprojects are connected: code ported or adapted from another project, the author's own code, use at run time,\nresults checked against another project, and shared contributors.\n"
    },
    {
      "date": "2026-10-08",
      "title": "Licence: CC BY 4.0 for the data and the text",
      "body": "The data and the text of LISQM are now released under CC BY 4.0: they may be reused, also commercially, with\ncredit. The code that builds the website stays under MIT. Versions up to 0.3.0 remain available under MIT.\n"
    },
    {
      "date": "2026-10-07",
      "title": "Version 0.3: ported code, citations and new projects",
      "body": "Method pages show which implementations were ported from which; a comparison with an implementation's own\nsource is marked as such. A new section, *Before you compare numbers*, lists the settings that make correct\nimplementations give different results.\n\n- Every project page says how to cite the project, and all references are available as BibTeX.\n- New projects: ITA-Toolbox, Mosqito.NET, two legacy MATLAB tools, and PsyTools in a new group,\n  *Status unknown*.\n- SQAT and MoSQITo (widely used) and sottek-hearing-model (a very good implementation) come first, in bold.\n- Each project page explains its kind: library/toolbox, research code, application, plug-in or reference\n  program.\n- The monthly refresh also reports broken links.\n"
    },
    {
      "date": "2026-10-07",
      "title": "Version 0.2: how each implementation was validated",
      "body": "A new section, *How it was validated*, says what each project checked, against what, and with what result.\nValidation tags name the reference, for example \"compared with MoSQITo\".\n\n- On the home page, \"+ more\" opens the remaining projects in place.\n- Edition labels link to the standard or paper.\n"
    },
    {
      "date": "2026-10-07",
      "title": "Two newly released projects",
      "body": "Added PsychoacousticMetrics.jl, a Julia library, and Kirin Hypha, a measurement plug-in for audio workstations\nwritten in Rust. Both were found by the first scheduled search for new projects.\n"
    },
    {
      "date": "2026-10-06",
      "title": "Version 0.1: the first public version",
      "body": "LISQM starts with 32 projects in eight languages and 22 methods, from Zwicker loudness to aural detectability.\nEvery implementation is tied to the standard edition or model paper it follows, with links to its sources.\nRepository and package data are refreshed monthly.\n"
    }
  ]
}
