Skip to content
This documentation describes version 4.0.0, which is not released yet. The current version on PyPI is 3.3.0 and does not carry everything described here.

electroacoustics.induction_loop_components

Components of an audio-frequency induction-loop system: the loop, its amplifier, the neck loop.

IEC 62489-1:2010, with its Amendment 1:2014 (read in the consolidated BS EN 62489-1:2010+A1:2015), says how the manufacturer of an induction-loop amplifier, of a loop and of a neck loop measures and states what the component does. IEC 60118-4:2014 then judges the installed system built from them (phonometry.electroacoustics.induction_loop). This module holds the parts of IEC 62489-1 that are arithmetic, and the loop formulas both standards lean on.

A current in a loop of turns produces a magnetic field strength , in amperes per metre, that is proportional to everywhere and falls with distance from the conductor. IEC 60118-4:2014 E.1 gives the one closed form it uses, the field at the centre of a single-turn square loop of side , in its own plane,

and extends it to a rectangle of sides and : “Provided that the sides d1, d2 of a rectangular loop are not extremely different”, is taken as (loop_centre_field). Everything else about the field is a figure in that standard. Here it is computed: rectangular_loop_field sums the Biot-Savart field of the four straight sides exactly, at any point, which is how the E.1 formula is checked (it is exact for the square and off by 0,35 dB for a rectangle of aspect ratio 1,5). Two of the figures are reproduced: the curves of Figure E.2 b), both components within about half a decibel, taken across the 10-unit width of its 15 by 10 loop, as E.1 describes them (the figure’s panel a) puts the vertical-field line along the length, see docs/ERRATA.md), and the currents of Figure H.1 through loop_current. Figures E.3 to E.5 and A.1 draw the same kind of pattern and are not checked point by point.

IEC 62489-1:2010 5.4.10.2 fixes where an amplifier’s field is measured: 1,4 m above the centre of a horizontal square loop whose resistance and inductance equal the rated load. loop_current gives the current that loop needs for a field strength, and loop_dimensions answers 5.4.11 the other way round, the largest square loop, or loop of aspect ratio 3:1, whose centre reaches 400 mA/m at that height with the amplifier’s current.

The loop is a resistance in series with an inductance (IEC 62489-1 B.2). The resistance is for a conductor of length and area (loop_resistance), with the resistivity of standard annealed copper, 1/58 ohm square millimetre per metre at 20 degrees Celsius and a temperature coefficient of 0,00393 per degree (IEC 60028:1925, clause I). The inductance of a rectangle of round wire is Grover’s Formula (58) (rectangular_loop_inductance); for turns it is multiplied by , the perfect coupling Table B.1 assumes. The impedance rises above the frequency where the reactance equals the resistance, where it is times the resistance (IEC 60118-4 E.3), and the voltage the amplifier has to deliver is (LoopImpedance).

Table B.1 of IEC 62489-1 is the oracle. Its six resistances are reproduced by the 20 degree resistivity with the perimeter of each loop, which for the 0,35 m by 0,45 m counter loop is 1,6 m and not the printed 1,5 m (see docs/ERRATA.md). Grover’s formula reproduces four of its six inductances to the printed microhenry once the term for the flux inside the wire is left out: 189, 22, 47 and 109 microhenries. Table B.1 does not say which formula it used, and the two it does not reproduce, the neck loop (79 against 85) and the 15 m by 40 m loop (206 against 218), are not reached by any reading of the wire size either, so they are not claimed. The internal term is kept by default here, because at audio frequencies the skin depth in copper (2 mm at 1 kHz) is larger than the radius of every conductor Table B.1 lists.

IEC 62489-1 clause 5 lists what an amplifier’s specification states, and which of it is measured. The measured characteristics that are computations are:

  • the maximum (distortion-limited) output current, 5.4.7: the 1 kHz load current is raised until the total harmonic distortion across the resistive part of the load reaches the rated value, and the current is the total voltage across that resistance over its value (maximum_output_current);
  • the compliance voltage, 5.4.8: the maximum positive-going and negative-going peak voltages across the rated load, over at least 60 s of the specified pink noise, averaged and divided by (compliance_voltage);
  • the noise, 5.4.9: the equivalent input noise voltage and the signal-to-noise ratio dB (equivalent_input_noise_voltage, amplifier_signal_to_noise_ratio);
  • the frequency response, 5.4.12: the load current at one-third-octave centres from at least 50 Hz to 8 kHz, with the response at 1 kHz taken as 0 dB (amplifier_frequency_response);
  • the automatic gain control, 5.4.13: the steady-state output current against the source e.m.f., and the recommendation Amendment 1 added as 5.4.13.4, an input range of at least 32 dB for an output change of at most 3 dB (agc_characteristic);
  • the phase error of the quadrature network of a phased loop array, 5.4.14: the maximum deviation from 90 degrees between the loop currents over 100 Hz to 5 kHz (quadrature_phase_error).

The rated conditions (5.4.1 to 5.4.6) are what the manufacturer states and are not measured; the standard measuring conditions of 5.2.2 put the output current 10 dB below the rated one. The test signal of 5.4.8.2 b) is the pink noise of IEC 60118-4 6.4, generated by loop_test_noise.

Clause 9, added by Amendment 1, specifies a neck loop by the input voltage that produces 400 mA/m at the telecoil position of the test jig of Annex E, the smallest magnitude of its input impedance over 100 Hz to 5 kHz rounded to the nearest ohm, and its frequency response, stated in text as the frequencies where it differs from the response at 1 kHz by 3 dB (neck_loop_characteristics). The draft Amendment 2 (prEN 62489-1:2010/prA2:2017, read in E DIN EN 62489-1/A2:2017-10) replaces Annex D with two example specifications: type 1, for audio sources powered by two primary 1,5 V cells and higher voltage supplies, by a DC resistance of 32 ohm plus or minus 5 %, and type 2, a neck loop with a transformer or an amplifier, by an input DC resistance of at least 32 ohm, both reaching 400 mA/m on the jig with at most 1,06 V at the input (NECK_LOOP_TYPES, verify_neck_loop). It is a draft, and this module cites it as one. Its Table D.1 (the field a type 1 loop reaches from a 3 V and a 9 V battery) rests on a source model the draft does not give and is not reproduced.

The loop listener and the assistive listening device of Annex F, and the monitoring devices of clause 10, are specified by values to be met (a sensitivity of 150 mV into 32 ohm for 400 mA/m, a volume range of 40 dB plus or minus 5 dB, a THD of 3 %) that are single comparisons with nothing to compute. The target frequency response of Annex F is stated by two corner frequencies and two final slopes, with its shape only in Figure F.1. The electromagnetic exposure of IEC 62489-2 is outside this library.

Auto-generated from the source docstrings by scripts/generate_api_docs.py (make api-docs). Do not edit by hand.

agc_characteristic(
source_emf_db: ArrayLike,
output_level_db: ArrayLike,
) -> AgcCharacteristic

The output/input characteristic of an amplifier and its AGC range (5.4.13).

From standard measuring conditions the source e.m.f. is reduced to zero and raised in steps, the output current being read at each once it has settled (5.4.13.2), and the result is plotted with the e.m.f. on a logarithmic abscissa and the output current level in dB referred to the rated maximum output current (5.4.13.3). Amendment 1 adds the recommendation of 5.4.13.4: “an input level range of at least 32 dB for a maximum output level change of 3 dB”.

That range is read here as the widest span of input level over which the output varies by at most 3 dB, on the characteristic interpolated linearly between the measured steps, and found exactly: its ends are steps, or the inputs where the line crosses a step’s output level or that level 3 dB up or down. For a characteristic that rises and then holds, which is what an automatic gain control is (Annex A), it runs from the input where the output is 3 dB below its top to the highest input measured.

Parameters

NameDescription
source_emf_dbSource e.m.f. levels, in dB re any fixed voltage, strictly ascending.
output_level_dbOutput current level at each, in dB re the rated maximum output current.

Returns: An AgcCharacteristic.

AgcCharacteristic(
source_emf_db: np.ndarray,
output_level_db: np.ndarray,
agc_range_db: float,
agc_range_start_db: float,
agc_range_end_db: float,
)

The steady-state output/input characteristic of an amplifier (5.4.13).

Attributes

NameDescription
source_emf_dbThe source e.m.f. levels, in dB, ascending.
output_level_dbThe output current level at each, in dB referred to the rated maximum output current (5.4.13.3).
agc_range_dbThe widest span of input level over which the output level changes by no more than 3 dB, in dB: the quantity IEC 62489-1:2010+A1:2014 5.4.13.4 recommends to be at least 32 dB.
agc_range_start_dbThe input level where that span starts, in dB.
agc_range_end_dbThe input level where it ends, in dB.
AgcCharacteristic.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Draw output level against input level, as Figure A.1.

The span of agc_range_db is shaded, with the 3 dB output band it is taken over.

Requires matplotlib (pip install phonometry[plot]); returns the Axes.

Parameters

NameDescription
axExisting axes, or None to create a figure.
languageLabel language, "en" (default) or "es".
kwargsForwarded to the characteristic’s Axes.plot.

property

The range 5.4.13.4 recommends, 32 dB, for comparison with agc_range_db.

amplifier_frequency_response(
frequencies_hz: ArrayLike,
output_current_a: ArrayLike,
) -> AmplifierFrequencyResponse

The frequency response of an amplifier into its rated load (5.4.12).

Under standard measuring conditions, with the automatic gain control and compression disabled or with the input the manufacturer states, the signal frequency is stepped through the one-third-octave centres “over the range of at least 50 Hz to 8 kHz” and the load current measured at each (5.4.12.2). The result is presented with the response at 1 kHz taken as 0 dB (5.4.12.3).

Parameters

NameDescription
frequencies_hzThe measurement frequencies, in hertz, ascending and including 1000 Hz.
output_current_aThe RMS load current at each, in amperes.

Returns: An AmplifierFrequencyResponse.

amplifier_signal_to_noise_ratio(
rated_current_a: float,
noise_current_a: float,
) -> float

The signal-to-noise ratio of an amplifier (IEC 62489-1:2010 5.4.9.2).

the rated output current against the A-weighted output current with the source e.m.f. reduced to zero.

Parameters

NameDescription
rated_current_aThe rated output current , in amperes.
noise_current_aThe noise output current , in amperes.

Returns: The signal-to-noise ratio, in dB.

AmplifierFrequencyResponse(
frequencies_hz: np.ndarray,
output_current_a: np.ndarray,
response_db: np.ndarray,
)

The frequency response of an amplifier into its load (IEC 62489-1:2010 5.4.12).

Attributes

NameDescription
frequencies_hzThe measurement frequencies, in hertz, ascending.
output_current_aThe load current measured at each, in amperes.
response_dbThe current level relative to the one at 1 kHz, in dB, so 0 dB at 1 kHz (5.4.12.3).
AmplifierFrequencyResponse.at(frequency_hz: ArrayLike) -> np.ndarray

The response at any frequency inside the measured range, in dB.

Interpolated linearly against the logarithm of frequency, the way a response measured at one-third-octave centres is read between them.

Parameters

NameDescription
frequency_hzFrequencies, in hertz.

Returns: The response there, dB re 1 kHz.

Raises

ExceptionWhen
ValueErrorfor a frequency that is not finite and positive, or lies outside the measured range.
AmplifierFrequencyResponse.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Draw the response against frequency, 0 dB at 1 kHz (5.4.12.3).

Requires matplotlib (pip install phonometry[plot]); returns the Axes.

Parameters

NameDescription
axExisting axes, or None to create a figure.
languageLabel language, "en" (default) or "es".
kwargsForwarded to the response curve’s Axes.plot.
compliance_voltage(voltage_v: ArrayLike) -> float

The compliance voltage of an amplifier (IEC 62489-1:2010 5.4.8).

The voltage across the rated load is recorded “over a period of at least 60 s” of the specified pink noise with the automatic gain control fully in operation, or with the RMS output current 6 dB below the maximum output current (5.4.8.2 c). The magnitudes of its most positive and most negative peaks are averaged and divided by (5.4.8.2 d), which gives the RMS voltage of the sine with the same peaks.

Parameters

NameDescription
voltage_vThe recorded load voltage, in volts, sampled at more than 50 000 samples per second or through more than 25 kHz of bandwidth (5.4.8.2 c).

Returns: The compliance voltage, in volts.

Raises

ExceptionWhen
ValueErrorfor a record that does not swing both ways.
equivalent_input_noise_voltage(
source_emf_v: float,
output_current_a: float,
noise_current_a: float,
) -> float

The equivalent input noise voltage of an amplifier (IEC 62489-1:2010 5.4.9).

With the amplifier below the action of its automatic gain control, a 1 kHz source e.m.f. gives an output current ; with the e.m.f. reduced to zero the A-weighted output current is . The 1 kHz input that would give the same current as the noise is

Parameters

NameDescription
source_emf_vThe 1 kHz source e.m.f., in volts.
output_current_aThe output current it produces, in amperes.
noise_current_aThe A-weighted output current with no input, in amperes.

Returns: The equivalent input noise voltage, in volts.

loop_centre_field(
current_a: float,
length_m: float,
*,
width_m: float | None = None,
turns: int = 1,
) -> float

The field at the centre of a loop, in its plane (IEC 60118-4:2014 E.1).

with the side of a square loop, or for a rectangle, which E.1 allows “Provided that the sides d1, d2 of a rectangular loop are not extremely different”. For the square it is exact; for a rectangle it is the approximation E.1 prints, and rectangular_loop_field gives the exact value, which is larger by : 0,35 dB at an aspect ratio of 1,5 and 3,3 dB at 4.

Parameters

NameDescription
current_aRMS current in each turn, in amperes.
length_mSide of the square, or one side of the rectangle, in metres.
width_mThe other side of a rectangle, in metres; None for a square.
turnsNumber of turns.

Returns: The field strength at the centre, in A/m.

loop_current(
length_m: float,
width_m: float,
*,
height_m: float = 1.4,
field_strength_a_per_m: float = 0.4,
turns: int = 1,
) -> float

The current a loop needs for a field strength above its centre.

The exact on-axis field of the rectangle (see the module docstring), inverted for the current. The defaults are the conditions of IEC 62489-1:2010 5.4.10.2, 400 mA/m at 1,4 m above the centre of the loop plane, which is also where IEC 60118-4:2014 Figure H.1 plots the current required against the loop’s size and aspect ratio, and the curves of that figure are reproduced: 4,88 A for a 10 m square and 6,41 A for 10 m by 30 m, read as about 4,89 A and 6,41 A.

Parameters

NameDescription
length_mLength of the loop, in metres.
width_mWidth of the loop, in metres.
height_mHeight above the centre of the loop plane, in metres.
field_strength_a_per_mThe field strength to reach, in A/m.
turnsNumber of turns.

Returns: The RMS current in each turn, in amperes.

loop_dimensions(
current_a: float,
*,
aspect_ratio: float = 1.0,
height_m: float = 1.4,
field_strength_a_per_m: float = 0.4,
turns: int = 1,
) -> tuple[float, float]

The largest loop an amplifier’s current drives to a field strength (5.4.11).

IEC 62489-1:2010 5.4.11.1 states “the linear dimensions of a square loop, and a loop of aspect ratio 3:1, for which the magnetic field strength, measured as specified in 5.4.10.1, is 400 mA/m”. Above the centre, the field of a given current first grows with the loop and then falls, so two sizes reach any field below the peak. The characteristic is the larger one: the biggest loop the amplifier can serve, which is the size a specification is read for.

Parameters

NameDescription
current_aThe amplifier’s RMS output current into the loop, in amperes.
aspect_ratioLong side over short side, at least 1 (1 for the square of 5.4.11.1, 3 for its second loop).
height_mHeight above the centre of the loop plane, in metres (1,4 m, 5.4.10.2).
field_strength_a_per_mThe field strength to reach, in A/m (400 mA/m).
turnsNumber of turns.

Returns: (short_side_m, long_side_m), in metres.

Raises

ExceptionWhen
ValueErrorwhen the current cannot reach the field strength at that height with a loop of any size.
loop_impedance(
resistance_ohm: float,
inductance_h: float,
*,
frequencies_hz: ArrayLike | None = None,
) -> LoopImpedance

The impedance of a loop from its resistance and inductance.

Parameters

NameDescription
resistance_ohmSeries resistance, in ohms (loop_resistance, plus that of the feed cable).
inductance_hSeries inductance, in henries (rectangular_loop_inductance, plus that of the feed cable).
frequencies_hzFrequencies to tabulate the magnitude at, in hertz; by default the one-third-octave centres from 50 Hz to 10 kHz.

Returns: A LoopImpedance.

loop_resistance(
perimeter_m: float,
conductor_area_mm2: float,
*,
turns: int = 1,
conductor_temperature_c: float = 20.0,
) -> float

The resistance of a copper loop (IEC 62489-1:2010 B.2).

, with the resistivity of standard annealed copper, 1/58 ohm square millimetre per metre at 20 degrees Celsius, carried to the conductor’s temperature by the coefficient 0,00393 per degree (IEC 60028:1925, clause I). B.2 quotes “approximately 0,017 ohm/m” for 1 mm² at 25 degrees Celsius; Table B.1 is computed at 20 degrees, where its six rounded resistances hold the resistivity between 1,716 and 1,738 times ohm metres, and 1/58 is inside that range.

Parameters

NameDescription
perimeter_mLength of one turn, in metres.
conductor_area_mm2Cross-sectional area of the conductor, in square millimetres.
turnsNumber of turns.
conductor_temperature_cTemperature of the conductor, in degrees Celsius.

Returns: The DC resistance of the loop, in ohms.

LoopField(
current_a: float,
length_m: float,
width_m: float,
turns: int,
x_m: np.ndarray,
y_m: np.ndarray,
z_m: np.ndarray,
h_x_a_per_m: np.ndarray,
h_y_a_per_m: np.ndarray,
h_z_a_per_m: np.ndarray,
)

The magnetic field of a rectangular induction loop at a set of points.

The loop lies in the plane , centred on the origin, with its sides of length length_m along and width_m along , and the current runs counterclockwise seen from , so the field inside the loop points to . For a horizontal loop on the floor is the height and h_z_a_per_m the vertical component a standing listener’s telecoil picks up; for a vertical loop on a counter the same arrays describe it turned on its side.

Attributes

NameDescription
current_aThe RMS current in each turn, in amperes.
length_mLength of the loop along , in metres.
width_mWidth along , in metres.
turnsNumber of turns.
x_mThe points’ coordinates, in metres.
y_mThe points’ coordinates, in metres.
z_mThe points’ coordinates, in metres.
h_x_a_per_mThe component of the RMS field strength, in A/m.
h_y_a_per_mThe component, in A/m.
h_z_a_per_mThe component, in A/m.
LoopField.level_db(component: str = 'z') -> np.ndarray

The field strength level of one component, dB re 400 mA/m.

Parameters

NameDescription
component"x", "y", "z" or "magnitude".

Returns: ; minus infinity where the component vanishes, which is the null line outside a loop.

property

The magnitude of the field strength vector, in A/m.

LoopField.plot(
ax: Axes | None = None,
*,
component: str = 'z',
language: str = 'en',
**kwargs: Any,
) -> Axes

Draw the field strength level along the points, as Figures E.2 and E.3.

The abscissa is the coordinate that varies most among the points, and the ordinate the level of one component in dB re 400 mA/m, with the 0 dB reference and the plus or minus 3 dB band of IEC 60118-4:2014 8.4.3 around it.

Requires matplotlib (pip install phonometry[plot]); returns the Axes.

Parameters

NameDescription
axExisting axes, or None to create a figure.
component"x", "y", "z" or "magnitude".
languageLabel language, "en" (default) or "es".
kwargsForwarded to the level curve’s Axes.plot.
LoopImpedance(
resistance_ohm: float,
inductance_h: float,
frequencies_hz: np.ndarray,
impedance_ohm: np.ndarray,
)

The impedance of a loop, a resistance in series with an inductance.

IEC 62489-1:2010 5.4.3.2 states the rated load “as a series combination of resistance and inductance”, and B.2 represents the loop the same way. The magnitude is times the resistance at the corner frequency , “1,4 times” in IEC 60118-4:2014 E.3, and the voltage an amplifier has to deliver for a current is , the of E.3.

Attributes

NameDescription
resistance_ohmThe series resistance, in ohms.
inductance_hThe series inductance, in henries.
frequencies_hzThe frequencies the magnitude is tabulated at, in hertz.
impedance_ohmThe magnitude of the impedance there, in ohms.
LoopImpedance.at(frequency_hz: ArrayLike) -> np.ndarray

The magnitude of the impedance at any frequency, in ohms.

Parameters

NameDescription
frequency_hzFrequencies, in hertz, positive and finite.

Returns: there, in ohms.

property

The frequency where the reactance equals the resistance, in hertz.

LoopImpedance.drive_voltage(
current_a: float,
frequency_hz: ArrayLike,
) -> np.ndarray

The RMS voltage that drives a current through the loop (IEC 60118-4 E.3).

Parameters

NameDescription
current_aRMS loop current, in amperes.
frequency_hzFrequencies, in hertz, positive and finite.

Returns: , in volts.

LoopImpedance.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Draw the magnitude of the impedance against frequency.

The resistance is drawn as a floor and the corner frequency marked, where the magnitude has risen to times the resistance.

Requires matplotlib (pip install phonometry[plot]); returns the Axes.

Parameters

NameDescription
axExisting axes, or None to create a figure.
languageLabel language, "en" (default) or "es".
kwargsForwarded to the impedance curve’s Axes.plot.
maximum_output_current(
resistor_voltage_v: ArrayLike,
thd_percent: ArrayLike,
*,
load_resistance_ohm: float,
rated_thd_percent: float,
) -> MaximumOutputCurrent

The maximum (distortion-limited) output current of an amplifier (5.4.7).

IEC 62489-1:2010 5.4.7.1 defines it as “The maximum current, produced by a sinusoidal input signal at 1 kHz, deliverable for at least 10 s into the rated load without exceeding the rated total harmonic distortion (THD)”. 5.4.7.2 measures it from standard measuring conditions: the load current is increased until the total harmonic distortion across the resistive part of the load equals the rated value, and “The current is then calculated from the total voltage across the resistive part of the load and the resistance value”. The 10 s the current has to be held for is a condition on the measurement, not a computation.

The steps of the level are given as the total RMS voltage across the resistance and the distortion read there, in ascending order of voltage; the current where the distortion first reaches the rated value is interpolated linearly between the two steps either side of it.

Parameters

NameDescription
resistor_voltage_vThe total RMS voltage across the resistive part of the load at each step, in volts, strictly ascending.
thd_percentThe total harmonic distortion measured across it at each step, in percent, none of it negative.
load_resistance_ohmThe resistance of the resistive part of the rated load, in ohms.
rated_thd_percentThe rated total harmonic distortion (5.4.6), in percent.

Returns: A MaximumOutputCurrent.

Raises

ExceptionWhen
ValueErrorfor a negative distortion, which no measurement gives, or when the distortion never reaches the rated value, or already exceeds it at the first step, so the current lies outside the steps measured.
MaximumOutputCurrent(
resistor_voltage_v: np.ndarray,
load_current_a: np.ndarray,
thd_percent: np.ndarray,
load_resistance_ohm: float,
rated_thd_percent: float,
maximum_current_a: float,
)

The maximum (distortion-limited) output current of an amplifier (5.4.7).

Attributes

NameDescription
resistor_voltage_vThe total RMS voltage across the resistive part of the rated load at each step of the level, in volts.
load_current_aThe load current at each step, that voltage over the resistance, in amperes.
thd_percentThe total harmonic distortion across the resistive part at each step, in percent.
load_resistance_ohmThe resistance of the resistive part of the rated load, in ohms.
rated_thd_percentThe rated total harmonic distortion of 5.4.6, in percent.
maximum_current_aThe load current at which the distortion first reaches the rated value, interpolated linearly between the two steps either side, in amperes: the characteristic of 5.4.7, stated in amperes (5.4.7.3).
MaximumOutputCurrent.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Draw the distortion against the load current, with the rated THD.

Requires matplotlib (pip install phonometry[plot]); returns the Axes.

Parameters

NameDescription
axExisting axes, or None to create a figure.
languageLabel language, "en" (default) or "es".
kwargsForwarded to the distortion curve’s Axes.plot.
neck_loop_characteristics(
frequencies_hz: ArrayLike,
field_strength_level_db: ArrayLike,
impedance_ohm: ArrayLike,
*,
input_voltage_v: float,
) -> NeckLoopCharacteristics

The input voltage, input impedance and frequency response of a neck loop.

The loop is arranged on the non-metallic jig of Annex E and the field measured at the telecoil position with a small inductor, about 3 mm by 10 mm, the size of a behind-the-ear telecoil (9.1.2). The rated input voltage is applied from a source of less than 0,4 ohm (9.3.2).

A passive loop is linear, so the input voltage for 400 mA/m at 1 kHz (9.1) follows from the level measured at any voltage: , with the level at 1 kHz in dB re 400 mA/m. For an active loop that is not linear, measure at the voltage that gives 0 dB, where the scaling does nothing.

Parameters

NameDescription
frequencies_hzThe measurement frequencies, in hertz, ascending and including 1000 Hz.
field_strength_level_dbThe field strength level on the jig at each, in dB re 400 mA/m.
impedance_ohmThe input impedance at each, in ohms; complex values are reduced to their magnitude, and real ones must be positive.
input_voltage_vThe input voltage the field was measured with, in volts.

Returns: A NeckLoopCharacteristics.

Constant (mapping).

NECK_LOOP_TYPES = {1: NeckLoopType(description='for audio sources powered by two primary 1.5 V cells and higher voltage supplies', min_dc_resistance_ohm=30.4, max_dc_resistance_ohm=33.6, max_input_voltage_v=1.06), 2: NeckLoopType(description='neck loop with a transformer or an amplifier', min_dc_resistance_ohm=32.0, max_dc_resistance_ohm=inf, max_input_voltage_v=1.06)}
NeckLoopCharacteristics(
frequencies_hz: np.ndarray,
field_strength_level_db: np.ndarray,
impedance_ohm: np.ndarray,
input_voltage_v: float,
reference_input_voltage_v: float,
minimum_impedance_ohm: float,
response_db: np.ndarray,
frequencies_3db_hz: tuple[float, ...],
)

What IEC 62489-1:2010+A1:2014 clause 9 states for a neck loop.

Attributes

NameDescription
frequencies_hzThe measurement frequencies, in hertz.
field_strength_level_dbThe field strength level on the test jig at each, in dB re 400 mA/m, with input_voltage_v applied.
impedance_ohmThe magnitude of the input impedance at each, in ohms.
input_voltage_vThe input voltage the field was measured with, in volts.
reference_input_voltage_vThe input voltage that produces 400 mA/m at 1 kHz at the telecoil position of the jig, the characteristic of 9.1, in volts.
minimum_impedance_ohmThe smallest magnitude of the input impedance over 100 Hz to 5 kHz, rounded to the nearest ohm (9.2.1).
response_dbThe field strength level relative to the one at 1 kHz, in dB.
frequencies_3db_hzThe frequencies where the response differs from the one at 1 kHz by 3 dB, which 9.3.3 states when the response is given as text.
NeckLoopCharacteristics.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Draw the frequency response on the jig, 0 dB at 1 kHz.

Requires matplotlib (pip install phonometry[plot]); returns the Axes.

Parameters

NameDescription
axExisting axes, or None to create a figure.
languageLabel language, "en" (default) or "es".
kwargsForwarded to the response curve’s Axes.plot.
NeckLoopType(
description: str,
min_dc_resistance_ohm: float,
max_dc_resistance_ohm: float,
max_input_voltage_v: float,
)

One neck-loop type of the draft Annex D (prEN 62489-1:2010/prA2:2017).

Attributes

NameDescription
descriptionWhat the type is, as the draft describes it.
min_dc_resistance_ohmThe smallest DC input resistance, in ohms.
max_dc_resistance_ohmThe largest, in ohms; infinite when the draft sets only a floor.
max_input_voltage_vThe input voltage within which the loop reaches 400 mA/m on the jig of Annex E, in volts.
NeckLoopVerification(
neck_loop_type: int,
dc_resistance_ohm: float,
input_voltage_v: float,
)

A neck loop judged against one type of the draft Annex D (prA2:2017).

Attributes

NameDescription
neck_loop_typeThe type it was judged as, 1 or 2.
dc_resistance_ohmThe measured DC input resistance, in ohms.
input_voltage_vThe input voltage that produces 400 mA/m on the jig, in volts.

The limits of the type (limits) are read from NECK_LOOP_TYPES, so a verification cannot be built against other limits.

property

The NeckLoopType judged against.

property

Whether the loop meets both limits of its type.

NeckLoopVerification.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Draw each measured value as a share of its limit.

Requires matplotlib (pip install phonometry[plot]); returns the Axes.

Parameters

NameDescription
axExisting axes, or None to create a figure.
languageLabel language, "en" (default) or "es".
kwargsForwarded to the bars’ Axes.bar.

property

Whether the DC resistance is inside the type’s range.

property

Whether 400 mA/m is reached within the type’s input voltage.

quadrature_phase_error(
frequencies_hz: ArrayLike,
phase_difference_deg: ArrayLike,
) -> QuadraturePhaseError

The maximum deviation from 90 degrees between two loop currents (5.4.14).

The phase angle between the currents of the two loops, measured across a low-value series resistor in each (5.4.14.3), is judged over 100 Hz to 5 kHz (5.4.14.2). Either loop may lead: an angle is folded into 0 to 180 degrees before its distance from 90 degrees is taken, so -90 and 270 degrees are as much in quadrature as 90.

Parameters

NameDescription
frequencies_hzThe measurement frequencies, in hertz, ascending, at least one of them inside 100 Hz to 5 kHz.
phase_difference_degThe phase angle between the loop currents at each, in degrees.

Returns: A QuadraturePhaseError.

QuadraturePhaseError(
frequencies_hz: np.ndarray,
phase_difference_deg: np.ndarray,
deviation_deg: np.ndarray,
max_deviation_deg: float,
max_deviation_frequency_hz: float,
)

The phase error of a quadrature network for a phased loop array (5.4.14).

Two adjacent loops fed with currents about 90 degrees apart make a field whose direction rotates, instead of one that cancels at the nulls. A deviation from 90 degrees leaves an in-phase component of one field against the other, which raises the level where the two add and lowers it where they subtract, by dB (5.4.14.1: at 85 degrees the in-phase part is ).

Attributes

NameDescription
frequencies_hzThe measurement frequencies, in hertz.
phase_difference_degThe phase angle between the loop currents at each, in degrees.
deviation_degIts absolute deviation from 90 degrees, in degrees.
max_deviation_degThe largest deviation over 100 Hz to 5 kHz, the characteristic of 5.4.14.2, in degrees.
max_deviation_frequency_hzWhere it occurs, in hertz, stated with it (5.4.14.4).

property

Where they subtract, the level falls by this, in dB (a negative number).

, computed as , which is the same number without the cancellation near 90 degrees. At a deviation of 90 degrees, currents in phase or in antiphase, the two fields cancel where they subtract and the fall is minus infinity.

property

Where the in-phase parts add, the level rises by this, in dB.

QuadraturePhaseError.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Draw the deviation from 90 degrees against frequency.

Requires matplotlib (pip install phonometry[plot]); returns the Axes.

Parameters

NameDescription
axExisting axes, or None to create a figure.
languageLabel language, "en" (default) or "es".
kwargsForwarded to the deviation curve’s Axes.plot.
rectangular_loop_field(
current_a: float,
length_m: float,
width_m: float,
x_m: ArrayLike,
y_m: ArrayLike,
z_m: ArrayLike,
*,
turns: int = 1,
) -> LoopField

The magnetic field of a rectangular loop, by Biot and Savart.

Each of the four sides is a straight filament whose field closes exactly (see the module docstring), so the result carries no discretisation. It reproduces the curves of Figure E.2 b) of IEC 60118-4:2014 across the width of that figure’s loop, it is the kind of pattern Figures E.3 to E.5 draw, and at the centre of a square it is the of E.1. The conductor is a filament, so the field is that of a thin wire everywhere except within a few wire radii of it. Metal in the building, which Annex F describes, is not modelled.

Parameters

NameDescription
current_aRMS current in each turn, in amperes.
length_mLength of the loop along , in metres.
width_mWidth along , in metres.
x_m coordinates of the points, in metres, with the loop centred on the origin.
y_m coordinates, broadcast against x_m.
z_m coordinates (height above the loop plane), broadcast against both.
turnsNumber of turns, all carrying the same current.

Returns: A LoopField.

Raises

ExceptionWhen
ValueErrorfor a non-positive dimension, a non-finite coordinate or a point on the conductor, where a filament’s field is infinite.
rectangular_loop_inductance(
length_m: float,
width_m: float,
conductor_area_mm2: float,
*,
turns: int = 1,
internal_inductance: bool = True,
) -> float

The inductance of a rectangular loop of round wire (Grover, Formula (58)).

for sides and and a wire of radius (Grover, Inductance Calculations, 1946, p. 60; the factor 0,004 microhenry per centimetre there is ). The last term is the flux inside the wire, for copper. For turns the single-turn value is multiplied by , the perfect coupling IEC 62489-1:2010 Table B.1 assumes.

Table B.1 is reproduced without the internal term (internal_inductance=False): the counter loop, the home loop, the small room and the typical place of worship come out at 189, 22, 47 and 109 microhenries, as printed. With the term they are about 3 % higher, from 2,7 % for the place of worship to 4,2 % for the counter loop. At audio frequencies the current fills the wire (the skin depth in copper is 2 mm at 1 kHz), which is why the term is included by default.

Parameters

NameDescription
length_mOne side of the rectangle, in metres.
width_mThe other side, in metres.
conductor_area_mm2Cross-sectional area of the round conductor, in square millimetres; the radius is .
turnsNumber of turns.
internal_inductanceInclude the flux inside the wire (the term).

Returns: The inductance, in henries.

Raises

ExceptionWhen
ValueErrorwhen the wire is not thin against the sides, where the formula does not hold.
verify_neck_loop(
dc_resistance_ohm: float,
input_voltage_v: float,
*,
neck_loop_type: int = 1,
) -> NeckLoopVerification

Does a neck loop meet one type of the draft Annex D (prA2:2017)?

The draft Amendment 2 to IEC 62489-1 (prEN 62489-1:2010/prA2:2017, read in E DIN EN 62489-1/A2:2017-10) specifies a type 1 neck loop, for audio sources powered by two primary 1,5 V cells and higher voltage supplies, by a DC resistance of 32 ohm plus or minus 5 % and a type 2 neck loop with a transformer or an amplifier by an input DC resistance of at least 32 ohm, both reaching 400 mA/m on the jig of Annex E with at most 1,06 V at the input (NECK_LOOP_TYPES). It is a draft, cited as one.

Parameters

NameDescription
dc_resistance_ohmThe measured DC input resistance, in ohms.
input_voltage_vThe input voltage that produces 400 mA/m on the jig, in volts (NeckLoopCharacteristics.reference_input_voltage_v).
neck_loop_type1 or 2.

Returns: A NeckLoopVerification.