room.reverberation_prediction
Reverberation-time prediction from room geometry and absorption.
Predicts the reverberation time T of an enclosed space from its volume,
boundary areas and the sound-absorption coefficients of its surfaces, through
the classical statistical-acoustics formulae. Given a diffuse field and an
exponential energy decay, T is the time for the level to fall by 60 dB.
Five models are provided, in order of increasing account of a non-uniform absorption distribution:
- Sabine — the original diffuse-field estimate,
T = k V / (A + 4 m V)with the total equivalent absorption areaA = sum_i S_i alpha_iand the air term4 m V. Exact only for low, uniform absorption. - Eyring (Norris-Eyring) — replaces
Aby-S ln(1 - alpha_bar)with the mean absorptionalpha_bar = A / Sover the total surfaceS; correct in the strong-absorption limit where Sabine overestimatesT. - Millington-Sette —
-sum_i S_i ln(1 - alpha_i)sums the Eyring term per surface, so a single perfectly absorbing surface drivesTto zero. - Fitzroy — an area-weighted arithmetic mean of three axial Eyring reverberation times, one per pair of opposing walls; captures rooms with the absorption concentrated on one axis (e.g. a carpeted, otherwise hard room).
- Arau-Puchades — an area-weighted geometric mean of the same three axial
Eyring times (Arau-Puchades, Acustica 65 (1988) 163):
T = prod_i T_i ** (S_i / S). Recommended by its author over Fitzroy for anisotropic rooms.
The Sabine constant is k = 24 ln 10 / c0 (= 55.26 / c0); with the
default c0 = 343 m/s it takes the familiar textbook value 0.161. (The
enclosed_space_absorption EN 12354-6 model instead rounds
k to 55.3 and uses c0 = 345.6 to pin the factor at exactly 0.16.)
Air absorption enters every model through the air_attenuation power
coefficient m (in neper per metre) as the additive term 4 m V; obtain a
physical m from temperature and humidity with
phonometry.air_absorption.air_attenuation_m.
Each model enforces its own mathematical domain on the absorption
coefficients. Sabine’s linear sum is finite for any non-negative coefficient,
so it accepts measured ISO 354 values at or above 1 (up to a unit-error guard
at 2). The logarithmic models are stricter exactly where the maths requires
it: Millington-Sette needs every coefficient below 1, while Eyring, Fitzroy
and Arau-Puchades need each mean entering ln(1 - alpha) below 1.
The Fitzroy and Arau-Puchades models require a rectangular (shoebox) room and
take the room dimensions together with the mean absorption of each of the
three wall pairs. All five reduce to Eyring for a uniform absorption
distribution, and Eyring reduces to Sabine as the absorption tends to zero —
the identities the conformance suite anchors on, absent a machine-readable
worked example in the source texts.
Auto-generated from the source docstrings by
scripts/generate_api_docs.py(make api-docs). Do not edit by hand.
arau_puchades_reverberation_time
Section titled “arau_puchades_reverberation_time”arau_puchades_reverberation_time( dimensions: Sequence[float], absorptions: Sequence[ArrayLike], *, air_attenuation: ArrayLike = 0.0, speed_of_sound: float = 343.0,) -> np.ndarray | floatArau-Puchades reverberation time — area-weighted geometric mean of axial times.
T = prod_i T_i ** (S_i / S) with T_i the Eyring time of the wall
pair perpendicular to axis i (Arau-Puchades, Acustica 65 (1988) 163,
Formula 18). Preferred by its author over Fitzroy for rooms with an
anisotropic absorption distribution. Reduces to Eyring for a uniform
distribution. Each input is itself a mean entering ln(1 - alpha_i),
so each must be below 1.
Parameters
| Name | Description |
|---|---|
dimensions | Room lengths (Lx, Ly, Lz), m. |
absorptions | Mean absorption (alpha_x, alpha_y, alpha_z) of the three wall pairs (perpendicular to x, y, z); each a scalar or per-band array. |
air_attenuation | Air power-attenuation coefficient m (1/m). |
speed_of_sound | Speed of sound c0, m/s. |
Returns: The reverberation time T, s.
eyring_reverberation_time
Section titled “eyring_reverberation_time”eyring_reverberation_time( volume: float, surfaces: Sequence[Surface], *, air_attenuation: ArrayLike = 0.0, speed_of_sound: float = 343.0,) -> np.ndarray | floatEyring (Norris-Eyring) reverberation time.
T = k V / (-S ln(1 - alpha_bar) + 4 m V) with the total surface S
and its area-weighted mean absorption alpha_bar.
The formula constrains only the mean: ln(1 - alpha_bar) requires
alpha_bar < 1, while individual coefficients at or above 1 (a measured
ISO 354 outcome) are accepted as long as the mean stays below 1 and each
coefficient stays within the shared unit-error ceiling of 2.
Parameters
| Name | Description |
|---|---|
volume | Room volume V, m3. |
surfaces | Sequence of (area, absorption_coefficient) pairs. |
air_attenuation | Air power-attenuation coefficient m (1/m). |
speed_of_sound | Speed of sound c0, m/s. |
Returns: The reverberation time T, s.
fitzroy_reverberation_time
Section titled “fitzroy_reverberation_time”fitzroy_reverberation_time( dimensions: Sequence[float], absorptions: Sequence[ArrayLike], *, air_attenuation: ArrayLike = 0.0, speed_of_sound: float = 343.0,) -> np.ndarray | floatFitzroy reverberation time — area-weighted arithmetic mean of axial times.
T = sum_i (S_i / S) T_i with T_i the Eyring time of the wall pair
perpendicular to axis i (Fitzroy, J. Acoust. Soc. Am. 31 (1959) 893).
Equivalent to T = k V / S**2 * sum_i S_i / (-ln(1 - alpha_i)) without
air. Reduces to Eyring for a uniform absorption distribution. Each input
is itself a mean entering ln(1 - alpha_i), so each must be below 1.
Parameters
| Name | Description |
|---|---|
dimensions | Room lengths (Lx, Ly, Lz), m. |
absorptions | Mean absorption (alpha_x, alpha_y, alpha_z) of the three wall pairs (perpendicular to x, y, z); each a scalar or per-band array. |
air_attenuation | Air power-attenuation coefficient m (1/m). |
speed_of_sound | Speed of sound c0, m/s. |
Returns: The reverberation time T, s.
mean_absorption
Section titled “mean_absorption”mean_absorption(surfaces: Sequence[Surface]) -> np.ndarray | floatArea-weighted mean absorption coefficient alpha_bar = A / S.
Parameters
| Name | Description |
|---|---|
surfaces | Sequence of (area, absorption_coefficient) pairs; each coefficient a scalar or a per-band array. |
Returns: The mean absorption sum_i S_i alpha_i / sum_i S_i; a float for scalar coefficients, otherwise a per-band array.
millington_sette_reverberation_time
Section titled “millington_sette_reverberation_time”millington_sette_reverberation_time( volume: float, surfaces: Sequence[Surface], *, air_attenuation: ArrayLike = 0.0, speed_of_sound: float = 343.0,) -> np.ndarray | floatMillington-Sette reverberation time.
T = k V / (-sum_i S_i ln(1 - alpha_i) + 4 m V): the Eyring absorption
term summed surface by surface rather than through a single mean. A surface
approaching total absorption (alpha_i -> 1) drives T to zero.
Because the logarithm applies per surface, every coefficient must be
strictly below 1; measured ISO 354 coefficients at or above 1 are outside
this model’s domain (use Sabine, or Eyring while the mean stays below 1).
Parameters
| Name | Description |
|---|---|
volume | Room volume V, m3. |
surfaces | Sequence of (area, absorption_coefficient) pairs. |
air_attenuation | Air power-attenuation coefficient m (1/m). |
speed_of_sound | Speed of sound c0, m/s. |
Returns: The reverberation time T, s.
reverberation_time_models
Section titled “reverberation_time_models”reverberation_time_models( dimensions: Sequence[float], absorptions: Sequence[ArrayLike], *, air_attenuation: ArrayLike = 0.0, frequencies: ArrayLike | None = None, speed_of_sound: float = 343.0,) -> ReverberationModelResultPredict the reverberation time of a rectangular room by all five models.
A convenience front-end that builds the six boundary surfaces of the room
from dimensions and the three wall-pair mean absorptions, then evaluates
sabine_reverberation_time, eyring_reverberation_time,
millington_sette_reverberation_time, fitzroy_reverberation_time
and arau_puchades_reverberation_time on a common footing. Because
the bundle evaluates the logarithmic models too, the inputs must satisfy
the strictest of the five domains: every absorption below 1.
Parameters
| Name | Description |
|---|---|
dimensions | Room lengths (Lx, Ly, Lz), m. |
absorptions | Mean absorption (alpha_x, alpha_y, alpha_z) of the three wall pairs (perpendicular to x, y, z); each a scalar or a per-band array aligned with frequencies. |
air_attenuation | Air power-attenuation coefficient m (1/m), scalar or per-band. |
frequencies | Band centre frequencies, in hertz, used only to label the result and its plot; defaults to an integer index over the bands. |
speed_of_sound | Speed of sound c0, m/s. |
Returns: The ReverberationModelResult.
ReverberationModelResult
Section titled “ReverberationModelResult”ReverberationModelResult( frequencies: np.ndarray, sabine: np.ndarray, eyring: np.ndarray, millington_sette: np.ndarray, fitzroy: np.ndarray, arau_puchades: np.ndarray, volume: float, surface_area: float,)Predicted reverberation time of a rectangular room by five models.
Attributes
| Name | Description |
|---|---|
frequencies | Band centre frequencies, in hertz. |
sabine | Sabine reverberation time per band, s. |
eyring | Eyring (Norris-Eyring) reverberation time per band, s. |
millington_sette | Millington-Sette reverberation time per band, s. |
fitzroy | Fitzroy reverberation time per band, s. |
arau_puchades | Arau-Puchades reverberation time per band, s. |
volume | Room volume V, m3. |
surface_area | Total boundary area S, m2. |
ReverberationModelResult.models
Section titled “ReverberationModelResult.models”property
The five reverberation-time curves keyed by model name.
ReverberationModelResult.plot()
Section titled “ReverberationModelResult.plot()”ReverberationModelResult.plot( ax: Axes | None = None, *, language: str = 'en', **kwargs: Any,) -> AxesPlot the reverberation-time curves of the five models.
Requires matplotlib (pip install phonometry[plot]); returns the
Axes.
ReverberationModelResult.report()
Section titled “ReverberationModelResult.report()”ReverberationModelResult.report( path: str, *, metadata: ReportMetadata | None = None, engine: str = 'reportlab', verbose: bool = False, language: str = 'en',) -> strRender a reverberation-time prediction fiche to a PDF.
Writes a one-page report of the reverberation time predicted by the
five statistical-acoustics models (Sabine, Eyring, Millington-Sette,
Fitzroy and Arau-Puchades): a standard-basis line marking it a
design-stage prediction, an optional metadata header block (client,
room, description, room volume, total surface area, climate …), a
per-band table with one reverberation-time column per model beside the
result’s own model-comparison plot (plot), the boxed
mid-frequency reverberation time from Arau-Puchades (the recommended
model for a non-uniform absorption distribution) with the per-model
spread alongside, and a footer with the fixed disclaimer. This is a
prediction, not a measurement: the five models bracket the
reverberation time likely to occur. A supplied
metadata.requirement is printed as a target reverberation-time
reference line without a PASS/FAIL verdict, since a room reverberation
time is a target range rather than a strictly higher/lower-is-better
quantity.
Parameters
| Name | Description |
|---|---|
path | Destination path of the PDF file. |
metadata | Optional ReportMetadata; None produces a bare prediction fiche (body, result and disclaimer only). |
engine | Rendering back end; only "reportlab" is supported. |
verbose | Accepted for parity with the other fiches; the model table already shows every computed value, so it has no effect. |
language | Fiche language: "en" (default, English) or "es" (Spanish, with a comma decimal separator). |
Returns: The written path as a str.
Raises
| Exception | When |
|---|---|
| ValueError | If engine is not "reportlab". |
| ImportError | If reportlab is not installed (pip install phonometry[report]). |
sabine_reverberation_time
Section titled “sabine_reverberation_time”sabine_reverberation_time( volume: float, surfaces: Sequence[Surface], *, air_attenuation: ArrayLike = 0.0, speed_of_sound: float = 343.0,) -> np.ndarray | floatSabine reverberation time T = k V / (A + 4 m V).
A = sum_i S_i alpha_i is finite for any non-negative coefficient, so
unlike the logarithmic models Sabine accepts coefficients at or above 1:
measured ISO 354 reverberation-room values of 1.05 to 1.20 (the edge
effect) and the exact 1.0 that the ISO 11654 practical rating caps at are
legitimate inputs. Coefficients above 2 are rejected as a probable unit
error (a percentage passed instead of a fraction).
Parameters
| Name | Description |
|---|---|
volume | Room volume V, m3. |
surfaces | Sequence of (area, absorption_coefficient) pairs; each coefficient a scalar or a per-band array in [0, 2]. |
air_attenuation | Air power-attenuation coefficient m, in neper per metre (scalar or per-band); see phonometry.air_absorption.air_attenuation_m. Default 0 (air absorption neglected). |
speed_of_sound | Speed of sound c0, m/s (default DEFAULT_SPEED_OF_SOUND, giving the factor 0.161). |
Returns: The reverberation time T, s; a float for scalar inputs, otherwise a per-band array.