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
Nsimultaneous 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
Section titled “absorption_per_table”absorption_per_table( distance: ArrayLike, speech_to_noise: float, *, directivity: float = 2.0,) -> np.ndarray | floatAbsorption 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
| Name | Description |
|---|---|
distance | Separation r, m: the cross-table distance rs for the communication bound, the table-to-table distance rt for the privacy bound. |
speech_to_noise | Target speech-to-noise ratio L_SN, dB. |
directivity | Talker directivity factor Q. |
Returns: The equivalent absorption area per table A_tab, m2.
COMMUNICATION_SNR
Section titled “COMMUNICATION_SNR”Constant (float).
COMMUNICATION_SNR = -6.0crowd_noise
Section titled “crowd_noise”crowd_noise( absorption_areas: ArrayLike, *, talkers: ArrayLike | None = None, distance: float = 1.2, sound_power_level: float = 70.0, directivity: float = 2.0,) -> CrowdNoiseResultSelf-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
| Name | Description |
|---|---|
absorption_areas | Total equivalent absorption areas A of the room to compare, m2 (scalar or 1-D). |
talkers | Occupancy axis N, the number of simultaneous talkers; default the integers 1..20. |
distance | Talker-to-listener distance r, m (default 1.2 m, Long’s cross-table distance). |
sound_power_level | Sound power level Lw of one talker, dB re 1 pW (default NORMAL_VOICE_POWER_LEVEL). |
directivity | Talker directivity factor Q (default TALKER_DIRECTIVITY). |
Returns: A CrowdNoiseResult.
crowd_noise_level
Section titled “crowd_noise_level”crowd_noise_level( talkers: ArrayLike, absorption_area: ArrayLike, *, sound_power_level: float = 70.0,) -> np.ndarray | floatReverberant 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
| Name | Description |
|---|---|
talkers | Number N of simultaneous talkers (scalar or array, at least 1). |
absorption_area | Total equivalent absorption area A of the room, metric sabins (m2) (scalar or array). |
sound_power_level | Sound power level Lw of one talker, dB re 1 pW (default NORMAL_VOICE_POWER_LEVEL). |
Returns: The self-generated reverberant level, dB.
CrowdNoiseResult
Section titled “CrowdNoiseResult”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
| Name | Description |
|---|---|
talkers | Number of simultaneous talkers on the occupancy axis. |
absorption_areas | Total room absorption areas compared, m2, one per row of levels. |
levels | Reverberant self-noise level, dB, shaped (len(absorption_areas), len(talkers)). |
signal_level | Direct-field level of the talker across the table, dB. |
distance | Talker-to-listener distance r, m. |
sound_power_level | Sound power level of one talker, dB re 1 pW. |
directivity | Talker directivity factor Q. |
communication_level | Noise level at which the speech-to-noise ratio falls to COMMUNICATION_SNR, dB: above it, cross-table conversation stops working. |
CrowdNoiseResult.plot()
Section titled “CrowdNoiseResult.plot()”CrowdNoiseResult.plot( ax: Axes | None = None, *, language: str = 'en', **kwargs: Any,) -> AxesPlot 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()
Section titled “CrowdNoiseResult.speech_to_noise()”CrowdNoiseResult.speech_to_noise() -> np.ndarraySpeech-to-noise ratio for every point of levels, dB.
NORMAL_VOICE_POWER_LEVEL
Section titled “NORMAL_VOICE_POWER_LEVEL”Constant (float).
NORMAL_VOICE_POWER_LEVEL = 70.0PRIVACY_SNR
Section titled “PRIVACY_SNR”Constant (float).
PRIVACY_SNR = -9.0speech_direct_level
Section titled “speech_direct_level”speech_direct_level( distance: ArrayLike, *, sound_power_level: float = 70.0, directivity: float = 2.0,) -> np.ndarray | floatDirect-field level of one talker (Long Equation (17.50)).
, the signal a listener across the table receives.
Parameters
| Name | Description |
|---|---|
distance | Talker-to-listener distance r, m (scalar or array). |
sound_power_level | Talker sound power level Lw, dB re 1 pW (default NORMAL_VOICE_POWER_LEVEL). |
directivity | Talker directivity factor Q (default TALKER_DIRECTIVITY). |
Returns: The direct-field sound pressure level, dB.
speech_to_noise_ratio
Section titled “speech_to_noise_ratio”speech_to_noise_ratio( distance: ArrayLike, absorption_per_table: ArrayLike, *, directivity: float = 2.0,) -> np.ndarray | floatSpeech-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
| Name | Description |
|---|---|
distance | Talker-to-listener distance r, m. |
absorption_per_table | Equivalent absorption area per occupied table A_tab, m2. |
directivity | Talker directivity factor Q. |
Returns: The speech-to-noise ratio, dB.
TALKER_DIRECTIVITY
Section titled “TALKER_DIRECTIVITY”Constant (float).
TALKER_DIRECTIVITY = 2.0