Skip to content

room.crowd_noise

Crowd self-noise in a restaurant: the cocktail-party equilibrium.

In a room where the only source of noise is the occupants themselves, the background against which each conversation has to be understood is generated by the other conversations. Long (Architectural Acoustics 2nd ed., Chapter 17, Equations (17.50) to (17.54)) writes the two competing levels at a listener:

  • the signal, the direct field of the person across the table (Equation (17.50)), ;

  • the noise, the reverberant field built up by N simultaneous talkers spread over the room (Equation (17.51)), ;

where Lw is the sound power level of one talker (about 70 dB for normal conversation), Q the talker’s directivity factor (about 2 in the forward direction), r the talker-to-listener distance and A_tab the equivalent absorption area per occupied table, so that is the room’s total absorption. Their difference is the speech-to-noise ratio (Equation (17.52)):

which is independent of the talker’s power and of the number of talkers: adding a table adds both a talker and its share of absorption. What decides whether a restaurant works is therefore the absorption per table, not its total absorption. Requiring dB for adequate cross-table communication at a separation rs, and dB for privacy between tables a distance rt apart, turns into a pair of design bounds (Equations (17.53) and (17.54)):

The Lombard reflex (talkers raising their voices as the background grows) is deliberately not modelled: it cancels out of L_SN as long as everyone raises their voice equally, and Long uses the model in exactly that way, as the explanation of why the level spirals upward in a hard room rather than as a predictor of the final level.

This is a design model for the self-generated noise of an occupied room. The measurement standard for the spatial decay of speech in an open-plan office is ISO 3382-3, implemented separately in phonometry.room.open_plan: that one derives D2,S, the distraction distance and the privacy distance from measured levels along a line of workstations, and predicts nothing.

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

absorption_per_table(
distance: ArrayLike,
speech_to_noise: float,
*,
directivity: float = 2.0,
) -> np.ndarray | float

Absorption per table giving a chosen L_SN (inverse of (17.52)).

. With dB this is Long’s communication bound (Equation (17.53)), with -9 dB his privacy bound (Equation (17.54)).

Parameters

NameDescription
distanceSeparation r, m: the cross-table distance rs for the communication bound, the table-to-table distance rt for the privacy bound.
speech_to_noiseTarget speech-to-noise ratio L_SN, dB.
directivityTalker directivity factor Q.

Returns: The equivalent absorption area per table A_tab, m2.

Constant (float).

COMMUNICATION_SNR = -6.0
crowd_noise(
absorption_areas: ArrayLike,
*,
talkers: ArrayLike | None = None,
distance: float = 1.2,
sound_power_level: float = 70.0,
directivity: float = 2.0,
) -> CrowdNoiseResult

Self-noise of an occupied room versus occupancy (Long 17.50-17.52).

Evaluates Equation (17.51) over an occupancy axis for each of the supplied total absorption areas, together with the direct-field signal of Equation (17.50) at the listener across the table.

Parameters

NameDescription
absorption_areasTotal equivalent absorption areas A of the room to compare, m2 (scalar or 1-D).
talkersOccupancy axis N, the number of simultaneous talkers; default the integers 1..20.
distanceTalker-to-listener distance r, m (default 1.2 m, Long’s cross-table distance).
sound_power_levelSound power level Lw of one talker, dB re 1 pW (default NORMAL_VOICE_POWER_LEVEL).
directivityTalker directivity factor Q (default TALKER_DIRECTIVITY).

Returns: A CrowdNoiseResult.

crowd_noise_level(
talkers: ArrayLike,
absorption_area: ArrayLike,
*,
sound_power_level: float = 70.0,
) -> np.ndarray | float

Reverberant level of N simultaneous talkers (Long Equation (17.51)).

with the room’s total equivalent absorption area A ( when the absorption is counted per occupied table).

Parameters

NameDescription
talkersNumber N of simultaneous talkers (scalar or array, at least 1).
absorption_areaTotal equivalent absorption area A of the room, metric sabins (m2) (scalar or array).
sound_power_levelSound power level Lw of one talker, dB re 1 pW (default NORMAL_VOICE_POWER_LEVEL).

Returns: The self-generated reverberant level, dB.

CrowdNoiseResult(
talkers: np.ndarray,
absorption_areas: np.ndarray,
levels: np.ndarray,
signal_level: float,
distance: float,
sound_power_level: float,
directivity: float,
communication_level: float,
)

Self-generated noise of an occupied room versus occupancy and absorption.

Attributes

NameDescription
talkersNumber of simultaneous talkers on the occupancy axis.
absorption_areasTotal room absorption areas compared, m2, one per row of levels.
levelsReverberant self-noise level, dB, shaped (len(absorption_areas), len(talkers)).
signal_levelDirect-field level of the talker across the table, dB.
distanceTalker-to-listener distance r, m.
sound_power_levelSound power level of one talker, dB re 1 pW.
directivityTalker directivity factor Q.
communication_levelNoise level at which the speech-to-noise ratio falls to COMMUNICATION_SNR, dB: above it, cross-table conversation stops working.
CrowdNoiseResult.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot the self-noise level against occupancy, one curve per absorption.

The direct-field level of the talker across the table and the speech-to-noise limit of Equation (17.53) are drawn as references, so the crossing point reads directly as the occupancy at which the room stops working. Requires matplotlib (pip install phonometry[plot]).

CrowdNoiseResult.speech_to_noise() -> np.ndarray

Speech-to-noise ratio for every point of levels, dB.

Constant (float).

NORMAL_VOICE_POWER_LEVEL = 70.0

Constant (float).

PRIVACY_SNR = -9.0
speech_direct_level(
distance: ArrayLike,
*,
sound_power_level: float = 70.0,
directivity: float = 2.0,
) -> np.ndarray | float

Direct-field level of one talker (Long Equation (17.50)).

, the signal a listener across the table receives.

Parameters

NameDescription
distanceTalker-to-listener distance r, m (scalar or array).
sound_power_levelTalker sound power level Lw, dB re 1 pW (default NORMAL_VOICE_POWER_LEVEL).
directivityTalker directivity factor Q (default TALKER_DIRECTIVITY).

Returns: The direct-field sound pressure level, dB.

speech_to_noise_ratio(
distance: ArrayLike,
absorption_per_table: ArrayLike,
*,
directivity: float = 2.0,
) -> np.ndarray | float

Speech-to-noise ratio across a table (Long Equation (17.52)).

, the difference between Equations (17.50) and (17.51). Neither the talker’s power nor the number of talkers appears: a busier room brings its own absorption with it.

Parameters

NameDescription
distanceTalker-to-listener distance r, m.
absorption_per_tableEquivalent absorption area per occupied table A_tab, m2.
directivityTalker directivity factor Q.

Returns: The speech-to-noise ratio, dB.

Constant (float).

TALKER_DIRECTIVITY = 2.0