# rota-order

> Part of [LISQM](https://zhenxianli.github.io/LISQM/) (List of Implementations of Sound Quality Metrics), a list of open-source implementations of psychoacoustic metrics. Data as of 2026-10-28. Web page: https://zhenxianli.github.io/LISQM/projects/rota-order.html

**Newly released project.** First released in October 2026; the README calls it pre-alpha. Not yet seen to be widely used in the community. Check its validation before relying on it.

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.

- **Full name:** ROTA: Rotational Order Tracking and Analysis
- **Repository:** https://github.com/ZhenxianLi/rota-order
- **Documentation:** https://github.com/ZhenxianLi/rota-order#readme
- **Language:** Python
- **Kind:** Library/Toolbox (Functions to call from your own code: a Python package, a MATLAB toolbox, or a C, C++, C#, Rust or Julia library.)
- **Group:** newly released (First released less than about a year ago, and not yet seen to be widely used in the community.)
- **Licence:** GPL-3.0-or-later
- **Package:** PyPI `rota-order` (https://pypi.org/project/rota-order/)
- **Install:** `pip install rota-order`
- **Latest release:** 0.7.0 (2026-10)
- **Last commit:** 2026-10-28 (active)
- **Maintainers:** Zhenxian LI
- **AI assistance:** disclosed — The README says that Claude (Anthropic) was used as an assistant during development.
- **How to cite:** The README points to `CITATION.cff` ("Cite this repository" on GitHub); a Zenodo DOI is planned for version 1.0. The repository has a [CITATION.cff](https://github.com/ZhenxianLi/rota-order/blob/main/CITATION.cff) file. Name the version or commit you used.
- **Entry checked:** 2026-10-28

## What it implements

| Metric | Edition | Functions | Status | Validation (as stated) | Notes |
|---|---|---|---|---|---|
| [Zwicker loudness](https://zhenxianli.github.io/LISQM/metrics/loudness-zwicker.html) | [ISO 532-1:2017](https://www.iso.org/standard/63077.html) (time-varying, through MoSQITo's loudness_zwtv; since 0.6.0) | `rota.bridges.mosqito.loudness` | available | own tests only | — |
| [Zwicker loudness](https://zhenxianli.github.io/LISQM/metrics/loudness-zwicker.html) | [ISO 532-1:2017](https://www.iso.org/standard/63077.html) (time-varying, through SQAT v2.0's Loudness_ISO532_1 in MATLAB; since 0.6.0) | `rota.bridges.sqat.loudness` | available | own tests only | — |
| [Sottek Hearing Model loudness](https://zhenxianli.github.io/LISQM/metrics/loudness-ecma-418-2.html) | [ECMA-418-2:2025 (4th ed.)](https://ecma-international.org/wp-content/uploads/ECMA-418-2_4th_edition_june_2025.pdf) (through sottek-hearing-model's shm_loudness_ecma_from_comp; since 0.6.0) | `rota.bridges.sottek_hearing_model.loudness` | available | own tests only | — |
| [Sharpness](https://zhenxianli.github.io/LISQM/metrics/sharpness.html) | [DIN 45692:2009](https://www.dinmedia.de/en/standard/din-45692/117635111) (through MoSQITo's sharpness_din_from_loudness; since 0.6.0) | `rota.bridges.mosqito.sharpness` | available | own tests only | — |
| [Sharpness](https://zhenxianli.github.io/LISQM/metrics/sharpness.html) | [DIN 45692:2009](https://www.dinmedia.de/en/standard/din-45692/117635111) (through SQAT v2.0's Sharpness_DIN45692_from_loudness in MATLAB; since 0.6.0) | `rota.bridges.sqat.sharpness` | available | own tests only | — |
| [Roughness (Daniel & Weber)](https://zhenxianli.github.io/LISQM/metrics/roughness-daniel-weber.html) | [Daniel & Weber (1997)](https://zhenxianli.github.io/LISQM/standards.html#ref-daniel-weber-1997) (through MoSQITo's roughness_dw; since 0.6.0) | `rota.bridges.mosqito.roughness` | available | own tests only | — |
| [Roughness (Daniel & Weber)](https://zhenxianli.github.io/LISQM/metrics/roughness-daniel-weber.html) | [Daniel & Weber (1997)](https://zhenxianli.github.io/LISQM/standards.html#ref-daniel-weber-1997) (through SQAT v2.0's Roughness_Daniel1997 in MATLAB; since 0.6.0) | `rota.bridges.sqat.roughness` | available | own tests only | — |
| [Sottek Hearing Model roughness](https://zhenxianli.github.io/LISQM/metrics/roughness-ecma-418-2.html) | [ECMA-418-2:2025 (4th ed.)](https://ecma-international.org/wp-content/uploads/ECMA-418-2_4th_edition_june_2025.pdf) (through sottek-hearing-model's shm_roughness_ecma; since 0.6.0) | `rota.bridges.sottek_hearing_model.roughness` | available | own tests only | — |
| [Sottek Hearing Model tonality](https://zhenxianli.github.io/LISQM/metrics/tonality-ecma-418-2.html) | [ECMA-418-2:2025 (4th ed.)](https://ecma-international.org/wp-content/uploads/ECMA-418-2_4th_edition_june_2025.pdf) (through sottek-hearing-model's shm_tonality_ecma; since 0.6.0) | `rota.bridges.sottek_hearing_model.tonality` | available | own tests only | — |
| [Sottek Hearing Model tonality](https://zhenxianli.github.io/LISQM/metrics/tonality-ecma-418-2.html) | [ECMA-418-2:2025 (4th ed.)](https://ecma-international.org/wp-content/uploads/ECMA-418-2_4th_edition_june_2025.pdf) (through SQAT v2.0's Tonality_ECMA418_2 in MATLAB; since 0.6.0) | `rota.bridges.sqat.tonality` | available | own tests only | — |
| [Tone-to-noise ratio and prominence ratio](https://zhenxianli.github.io/LISQM/metrics/tone-to-noise-prominence-ratio.html) | [ECMA-418-1:2024 (3rd ed.)](https://ecma-international.org/wp-content/uploads/ECMA-418-1_3rd_edition_december_2024.pdf) (tones in a power spectrum, and orders of a rotating machine along a run-up; since 0.5.0) | `rota.tonal.tone_prominence`, `rota.tonal.order_prominence`, `rota.tonal.prominence_criterion` | available | standard or paper data (formula examples; no published TNR or PR value); also compared with MoSQITo | The "prominent" flag applies the numeric criterion only; the aural check of audibility (Sections 11.8 and 12.8) is not assessed. |

## How it was validated

As reported by the project; LISQM has not run the code. Two implementations that agree can still share the same error.

- [Zwicker loudness](https://zhenxianli.github.io/LISQM/metrics/loudness-zwicker.html), ISO 532-1:2017 (time-varying, through MoSQITo's loudness_zwtv): own tests only
  - Tests, which run only where MoSQITo is installed (the project's continuous integration does not install it), check that the wrapper returns what a direct call of MoSQITo gives on the same signal, also after resampling to 48 kHz, that the calibration factor scales the loudness, and that `vs_rpm` gives what binning the values by hand gives.
- [Zwicker loudness](https://zhenxianli.github.io/LISQM/metrics/loudness-zwicker.html), ISO 532-1:2017 (time-varying, through SQAT v2.0's Loudness_ISO532_1 in MATLAB); [Sharpness](https://zhenxianli.github.io/LISQM/metrics/sharpness.html), DIN 45692:2009 (through SQAT v2.0's Sharpness_DIN45692_from_loudness in MATLAB); [Roughness (Daniel & Weber)](https://zhenxianli.github.io/LISQM/metrics/roughness-daniel-weber.html), Daniel & Weber (1997) (through SQAT v2.0's Roughness_Daniel1997 in MATLAB); [Sottek Hearing Model tonality](https://zhenxianli.github.io/LISQM/metrics/tonality-ecma-418-2.html), ECMA-418-2:2025 (4th ed.) (through SQAT v2.0's Tonality_ECMA418_2 in MATLAB): own tests only
  - Tests with a stub engine check the call passed to SQAT and the conversion of its output; the comparison with a direct SQAT call runs only where MATLAB and SQAT v2.0 are installed.
- [Sottek Hearing Model loudness](https://zhenxianli.github.io/LISQM/metrics/loudness-ecma-418-2.html), ECMA-418-2:2025 (4th ed.); [Sottek Hearing Model roughness](https://zhenxianli.github.io/LISQM/metrics/roughness-ecma-418-2.html), ECMA-418-2:2025 (4th ed.): own tests only
  - 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.
- [Sharpness](https://zhenxianli.github.io/LISQM/metrics/sharpness.html), DIN 45692:2009 (through MoSQITo's sharpness_din_from_loudness): own tests only
  - Tests, which run only where MoSQITo is installed (the project's continuous integration does not install it), check that the wrapper returns what a direct call of MoSQITo gives, also when the sharpness is computed from an earlier loudness result.
- [Roughness (Daniel & Weber)](https://zhenxianli.github.io/LISQM/metrics/roughness-daniel-weber.html), Daniel & Weber (1997) (through MoSQITo's roughness_dw): own tests only
  - Tests, which run only where MoSQITo is installed (the project's continuous integration does not install it), check that the wrapper returns what a direct call of MoSQITo gives.
- [Sottek Hearing Model tonality](https://zhenxianli.github.io/LISQM/metrics/tonality-ecma-418-2.html), ECMA-418-2:2025 (4th ed.) (through sottek-hearing-model's shm_tonality_ecma): own tests only
  - 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.
- [Tone-to-noise ratio and prominence ratio](https://zhenxianli.github.io/LISQM/metrics/tone-to-noise-prominence-ratio.html), ECMA-418-1:2024 (3rd ed.): standard or paper data (formula examples; no published TNR or PR value); also compared with **[MoSQITo](https://zhenxianli.github.io/LISQM/projects/mosqito.html)**
  - 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.

## Before you compare numbers

Implementations of the same metric can give different numbers without either being wrong. Check these choices first.

- 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.
- 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).
- Input in any unit is turned into sound pressure in Pa by an explicit calibration factor and resampled to 48 kHz.

For single metrics:

- [Tone-to-noise ratio and prominence ratio](https://zhenxianli.github.io/LISQM/metrics/tone-to-noise-prominence-ratio.html) (ECMA-418-1:2024 (3rd ed.)): `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.

## 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.

## Before you rely on it

- 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.

## 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/
