Skip to content

Judge a hearing loop by IEC 60118-4 and its amplifier, loop and neck loop by IEC 62489-1 - #908

Merged
jmrplens merged 1 commit into
standards/iec-61063-steam-turbinesfrom
standards/afils-iec-60118-4-62489-1
Oct 1, 2026
Merged

jmrplens merged 1 commit into
standards/iec-61063-steam-turbinesfrom
standards/afils-iec-60118-4-62489-1

Conversation

@jmrplens

@jmrplens jmrplens commented Sep 30, 2026 •

Copy link
Copy Markdown
Owner

A hearing aid switched to its telecoil picks up a magnetic field instead of sound, so a talker fed through an amplifier into a loop of wire reaches the listener without the room in between. IEC 60118-4:2014, with its Amendment 1:2017, says what field an installed loop has to produce, where and with how little noise, and IEC 62489-1:2010 with its Amendment 1:2014 says how the amplifier, the loop as a load and the neck loop are measured and specified. Two new modules implement them, with every name exported from phonometry.electroacoustics.

electroacoustics.induction_loop judges the installed system. Levels are referred to REFERENCE_FIELD_STRENGTH_A_PER_M, 400 mA/m (3.1). field_strength_meter is the true-RMS meter of 6.1.3, flat or A-weighted, loop_test_noise the band-limited pink noise of 6.4 with its crest factor of 4, which meets both the "at least 18 dB" of IEC 60118-4 and the 18 dB plus or minus 2 dB of IEC 62489-1, and combi_signal the signal of 6.6 and Table 2. assess_background_noise classes a site against the 47, 32 and 22 dB of 7.2, tonal noise included. verify_induction_loop_system judges a room: the maximum field reaches the specified level at one point at least of the useful volume (8.2.7), every selected point is within 3 dB of it (8.4.3), the frequency response is within 3 dB of the one at 1 kHz from 100 Hz to 5 kHz (8.3.7), and the noise with the system switched on is below -47 dB, or no more than 1 dB over the loop-off level, depending on the site's reference signal-to-noise ratio (10.4.7 as amended). verify_small_volume_system judges a refuge, call point or counter at the points of Figures 2 and 3 as the amendment draws them (small_volume_measurement_points), or at the points of a useful volume agreed by contract, which has to include each height of 9.2 or 9.3 (9.4): within 6 dB everywhere, 0 dB at one point, nowhere in the standing area above +8 dB. verify_amplifier_overload runs the overload test of the amendment, 7 dB down, from 1 kHz to where the loop voltage first doubles or to the frequency of Table 4 (OVERLOAD_TEST_FREQUENCIES), whichever is higher, and judges the loop voltage at the Table 4 frequency, where 10.3.3 puts the requirement, against the amplifier's compliance voltage; an amplifier current response, the way a correction for metal loss shows, can be passed in.

electroacoustics.induction_loop_components holds the components. rectangular_loop_field is the exact Biot-Savart field of a rectangular loop of any number of turns at any point, and loop_centre_field the centre formula of E.1. loop_current and loop_dimensions give the current a loop needs for 400 mA/m 1.4 m above its centre and the largest square or 3:1 loop an amplifier drives there (5.4.10, 5.4.11). loop_resistance uses the copper of IEC 60028, rectangular_loop_inductance Grover's Formula (58), and loop_impedance combines them into the load an amplifier sees. For the amplifier, maximum_output_current reads the distortion-limited current of 5.4.7 from a sweep of the voltage across the load resistance and the distortion there, compliance_voltage is 5.4.8, equivalent_input_noise_voltage and amplifier_signal_to_noise_ratio are 5.4.9, amplifier_frequency_response is 5.4.12, agc_characteristic reads the AGC range exactly on the measured characteristic, against the 32 dB 5.4.13.4 recommends, and quadrature_phase_error is 5.4.14. neck_loop_characteristics gives the input voltage for 400 mA/m, the minimum input impedance and the 3 dB frequencies of clause 9, and verify_neck_loop judges a neck loop against the two types of the draft Amendment 2 (NECK_LOOP_TYPES), which is cited as a draft throughout.

Every result has .plot(), and every verdict is a single object with passes. A new guide, Audio-Frequency Induction Loops (IEC 60118-4), in English and Spanish under Electroacoustics, takes the reference and its units, the field of a loop, the loop as a load, the meter and the signals, a 10 m by 20 m place of worship, a counter, the overload test, an amplifier and a neck loop through both standards, with seven figures and a diagram of where each kind of system is measured.

Nothing breaks. Every name is new and lives in phonometry.electroacoustics; the package root is unchanged and no existing function changes its signature or its output, so there is nothing to migrate.

Every limit, table and figure was read on the printed page: IEC 60118-4:2014 in BS EN 60118-4:2015, its Amendment 1 in UNE-EN IEC 60118-4:2016/A1:2018 (whose text replaces clauses 9 and 10, and is what the library applies), IEC 62489-1:2010 with Amendment 1 in the consolidated BS EN 62489-1:2010+A1:2015, the draft Amendment 2 in E DIN EN 62489-1/A2:2017-10, IEC 60028:1925 for copper and Grover's Inductance Calculations for Formula (58). The oracles are the printed values: Table B.1 of IEC 62489-1, whose six resistances come back from the 20 degree resistivity and four of whose six inductances come back from Formula (58) without its internal term, with the impedances of all six from its printed R and L; Table 4 and the dimensions of Figures 2 and 3 of the amendment; Tables 2 and 3 and the classes of 7.2; the telecoil's cosine law and the magnetic units of Annex E; the quadrature example of 5.4.14.1; the centre formula of E.1, written in the conformance row, against the Biot-Savart field; two points on each curve of Figure E.2 b), within half a decibel; and the ends of the five curves of Figure H.1 at a 10 m shorter side, within 0.03 A, both read off the page. The limits of 8.2.7, 8.3.7, 8.4.3, 9.5, 10.3.3 and 10.4.7 are held at their printed value and just past it. The conformance report gains 67 rows, all passing, and the tests hold what the plots draw as well as the numbers.

What is not here, and why: the metal loss of Annex F has no model in the standard and none here, since its correction is the response the installer measures; the draft's Table D.1 rests on a battery model it does not give; the inductances Table B.1 prints for the neck loop and the 15 m by 40 m loop are not reached by any reading of the wire size and are not claimed; the loop listener, the assistive listening device and the monitoring devices of IEC 62489-1 are single values to compare; and the electromagnetic exposure of IEC 62489-2 is outside the library.

Thirteen printed defects of the three documents are in the errata register in both languages, each with its document, PDF page and printed folio: the band-limit responses of 6.4 NOTE 2 and of 5.4.8.2 NOTE 3 printed the wrong way round; the "at least one-third-order" filters of 6.4 for third-order; the meter of 6.6 and 8.2.1 referred to 5.1 for 6.1; the outer radius of Figure 2 a) keyed as 200 mm, which the amendment corrects; the +12 dB of the informative Annex A.4 against the +8 dB of 9.5; the vertical-field line of Figure E.2 a) drawn along the loop, while both curves of panel b) are the traverse across its width that E.1 describes; the flux density of 1 A/m printed as 1,256 µT; the references of 8.4 to a 10.2.7 the amendment moves to 10.4.7; the noise rule of 10.2.7 and 10.4.7, whose "greater than 47 dB" and "less than 47 dB" leave exactly 47 dB out, where the library applies the 1 dB rule; the counter loop's perimeter of Table B.1; the maximum output current of 5.4.8.2 a) referred to 5.4.5 for 5.4.7; the fall of 5.4.14.1 printed as 0,72 dB where it is 0,79 dB; and a Figure 1 in F.2.3 for Figure F.1.

Gates. On this branch ruff check and ruff format are clean (1257 files), mypy is clean on 660 files of src, scripts, the stub and the typing tests, and bandit is clean; the conformance report (1758 of 1758 checks), the API reference, the llms files, the site reports, the catalogue data and the PyPI readme regenerate without a diff; the test modules this change adds or touches pass (436 passed); and the checks on frozen constants, parameter units, published sources, errata evidence, em dashes, digit grouping and markdown hazards, the static checks of the documentation snippets (7030 blocks over 714 pages), the guides index (159 guides) and the language parity pass. On the branch at the top of this stack, which carries this change as it is here, the full suite passes (25 145 passed, 71 skipped), every documentation snippet runs (7159 blocks over 723 pages), the site builds (971 pages) with 0 type errors, 0 warnings and clean HTML validation, and a fresh regeneration of the figures and the example fiches reproduces all 3172 committed figures and 75 fiches unchanged and passes the figure checks on contrast, language, annotations, ticks, decimal points, legends, tick and text clearance and minus signs.

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @jmrplens, your pull request is larger than the review limit of 150,000 diff characters

@coderabbitai

coderabbitai Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 59 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 2 included reviews currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration

Configuration used: Repository: jmrplens/phonometry/.coderabbit.yaml

Review profile: CHILL

Plan: Advanced

Run ID: ab21555c-7ba9-4044-8bbe-fc486d63a08f

📥 Commits

Reviewing files that changed from the base of the PR and between f701ed9 and 2caa2e5.

⛔ Files ignored due to path filters (35)
  • .github/badges/conformance-summary.svg is excluded by !**/*.svg
  • .github/badges/conformance-summary_dark.svg is excluded by !**/*.svg
  • .github/images/diagram_induction_loop_measurement.svg is excluded by !**/*.svg
  • .github/images/diagram_induction_loop_measurement_dark.svg is excluded by !**/*.svg
  • .github/images/diagram_induction_loop_measurement_es.svg is excluded by !**/*.svg
  • .github/images/diagram_induction_loop_measurement_es_dark.svg is excluded by !**/*.svg
  • .github/images/induction_loop_amplifier.svg is excluded by !**/*.svg
  • .github/images/induction_loop_amplifier_dark.svg is excluded by !**/*.svg
  • .github/images/induction_loop_amplifier_es.svg is excluded by !**/*.svg
  • .github/images/induction_loop_amplifier_es_dark.svg is excluded by !**/*.svg
  • .github/images/induction_loop_combi.svg is excluded by !**/*.svg
  • .github/images/induction_loop_combi_dark.svg is excluded by !**/*.svg
  • .github/images/induction_loop_combi_es.svg is excluded by !**/*.svg
  • .github/images/induction_loop_combi_es_dark.svg is excluded by !**/*.svg
  • .github/images/induction_loop_counter.svg is excluded by !**/*.svg
  • .github/images/induction_loop_counter_dark.svg is excluded by !**/*.svg
  • .github/images/induction_loop_counter_es.svg is excluded by !**/*.svg
  • .github/images/induction_loop_counter_es_dark.svg is excluded by !**/*.svg
  • .github/images/induction_loop_field.svg is excluded by !**/*.svg
  • .github/images/induction_loop_field_dark.svg is excluded by !**/*.svg
  • .github/images/induction_loop_field_es.svg is excluded by !**/*.svg
  • .github/images/induction_loop_field_es_dark.svg is excluded by !**/*.svg
  • .github/images/induction_loop_neck_loop.svg is excluded by !**/*.svg
  • .github/images/induction_loop_neck_loop_dark.svg is excluded by !**/*.svg
  • .github/images/induction_loop_neck_loop_es.svg is excluded by !**/*.svg
  • .github/images/induction_loop_neck_loop_es_dark.svg is excluded by !**/*.svg
  • .github/images/induction_loop_overload.svg is excluded by !**/*.svg
  • .github/images/induction_loop_overload_dark.svg is excluded by !**/*.svg
  • .github/images/induction_loop_overload_es.svg is excluded by !**/*.svg
  • .github/images/induction_loop_overload_es_dark.svg is excluded by !**/*.svg
  • .github/images/induction_loop_verification.svg is excluded by !**/*.svg
  • .github/images/induction_loop_verification_dark.svg is excluded by !**/*.svg
  • .github/images/induction_loop_verification_es.svg is excluded by !**/*.svg
  • .github/images/induction_loop_verification_es_dark.svg is excluded by !**/*.svg
  • site/src/generated/api-sidebar.mjs is excluded by !**/generated/**
📒 Files selected for processing (58)
  • .zenodo.json
  • CHANGELOG.md
  • README.md
  • README_PYPI.md
  • docs/CONFORMANCE.md
  • docs/ERRATA.es.md
  • docs/ERRATA.md
  • docs/README.md
  • docs/conformance.json
  • docs/devices/electroacoustics/index.md
  • docs/devices/electroacoustics/induction-loops.md
  • docs/devices/index.md
  • docs/reference/api/index.md
  • docs/start/getting-started.md
  • docs/start/why-phonometry.md
  • llms-full.txt
  • llms.txt
  • scripts/api_taxonomy.py
  • scripts/conformance/domains/induction_loop.py
  • scripts/conformance/units.py
  • scripts/conformance_report.py
  • scripts/diagrams/devices.py
  • scripts/diagrams/i18n.py
  • scripts/diagrams/registry.py
  • scripts/figures/devices.py
  • scripts/figures/registry.py
  • scripts/generate_graphs.py
  • site/public/llms/llms-devices-electroacoustics.txt
  • site/public/llms/llms-devices.txt
  • site/public/llms/llms-start.txt
  • site/src/content/docs/devices/electroacoustics/index.mdx
  • site/src/content/docs/devices/electroacoustics/induction-loops.mdx
  • site/src/content/docs/devices/index.mdx
  • site/src/content/docs/es/devices/electroacoustics/index.mdx
  • site/src/content/docs/es/devices/electroacoustics/induction-loops.mdx
  • site/src/content/docs/es/devices/index.mdx
  • site/src/content/docs/es/index.mdx
  • site/src/content/docs/es/reference/conformance.mdx
  • site/src/content/docs/es/reference/errata.md
  • site/src/content/docs/es/start/guides.md
  • site/src/content/docs/index.mdx
  • site/src/content/docs/reference/api/electroacoustics/induction-loop-components.md
  • site/src/content/docs/reference/api/electroacoustics/induction-loop.md
  • site/src/content/docs/reference/api/index.md
  • site/src/content/docs/reference/conformance.mdx
  • site/src/content/docs/reference/errata.md
  • site/src/content/docs/start/guides.md
  • site/src/data/topics.mjs
  • src/phonometry/_plot/induction_loop.py
  • src/phonometry/electroacoustics/__init__.py
  • src/phonometry/electroacoustics/induction_loop.py
  • src/phonometry/electroacoustics/induction_loop_components.py
  • tests/electroacoustics/test_induction_loop.py
  • tests/electroacoustics/test_induction_loop_components.py
  • tests/reference_data/__init__.py
  • tests/reference_data/induction_loop.py
  • tests/result_factories.py
  • tests/test_result_plots.py
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Autopilot is currently an internal CodeRabbit preview.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@jmrplens
jmrplens added this pull request to stack #900 September 30, 2026 17:59
@github-actions github-actions Bot added documentation Improvements or additions to documentation conformance Standard clause coverage, reference values or errata errata Confirmed defect in a published standard, tracked in docs/ERRATA.md validation Reference data and oracles used to check results against normative values api Public API surface, naming and deprecations figures Generated plots, diagrams and animations site Documentation website i18n English and Spanish translations area: electroacoustics Transducers, arrays and electroacoustic devices area: core Shared internals and cross-cutting code every domain depends on labels Sep 30, 2026
@codecov

codecov Bot commented Sep 30, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 96.80%. Comparing base (0d7ef7f) to head (2caa2e5).

Additional details and impacted files
@@                          Coverage Diff                          @@
##           standards/iec-61063-steam-turbines     #908     +/-   ##
=====================================================================
  Coverage                               96.80%   96.80%             
=====================================================================
  Files                                     421      424      +3     
  Lines                                   78629    79779   +1150     
=====================================================================
+ Hits                                    76114    77234   +1120     
- Misses                                   2515     2545     +30     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@github-actions

github-actions Bot commented Sep 30, 2026 •

Copy link
Copy Markdown
Contributor

Numerical conformance

All 1758 conformance checks pass, across 107 domains and 513 standards

1758/1758 checks pass across 107 domains and 513 standards (217 normative designations, 123 further published sources).

Used in the tables below is how much of that clause's published tolerance the deviation consumes: 100 % sits exactly on the limit, 5 % uses a twentieth of the allowance, and a dash means the clause states no two-sided tolerance for the quantity, so there is no budget to spend. It is reported and never used to decide a verdict, which is settled at full precision before any rounding.

New checks (314)

Standard Quantity Deviation Used
IEC 61672-1:2013 Table 4 Reference responses and limits of LAFmax - LA and LAE - LA, 12 durations 0 0 %
IEC 61672-1:2013 Table 4 Reference responses and limits of LASmax - LA, 9 durations 0 0 %
IEC 61672-1:2013 Table 4, Equations (7) and (8) Reference toneburst responses against 10 lg(1 - exp(-Tb/tau)) and 10 lg(Tb/T0) 0 0 %
IEC 61672-1:2013 Table 5 Reference differences LCpeak - LC and limits, 5 test signals 0 0 %
IEC 61672-1:2013 Table B.1 Maximum-permitted uncertainties, 31 printed rows (the F and S decay rates in two) 0 0 %
IEC 61672-3:2013 12.16 with IEC 61672-1:2013 Table 3 Acoustical weighting at 8 kHz, class 1, upper limit 0 0 %
IEC 61672-3:2013 12.16 with IEC 61672-1:2013 Table 3 Acoustical weighting at 8 kHz, class 1, lower limit 0 0 %
IEC 61672-3:2013 12.16 with IEC 61672-1:2013 Table 3 Acoustical weighting at 125 Hz, class 2, lower limit 0 0 %
IEC 61672-3:2013 12.16 with IEC 61672-1:2013 Table 3 Acoustical weighting at 8 kHz, class 2, upper limit 0 0 %
IEC 61672-3:2013 13.10 with IEC 61672-1:2013 Table 3 Electrical weighting A at 16 kHz, class 1, lower limit 0 0 %
IEC 61672-3:2013 13.10 with IEC 61672-1:2013 Table 3 Electrical weighting C at 1 kHz, class 1, upper limit 0 0 %
IEC 61672-3:2013 13.10 with IEC 61672-1:2013 Table 3 Electrical weighting Z at 8 kHz, class 2, lower limit 0 0 %
… 302 more

Removed checks (3)

Standard Quantity Deviation Used
ISO 10140-5:2010+A1 Annex B, Table B.1 Reference elements end-to-end: printed Rw (C; Ctr) of all three exact -
ISO 10140-5:2010+A1 Annex C, Table C.1 Reference floors end-to-end: printed Ln,t,r,0,w (CI) of both exact -
SAE ARP 5534 pure-tone coefficient (ISO 9613-1) Mid-band α at 1 kHz, 25 °C, 70 % RH, 101.325 kPa, dB/m 0 dB/m 0 %

Closest to their published limit (top 5)

The rows with the least room left, so the ones a change is most likely to push over.

Standard Quantity Deviation Used
ISO/TR 17534-3:2015 Table 3 Ground-projected path length dp, m 0.005 m 100 %
DIN 4150-2:1999-06 Annex C, Example 5 KB_FTr with hammer b) in the rest hours, Formula (5) -0.005 100 %
DIN 4150-2:1999-06 Annex C, Example 8 KB_FTm over the record with the passage maxima alone -0.0005 100 %
E DIN 4150-2:2023-08 Annex B, Table B.1 KB_FTm,Zug of the metro north by Formula (5) -0.0005 100 %
Long 2e Table 14.9 (worked duct-borne sheet, supply path) Fan to room, 8 octave bands -> 52/42/30/18/9/-2/-2/-1 dB at the receiver 1 dB 100 %

Pass Tests & coverage: 147942 tests, 0 failures (all green)
Python Version Tests Failures Coverage Status
macos-latest-3.13 24657 0 96.8% Pass Passed
macos-latest-3.14 24657 0 96.8% Pass Passed
ubuntu-latest-3.13 24657 0 96.8% Pass Passed
ubuntu-latest-3.14 24657 0 96.8% Pass Passed
windows-latest-3.13 24657 0 96.8% Pass Passed
windows-latest-3.14 24657 0 96.8% Pass Passed

Full report at this commit: docs/CONFORMANCE.md · docs/conformance.json · full CI artifacts

@jmrplens
jmrplens force-pushed the standards/afils-iec-60118-4-62489-1 branch from f701ed9 to 79a7464 Compare October 1, 2026 00:22
@jmrplens
jmrplens force-pushed the standards/afils-iec-60118-4-62489-1 branch from 79a7464 to e6ed92c Compare October 1, 2026 03:23
@jmrplens
jmrplens force-pushed the standards/afils-iec-60118-4-62489-1 branch from e6ed92c to 50896eb Compare October 1, 2026 06:09
…loop by IEC 62489-1

An installed hearing loop can now be judged by IEC 60118-4 with its Amendment 1: the field reaches its level at one point, stays within 3 dB over the useful volume, keeps its frequency response and its noise, a refuge or a counter is judged at the points of Figures 2 and 3, and the amplifier passes the overload test at the frequency of Table 4. Its components are measured by IEC 62489-1: the Biot-Savart field of a rectangular loop, the current and size a loop needs, its resistance, inductance and impedance, the amplifier's maximum current, compliance voltage, noise, response, AGC range and quadrature error, and a neck loop against the two types of the draft Amendment 2. Every result draws its own figure, a new guide in both languages walks a place of worship, a counter, an amplifier and a neck loop through both standards, the conformance report gains 67 rows and thirteen printed defects are in the errata register.
@jmrplens
jmrplens force-pushed the standards/afils-iec-60118-4-62489-1 branch from 50896eb to 2caa2e5 Compare October 1, 2026 08:04
@sonarqubecloud

sonarqubecloud Bot commented Oct 1, 2026

Copy link
Copy Markdown

@jmrplens
jmrplens merged commit a8de726 into main Oct 1, 2026
7 checks passed
@jmrplens
jmrplens deleted the standards/afils-iec-60118-4-62489-1 branch October 1, 2026 09:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

api Public API surface, naming and deprecations area: core Shared internals and cross-cutting code every domain depends on area: electroacoustics Transducers, arrays and electroacoustic devices conformance Standard clause coverage, reference values or errata documentation Improvements or additions to documentation errata Confirmed defect in a published standard, tracked in docs/ERRATA.md figures Generated plots, diagrams and animations i18n English and Spanish translations site Documentation website validation Reference data and oracles used to check results against normative values

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant