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.

Sound Power in the 16 kHz Octave (ISO 9295)

Standards: ISO 9295ISO 9613ISO 3741

Some machines are loudest where the general methods stop listening. The paper noise of a fast printer, the whine of a switched-mode power supply and the line tone of a display all sit above 10 kHz, and ISO 3741 and ISO 3744 both end at the 10 kHz one-third-octave band. ISO 9295 adds the octave band centred on 16 kHz, from 11.2 kHz to 22.4 kHz, and determines the unweighted sound power level in its three one-third-octave bands (12.5, 16 and 20 kHz) or in the narrow bands of its discrete tones. At those frequencies the air itself is the main absorber of a reverberation room, and that is what shapes the method: this guide covers the room constant from the measured reverberation time or from the calculated air absorption, the direct level, the comparison with a reference sound source for broadband noise and for tones, the free-field alternative, what Table 3 asks a report to determine for each type of noise, and the misprints of the tables the standard prints for the air absorption. Which route fits which job below 10 kHz is weighed in Sound Power.

The standard specifies four methods (clause 1). Three use the reverberation test room of ISO 3741: the measured reverberation time (clause 6), the calculated air absorption (clause 7) and a reference sound source (clause 8). The fourth is the free field over a reflecting plane of ISO 3744 (clause 9). In the room the microphone rides a rotating boom that describes a circle at least 2 m across, mounted pointing upwards with the normal to its diaphragm parallel to the axis of rotation, so that the sound of the equipment reaches it at grazing incidence (clause 5.4): that orientation is what reduces the direct field enough for the method to treat the reading as reverberant, although clause 6.1 notes that some of it can remain in the 16 kHz octave. The equipment stands on the floor at least 1 m from any wall and 1.8 m from the nearest microphone position, and is measured in four orientations, turned 90° at a time, or on a turntable (clause 5.5).

The level of each band is the energy mean of the four orientations () or of three revolutions of the boom (), Formula (1):

Every determination function below takes the levels either already averaged, one value per band, or as an (N, bands) array that it averages by Formula (1). The chain has to be flat to ±1.0 dB from 11.2 kHz to 22.4 kHz after correction, which in practice asks for a microphone of 13.2 mm diameter or less (clause 5.3), and the room conditions are part of the result: clause 5.2 recommends 15 °C to 30 °C and 40 % to 70 % relative humidity and asks that the product stay within ±10 % during the measurement, because the air absorption changes the room constant band by band.

Qualify the room for ISO 3741 and fit the boom: a circle of 2 m or more, the microphone at the end pointing upwards, a rotation period at least as long as ISO 3741 asks, and a longer one if the drive is noisy or a tone is being read. Place the equipment on the floor, 1 m from every wall and 1.8 m from the path, in its first orientation, and calibrate the whole chain, checking its response across the 16 kHz octave at least every two years. Record the temperature, the relative humidity and the static pressure. For each of the four orientations read the time-averaged level over whole revolutions, in one-third-octave bands for broadband noise and in narrow bands wherever there is a tone, and read the background with the equipment off. Then either measure the reverberation time at three or four points of the path (clause 6), or take the room constant from the air absorption (clause 7), or measure a calibrated reference source at the same place with the same bandwidth (clause 8). The report states the method, the noise type of Table 3, the band levels at the reference meteorological conditions and the frequency of every tone within 10 dB of the highest (clause 13). Clause 5.7 leaves the background correction to ISO 3741, so the band levels are corrected before they reach the functions below: reverberation_background_correction gives the of ISO 3741 for any band, and above 6.3 kHz it applies the 6 dB criterion that covers the whole 16 kHz octave.

A reverberation room turns the mean square pressure into sound power through its absorption. Above 10 kHz that absorption is large enough that the Sabine approximation no longer holds, so the standard writes the room constant in both of its methods with the absorption coefficient of the room, , and not with the Sabine area. The method of clause 6 takes from the measured reverberation time through the Eyring relation, Formulae (4) and (5), with the total surface of the room and its volume:

The method of clause 7 skips the measurement. At 10 kHz and above practically all of the absorption of the room is in the air, whose amplitude attenuation coefficient in nepers per metre gives an absorption area of , and so Formula (7):

comes from the normative Annex A, which is ISO 9613-1 written in nepers per metre and evaluated up to 22.4 kHz, where ISO 9613-1 stops at 10 kHz; the conversion to decibels per metre is the factor 8.686. air_absorption_np_per_m evaluates it with the library’s own ISO 9613-1 implementation, without the advisory that implementation raises above 10 kHz.

import numpy as np
from phonometry import emission
thirds = np.array([12500.0, 16000.0, 20000.0])
# A 200 m3 reverberation room with 210 m2 of surface, at 23 degC and 50 %.
alpha = emission.air_absorption_np_per_m(
thirds, temperature_c=23.0, relative_humidity_percent=50.0)
print(alpha.round(4)) # [0.0245 0.0383 0.0564] Np/m
room_air = emission.room_constant_from_air_absorption(
thirds, volume_m3=200.0, surface_area_m2=210.0,
temperature_c=23.0, relative_humidity_percent=50.0)
print(room_air.round(1)) # [ 48.3 86.6 158.4] m2
# The same room, from the reverberation times measured on the boom path.
times = [0.70, 0.42, 0.26] # s, at 12.5, 16 and 20 kHz
print(emission.room_absorption_coefficient(
times, volume_m3=200.0, surface_area_m2=210.0).round(3)) # [0.196 0.304 0.443]
room_t = emission.room_constant_from_reverberation_time(
times, volume_m3=200.0, surface_area_m2=210.0)
print(room_t.round(1)) # [ 51.1 91.8 167.4] m2

The two constants differ by what the walls absorb on top of the air, 0.25 dB in the level they give. The air term moves much more with the weather: the same room at 20 °C and 40 % has a room constant 1.6 dB larger at 12.5 kHz and 1.5 dB larger at 16 kHz, which is why clause 5.2 holds the product of humidity and temperature steady during a measurement. room_constant_from_air_absorption warns below 10 kHz, where its premise no longer holds, and refuses a room where reaches 1, where the air alone would absorb more than the room surface can.

Two panels. On the left, the air absorption coefficient of ISO 9295 Annex A in nepers per metre from 10 kHz to 22.4 kHz, three curves rising with frequency: 18 degrees and 40 % from 0.024 to 0.076, 23 degrees and 50 % from 0.016 to 0.068, and 27 degrees and 60 % from 0.012 to 0.054, each with the printed cells of its column of Tables 1 and 2 as open markers sitting on the curve, except two green markers above the 27 degree curve, one just above it at 18 kHz and one standing clear of it at 21.5 kHz. On the right, every one of the 624 printed cells as its departure from Annex A with the temperature converted as theta plus 273.16 K, in units of the fourth decimal, against frequency: 581 grey dots on the zero line, and 43 red crosses above it, most of them between 1 and 8 units, three standing out at 30, 40 and 50 units at 14.5, 17 and 21.5 kHzTwo panels. On the left, the air absorption coefficient of ISO 9295 Annex A in nepers per metre from 10 kHz to 22.4 kHz, three curves rising with frequency: 18 degrees and 40 % from 0.024 to 0.076, 23 degrees and 50 % from 0.016 to 0.068, and 27 degrees and 60 % from 0.012 to 0.054, each with the printed cells of its column of Tables 1 and 2 as open markers sitting on the curve, except two green markers above the 27 degree curve, one just above it at 18 kHz and one standing clear of it at 21.5 kHz. On the right, every one of the 624 printed cells as its departure from Annex A with the temperature converted as theta plus 273.16 K, in units of the fourth decimal, against frequency: 581 grey dots on the zero line, and 43 red crosses above it, most of them between 1 and 8 units, three standing out at 30, 40 and 50 units at 14.5, 17 and 21.5 kHz

Annex A against the page. The tables print for 18 °C to 27 °C, 40 % to 60 % and 10 000 Hz to 22 400 Hz, 624 cells to four decimals. The curves on the left are the library’s Annex A, with the temperature converted as K; the right panel measures each cell against Annex A converted as the tables were computed, K, and there 581 of them are Annex A to the last digit. The other 43 are the misprints of the next paragraph: in every one of them a 0 of Annex A is printed as another digit.

Show the code for this figure
import matplotlib.pyplot as plt
import numpy as np
from phonometry import emission
grid = np.linspace(10_000.0, 22_400.0, 250)
fig, ax = plt.subplots(figsize=(7, 5))
for t, rh in ((18.0, 40.0), (23.0, 50.0), (27.0, 60.0)):
alpha = emission.air_absorption_np_per_m(
grid, temperature_c=t, relative_humidity_percent=rh)
ax.plot(grid / 1000.0, alpha, label=f"Annex A, {t:g} degC and {rh:g} %")
ax.set_xlabel("Frequency [kHz]")
ax.set_ylabel("Air absorption alpha [Np/m]")
ax.legend()
plt.show()

Do not read from Tables 1 and 2. Forty-three of their cells are misprinted, and in the same way: a 0 that Annex A gives is printed as another digit, most often the fourth decimal as the third repeated (“0,027 7” where Annex A gives 0,027 0). Three cells whose Annex A value ends in two zeros are printed 10 % high: “0,033 0” for 0,030 0, “0,04 4” for 0,040 0 and “0,05 50” for 0,050 0. The last of them, at 21 500 Hz, 27 °C and 60 %, is the largest error in the tables, 0,005 0 Np/m, and read into Formula (7) any of the three raises the level by at least 0.41 dB. The whole list, cell by cell, is in the errata registry. The 581 correct cells hold a smaller surprise: they reproduce digit for digit only with the temperature converted as K, the triple point of water, where the Celsius scale puts 273.15 K. The library converts with 273.15 K, which moves 61 of them by one unit of the fourth decimal and none by more than 0.000 063 Np/m.

FunctionFormulaReturnsNotes
air_absorption_np_per_m(frequencies_hz, *, temperature_c, relative_humidity_percent, static_pressure_kpa=101.325)Annex A [Np/m]ISO 9613-1 without the 8.686; advisory outside 50 Hz to 22.4 kHz and outside −20 °C to +50 °C
room_absorption_coefficient(reverberation_time_s, *, volume_m3, surface_area_m2)(5)The 0.16 the formula prints
room_constant_from_reverberation_time(reverberation_time_s, *, volume_m3, surface_area_m2)(4), (5) [m²]Clause 6
room_constant_from_air_absorption(frequencies_hz, *, volume_m3, surface_area_m2, temperature_c, relative_humidity_percent, static_pressure_kpa=101.325)(7) [m²]Clause 7; warns below 10 kHz, refuses

With the room constant in hand the level of each band is Formula (6):

Clause 10.1 then carries it to the reference meteorological conditions, 101.325 kPa and 23.0 °C, “de acuerdo con la Norma ISO 3741”: the reference-quantity correction and the radiation-impedance correction of ISO 3741 clause 9.1.4, exactly as ISO 3741 adds them to its own direct method. high_frequency_sound_power does both, from the room constant of either method. The example is a printer measured in the four orientations in the room above.

orientations = np.array([ # dB re 20 uPa, one row per orientation
[58.3, 56.1, 51.2],
[59.0, 56.8, 52.0],
[57.6, 55.7, 50.9],
[58.8, 56.5, 51.6],
])
printer = emission.high_frequency_sound_power(
orientations, frequencies_hz=thirds, room_constant_m2=room_air,
temperature_c=23.0, static_pressure_kpa=101.325)
print(printer.mean_pressure_level.round(2)) # [58.46 56.29 51.44] dB, Formula (1)
print(printer.sound_power_level.round(1)) # [69.1 69.5 67.3] dB re 1 pW
print(round(printer.c1, 3), round(printer.c2, 4)) # -0.127 0.0033
printer.plot() # LW per band with the mean room level (needs matplotlib)

At 23 °C and 101.325 kPa is next to nothing, but is not: it is the that refers the characteristic impedance of the air to the one the dB of the diffuse-field relation assumes, and it takes 0.13 dB off every band. Measured through the reverberation time instead, the same readings give 69.4, 69.8 and 67.5 dB.

ParameterTypeUnitsRange / defaultNotes
pressure_levels_db1D or 2D arraydB(bands,) or (N, bands), or the orientations or revolutions averaged by Formula (1)
frequencies_hz1D arrayHzone per bandA frequency outside 11.2 kHz to 22.4 kHz emits a SoundPowerWarning
room_constant_m2float or 1D arraym²positiveFrom either room-constant function
temperature_cfloat°Cdefault 23.0For and (clause 10.1)
static_pressure_kpafloatkPadefault 101.325For and
tonalbooldefault FalseThe bands are the narrow bands of tones

The result, a HighFrequencySoundPowerResult, carries the band levels (sound_power_level), the mean room level (mean_pressure_level), the room constant, the two corrections (c1, c2) and the method, and within_10_db_of_maximum marks the bands within 10 dB of the highest.

The method of clause 8 needs no room constant. A reference sound source calibrated to ISO 6926 is measured at the place of the equipment with the same bandwidth, and the room cancels between the two, Formula (8):

For discrete tones the analysis is narrow-band, and a moving microphone complicates it: its motion spreads a tone over sidebands by the Doppler shift, over a width that Formula (2) gives from the speed of the microphone and the speed of sound ,

An analyser at least that wide holds the whole tone in one band; a narrower FFT does not, and the sidebands that carry the tone are summed on an energy basis, Formula (3). The reference source for tones is calibrated as a power spectral density, per hertz, so Formula (9) adds the noise bandwidth of the analyser, at most 112 Hz for an FFT and taken as 1 Hz for a constant-percentage analyser:

The example is a power supply with a tone at 15 625 Hz and two more at 17 000 Hz and 20 500 Hz, read with a 12.5 Hz FFT on a boom of 1 m radius turning once every 32 s.

speed = 2.0 * np.pi * 1.0 / 32.0 # m/s along the path
print(emission.minimum_analyzer_bandwidth_hz(
15625.0, microphone_speed_m_s=speed, speed_of_sound=345.5).round(1)) # [17.8] Hz
# The FFT is narrower than that, so the tone is the sum of its sidebands.
tone = emission.tone_level_from_sidebands([42.9, 41.3, 38.0])
print(round(tone, 1)) # 45.9 dB
tones = emission.high_frequency_sound_power_comparison(
[tone, 38.5, 31.0], frequencies_hz=[15625.0, 17000.0, 20500.0],
reference_pressure_levels_db=[41.8, 41.2, 40.1],
reference_sound_power_levels_db=[44.3, 43.9, 43.0], # dB re 1 pW per hertz
noise_bandwidth_hz=12.5)
print(tones.sound_power_level.round(1)) # [59.4 52.2 44.9] dB re 1 pW
print(tones.within_10_db_of_maximum) # [ True True False]

Clause 13 c) asks for the level and the frequency of every tone within 10 dB of the highest, and within_10_db_of_maximum marks them: here the first two. A bandwidth wider than 112 Hz emits a SoundPowerWarning, and without noise_bandwidth_hz the same function applies Formula (8) to broadband bands. The comparison applies alone, as ISO 3741 does for its own comparison method.

Two panels. On the left, the printer of the example: one bar of sound power level per one-third-octave band of the 16 kHz octave, 69.1 dB at 12.5 kHz, 69.5 dB at 16 kHz and 67.3 dB at 20 kHz, with an orange dot in each bar for the mean room level of 58.5, 56.3 and 51.4 dB. On the right, the power supply of the tonal example: three stems on a frequency axis in kilohertz, 59.4 dB at 15.625 kHz and 52.2 dB at 17 kHz in blue, and 44.9 dB at 20.5 kHz in grey, each with a short orange mark for its mean room level, and a red dashed line at 49.4 dB, 10 dB below the highest tone, that only the first two stems crossTwo panels. On the left, the printer of the example: one bar of sound power level per one-third-octave band of the 16 kHz octave, 69.1 dB at 12.5 kHz, 69.5 dB at 16 kHz and 67.3 dB at 20 kHz, with an orange dot in each bar for the mean room level of 58.5, 56.3 and 51.4 dB. On the right, the power supply of the tonal example: three stems on a frequency axis in kilohertz, 59.4 dB at 15.625 kHz and 52.2 dB at 17 kHz in blue, and 44.9 dB at 20.5 kHz in grey, each with a short orange mark for its mean room level, and a red dashed line at 49.4 dB, 10 dB below the highest tone, that only the first two stems cross

On the left, the printer of section 3: the gap between each bar and its dot is the room term of Formula (6), , which grows from 10.8 dB at 12.5 kHz to 16.0 dB at 20 kHz because the air absorbs more at the top of the octave and the room constant grows with it, less the 0.12 dB that take off. On the right, the tones above: the one at 20.5 kHz lies more than 10 dB below the highest and falls outside what clause 13 c) asks to be reported.

Show the code for this figure
import matplotlib.pyplot as plt
# printer and tones are the results computed in this guide.
fig, (left, right) = plt.subplots(1, 2, figsize=(12.5, 5.6))
printer.plot(ax=left)
tones.plot(ax=right)
plt.show()

The fourth method is ISO 3744 in a hemi-anechoic room, with the three one-third-octave bands of the 16 kHz octave, and sound_power_pressure takes it as it stands (without frequencies, since the A-weighting table of ISO 3744 stops at 10 kHz). What ISO 9295 adds is Formula (10): beyond a measurement radius of 2 m the air absorbs enough over the path that the surface level takes the correction , with in decibels per metre (clause 9.8). The surface level and the sound power level differ by a constant, so adding to the band levels is the same thing.

levels = np.array([[50.0, 48.0, 44.0]] * 10) + np.linspace(-1.0, 1.0, 10)[:, None]
hemisphere = emission.sound_power_pressure(levels, "hemisphere", radius=2.5)
k = emission.free_field_absorption_correction(
thirds, radius_m=2.5, temperature_c=23.0, relative_humidity_percent=50.0)
print(k.round(2)) # [0.53 0.83 1.23] dB
print((hemisphere.sound_power_level + k).round(1)) # [66.5 64.8 61.2] dB

At 2 m or less the clause asks for no correction and the function returns zero.

6. What to determine for each type of noise

Section titled “6. What to determine for each type of noise”

Table 3 of the standard decides what a determination gives, from the noise the equipment makes in the octave bands from 125 Hz to 8 kHz and in the 16 kHz octave. With broadband or narrow-band noise below 8 kHz, the A-weighted sound power level of ISO 3741 or ISO 3744 is always part of it, and the 16 kHz octave adds its one-third-octave band levels for broadband noise, the level and the frequency of a discrete tone, or the levels and the frequencies of every tone within 10 dB of the highest. With no significant noise below 8 kHz, footnote b notes that the noise lies outside the scope of ISO 3741 and ISO 3744, so only this standard applies and only the tone or the tones of the 16 kHz octave are asked for. high_frequency_levels_to_determine reads the table: a power supply like the one of section 4, with three tones above 8 kHz and a fan that fills the bands below with broadband noise, falls on the multiple-tone row.

print(emission.high_frequency_levels_to_determine(
noise_125_hz_to_8_khz="broadband", noise_16_khz_octave="multiple_tones"))
# ('a_weighted_sound_power_level', 'tone_levels_within_10_db')
print(emission.high_frequency_levels_to_determine(
noise_125_hz_to_8_khz="none", noise_16_khz_octave="discrete_tone"))
# ('tone_level_and_frequency',)

The table has no row for equipment with no significant noise anywhere, or with broadband noise in the 16 kHz octave and none below it, and the function refuses those two combinations with a ValueError rather than guess what the standard would ask.

  • Covered

    The ISO 9295:2015 determination of the sound power level in the 16 kHz octave band: the energy mean over orientations or revolutions (Formula (1)), the analyser bandwidth under a moving microphone and the sideband sum (Formulae (2) and (3)), the room constant from the measured reverberation time through the Eyring relation (Formulae (4) and (5)) or from the air absorption of Annex A (Formula (7), air_absorption_np_per_m, pinned to the 581 correctly printed cells of Tables 1 and 2), the direct level of Formula (6), the comparison with a reference sound source for broadband noise and for tones (Formulae (8) and (9)), the free-field correction of Formula (10), the reference meteorological conditions of clause 10.1 through the and of ISO 3741, the 10 dB reporting range of clause 13 c), and the levels Table 3 asks to determine for each type of noise (high_frequency_levels_to_determine).

  • Not covered

    The room, the boom and the instruments are assumed qualified: the ISO 3741 qualification of the room, the flatness of the chain and the ISO 6926 calibration of the reference source are checks the laboratory makes, and the % stability of is not monitored. The background correction is ISO 3741’s, applied to the levels before they are passed (reverberation_background_correction). The free-field method is ISO 3744 as the library implements it, plus Formula (10). The uncertainty of clause 11 is a statement, , with standard deviations of reproducibility of 3 dB or less in the 16 kHz octave.