Ir al contenido

materials.diffusers.scattering_diffusion

La referencia de la API se publica en inglés en los dos idiomas: se genera a partir de los docstrings del código, que son su texto original.

Directional and random-incidence diffusion coefficients in a free field.

ISO 17497-2:2012. From the set of reflected sound-pressure levels L_i on a semicircle or hemisphere the autocorrelation diffusion coefficient d_theta is formed for equal-area receivers (Clause 8.1, Formula (5)) or with per-receiver area weights N_i (Formula (6)); the area weights follow from the solid-angle factors of Clause 8.3 (Formula (8)). Finite-panel effects are removed by normalising to the reference flat surface (Clause 8.2, Formula (7)), and the random-incidence coefficient is the (weighted) average of the directional coefficients over the source positions (Clause 8.4).

One subject: the free-field polar response of a surface and the single number Clause 8 distils from it, band by band. Part 1 of ISO 17497 is a different measurement, made in a reverberation room, and lives in phonometry.materials.diffusers.reverberation_room_scattering; the two parts share no formula, and the helpers are named per part so they are never mixed. Neither part contains a numeric worked example.

The Part 2 diffusion coefficient is the design target of subwavelength diffuser panels such as the metadiffusers of Jiménez, Cox, Romero-García & Groby (2017, Scientific Reports 7, 5389, doi:10.1038/s41598-017-05710-5), whose slow-sound resonant slots reach the diffusion of a Schroeder or quadratic-residue diffuser in a fraction of the depth.

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

area_factors(
elevations: ArrayLike,
*,
delta_theta: float,
delta_phi: float | None = None,
) -> Real

Per-receiver area weights N_i (ISO 17497-2, Clause 8.3, Formula (8)).

For a hemispherical measurement the solid-angle area sampled by a receiver at elevation theta (with angular spacings delta_theta, delta_phi) is:

and (Formula (8)), with A_min the smallest A_i. All angles are handled internally in radians; the form in particular requires delta_phi in radians to be dimensionally consistent with the factor.

Parameters

NameDescription
elevationsReceiver elevation angles theta from the reference normal, in degrees (1-D), over the measurement domain (Figure 7). Formula (8) assumes a single receiver at (the zenith); duplicate zenith entries would each take the full zenith area.
delta_thetaElevation spacing between adjacent receivers, in degrees (typically 5).
delta_phiAzimuth spacing between adjacent receivers, in degrees; defaults to delta_theta. Required (implicitly) for the receiver.

Returns: Per-receiver area weights N_i (dimensionless, min value 1).

Raises

ExceptionWhen
ValueErrorfor a non-1-D input or non-positive spacings.
diffusion_spectrum(
frequencies: ArrayLike,
diffusion: ArrayLike,
*,
normalized: ArrayLike | None = None,
) -> DiffusionSpectrum

Diffusion-coefficient spectrum d(f) (ISO 17497-2, Clause 8.5).

Pairs the per-band diffusion coefficients d with their band centres and returns a plottable, reportable DiffusionSpectrum. The coefficient is the directional coefficient d_theta (Formula (5)/(6)) when it comes from a single source position, or the random-incidence coefficient d when it is the per-band average of the directional coefficients over the source positions (Clause 8.4, e.g. via random_incidence_diffusion band by band). The optional normalised coefficients d_n (Formula (7)) are carried through when supplied.

Parameters

NameDescription
frequenciesOne-third-octave band centres, in hertz (1-D).
diffusionDiffusion coefficient d per band.
normalizedOptional normalised diffusion coefficient d_n per band; None when the reference flat surface was not measured.

Returns: A DiffusionSpectrum with .plot() and .report().

Raises

ExceptionWhen
ValueErrorif the inputs differ in length, are empty or not 1-D.
DiffusionResult(angles: Real, levels: Real, coefficient: float)

A measured polar response and its diffusion coefficient (ISO 17497-2).

Attributes

NameDescription
anglesReceiver angles of the polar response, in degrees.
levelsReflected sound-pressure level at each angle, in decibels.
coefficientAutocorrelation diffusion coefficient d (Formula (5)).
DiffusionResult.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot the polar response with the diffusion coefficient annotated.

Requires matplotlib (pip install phonometry[plot]); returns the polar Axes and never calls plt.show.

DiffusionResult.report(
path: str,
*,
metadata: ReportMetadata | None = None,
engine: str = 'reportlab',
verbose: bool = False,
language: str = 'en',
) -> str

Render an ISO 17497-2 polar-response test-report fiche to a PDF.

Writes a one-page accredited free-field diffusion report for a single source position (ISO 17497-2:2012, Clause 8.5): the standard-basis line, an optional metadata header block, a two-panel body with the corrected polar-response table (receiver angle and reflected sound-pressure level L, rounded to 0,1 dB) beside the semicircular polar plot, a boxed directional diffusion coefficient d_theta (Formula (5)/(6)) and a footer with the fixed disclaimer. ISO 17497-2 is a characterisation, so there is no pass/fail verdict.

Parameters

NameDescription
pathDestination path of the PDF file.
metadataOptional ReportMetadata; None produces a body-and-disclaimer fiche. The applicable descriptive fields are client, manufacturer, specimen, mounting, test_room, test_date, temperature, relative_humidity, pressure, measurement_standard, laboratory, operator, report_id and notes. The requirement field is ignored (ISO 17497-2 has no verdict).
engineRendering back end; only "reportlab" is supported.
verboseAccepted for signature parity; the polar-response fiche has no extended table, so it renders the same body.
languageFiche language: "en" (default, English, decimal point) or "es" (Spanish, decimal comma).

Returns: The written path as a str.

Raises

ExceptionWhen
ValueErrorIf engine is not "reportlab".
ImportErrorIf reportlab is not installed (pip install phonometry[report]), or matplotlib is missing for the embedded figure (pip install phonometry[plot]).
DiffusionSpectrum(
frequencies: Real,
diffusion: Real,
normalized: Real | None = None,
)

A diffusion-coefficient spectrum d(f) (ISO 17497-2, Clause 8.5).

Where DiffusionResult holds the polar response of a single one-third-octave band, this holds the diffusion coefficient across the measured bands, so it can be tabulated and plotted against frequency as Clause 8.5 requires. The per-band coefficient is a directional diffusion coefficient d_theta (Formula (5)/(6)) when it comes from one source position, or a random-incidence diffusion coefficient d when it is the per-band average of the directional coefficients over the source positions (Clause 8.4); the standard defines both as frequency-dependent quantities, so this carries a spectrum rather than a single number.

Attributes

NameDescription
frequenciesOne-third-octave band centre frequencies, in hertz.
diffusionDiffusion coefficient d per band (directional per source, or random-incidence when averaged over source positions).
normalizedOptional normalised diffusion coefficient d_n per band (Formula (7)), or None when the reference flat surface was not measured.
DiffusionSpectrum.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot the diffusion coefficient d versus frequency.

Requires matplotlib (pip install phonometry[plot]); returns the Axes and never calls plt.show.

DiffusionSpectrum.report(
path: str,
*,
metadata: ReportMetadata | None = None,
engine: str = 'reportlab',
verbose: bool = False,
language: str = 'en',
) -> str

Render an ISO 17497-2 diffusion-coefficient test-report fiche to a PDF.

Writes a one-page accredited free-field diffusion report (ISO 17497-2:2012, Clause 8.5): the standard-basis line, an optional metadata header block, a two-panel body with the per-band table (frequency, the diffusion coefficient d and, when present, the normalised d_n) beside the d(f) curve on a categorical band axis, a boxed characterisation headline over the tested frequency range, and a footer with the fixed disclaimer. ISO 17497-2 is a characterisation, so there is no pass/fail verdict.

Parameters

NameDescription
pathDestination path of the PDF file.
metadataOptional ReportMetadata; None produces a body-and-disclaimer fiche whose header shows only the measured frequency range. The applicable descriptive fields are client, manufacturer, specimen, mounting, test_room, test_date, temperature, relative_humidity, pressure, measurement_standard, laboratory, operator, report_id and notes. The requirement field is ignored (ISO 17497-2 has no verdict).
engineRendering back end; only "reportlab" is supported.
verboseWhen True and a normalised spectrum is present, the value table adds the normalised d_n column.
languageFiche language: "en" (default, English, decimal point) or "es" (Spanish, decimal comma).

Returns: The written path as a str.

Raises

ExceptionWhen
ValueErrorIf engine is not "reportlab".
ImportErrorIf reportlab is not installed (pip install phonometry[report]), or matplotlib is missing for the embedded figure (pip install phonometry[plot]).
directional_diffusion(
angles: ArrayLike,
levels: ArrayLike,
*,
weights: ArrayLike | None = None,
) -> DiffusionResult

Diffusion coefficient of a polar response (ISO 17497-2, Formula (5)/(6)).

Convenience wrapper over directional_diffusion_coefficient that keeps the receiver angles alongside the levels and returns a plottable DiffusionResult.

Parameters

NameDescription
anglesReceiver angles of the polar response, in degrees (1-D).
levelsReflected sound-pressure level at each angle, in decibels.
weightsOptional area weights N_i (Formula (8)); None uses the equal-area Formula (5).

Returns: A DiffusionResult with .plot().

Raises

ExceptionWhen
ValueErrorif angles and levels differ in length or are shorter than two receivers.
directional_diffusion_coefficient(
levels: ArrayLike,
*,
area_weights: ArrayLike | None = None,
) -> float

Directional diffusion coefficient d_theta (ISO 17497-2, Formulas (5)/(6)).

For a fixed source position and one-third-octave band, from the n reflected sound-pressure levels L_i (dB). With equal-area receivers (area_weights is None, Formula (5)):

where . When each receiver samples a different area (Formula (6)) the per-receiver weights N_i (from area_factors) enter:

which reduces to Formula (5) for uniform weights. The coefficient is 0 when only one receiver has non-zero scattered energy and 1 when all receivers are equal.

Parameters

NameDescription
levelsThe reflected sound-pressure levels L_i, in decibels (a level of -inf denotes a receiver with zero energy).
area_weightsOptional per-receiver area weights N_i (Formula (8)); None selects the equal-area Formula (5).

Returns: Directional diffusion coefficient d_theta (a scalar).

Raises

ExceptionWhen
ValueErrorfor fewer than two receivers, a non-1-D input, a length mismatch, or non-positive total weight.
normalized_diffusion_coefficient(
d_theta: ArrayLike,
d_theta_reference: ArrayLike,
) -> Real

Normalised directional diffusion coefficient (ISO 17497-2, Formula (7)).

, removing the finite-panel diffusion of the reference flat surface d_theta_r (same projected footprint as the test surface). It maps to 0 and to 1.

Parameters

NameDescription
d_thetaDirectional diffusion coefficient of the test surface.
d_theta_referenceDirectional diffusion coefficient of the reference flat surface d_theta_r.

Returns: Normalised directional diffusion coefficient d_theta_n.

Raises

ExceptionWhen
ValueErrorif any reference coefficient equals 1 (undefined ratio).
plot_goniometer_geometry(
ax: Axes | None = None,
*,
source_distance: float = 10.0,
receiver_radius: float = 5.0,
angular_step: float = 5.0,
sample_width: float = 0.6,
language: str = 'en',
**kwargs: Any,
) -> Axes

Draw the free-field diffusion goniometer in plan, to scale.

Receiver semicircle at its radius with one microphone per angular step, the source on the normal at its distance and the sample at the centre; defaults are the standard 10 m source, 5 m receiver arc and 5-degree resolution (37 microphones).

Parameters

NameDescription
axExisting axes, or None to create a figure.
source_distanceSource distance from the sample, in metres.
receiver_radiusReceiver-arc radius, in metres.
angular_stepAngular spacing of the receivers, in degrees.
sample_widthDrawn sample width, in metres.
languageLabel language, "en" (default) or "es".
kwargsForwarded to the receiver scatter.

Returns: The axes.

random_incidence_diffusion(
directional_coefficients: ArrayLike,
*,
weights: ArrayLike | None = None,
) -> float

Random-incidence diffusion coefficient d (ISO 17497-2, Clause 8.4).

The (normalised or non-normalised) directional coefficients are averaged over the source positions. Hemispherical measurements use equal weightings (weights is None); two-dimensional (single-plane) measurements use the source weighting of Clause 8.4 - weight 1 for the 0 deg source and weight 3 for each of the four +/-30 deg, +/-60 deg sources (see TWO_DIMENSIONAL_SOURCE_WEIGHTS).

Parameters

NameDescription
directional_coefficientsDirectional diffusion coefficients d_theta (or d_theta_n), one per source position (1-D).
weightsOptional source-position weights; None averages with equal weight.

Returns: Random-incidence diffusion coefficient d (a scalar).

Raises

ExceptionWhen
ValueErrorfor an empty or non-1-D input, a length mismatch, or non-positive total weight.

Constant (tuple).

TWO_DIMENSIONAL_SOURCE_WEIGHTS = (1, 3, 3, 3, 3)