Skip to content

materials.absorbers.porous

Porous-material models and resonant sheet impedances.

Two complementary building blocks, all in the time convention with the forward wave carried by (so a passive medium has ):

  • Equivalent-fluid models for the characteristic impedance Zc and the complex wavenumber k of a rigid-frame porous material:

    • the one-parameter Delany-Bazley power law in the absorber variable (Mechel, Formulas of Acoustics 2e, Sect. G.11 Eqs. (1)-(2); Bies, Hansen & Howard, Engineering Noise Control 5e, Appendix D Eqs. (D.22)-(D.23) and Table D.1; Hopkins, Sound Insulation, Eqs. (1.171)-(1.174)), stated valid for and porosity close to one. Table D.1 also provides coefficient sets fitted to polyester (Garai & Pompoli 2005) and to foams (Dunn & Davern 1986, Wu 1988), exposed here as presets.
    • the Miki modification, regressed on the same Delany-Bazley data under a positive-real (passivity) constraint so the model stays well behaved below the fit range (Miki 1990, J. Acoust. Soc. Jpn (E) 11(1), Eqs. (30)-(34), in the variable ).
    • the five-parameter Johnson-Champoux-Allard (JCA) semi-phenomenological model with flow resistivity, porosity, tortuosity and the viscous/thermal characteristic lengths (Cox & D’Antonio, Acoustic Absorbers and Diffusers 3e, Eqs. (6.19)-(6.25); Attenborough & Van Renterghem, Predicting Outdoor Sound 2e, Eqs. (5.13)-(5.14)). The returned equivalent-fluid density and bulk modulus are the surface-normalised quantities (they absorb the porosity), so and hold for every model.
    • the limp-frame correction of any of the three rigid-frame models (Allard & Atalla, Propagation of Sound in Porous Media 2e, Sect. 11.3.4, Eqs. (11.53)-(11.55), printed pp. 251-253): a light frame is dragged along by the pore fluid, so its inertia has to be carried by the equivalent fluid. Only the effective density changes; the bulk modulus is the rigid-frame one. See limp_frame and decoupling_frequency.
  • Resonant sheets: the perforated-plate impedance uses the end-corrected air-plug mass and the visco-thermal surface resistance (Cox & D’Antonio Eqs. (7.6)/(7.12)/(7.21), end-correction variants of Table 7.1); the microperforated plate follows Maa’s exact short-tube impedance (Maa 1998, J. Acoust. Soc. Am. 104(5), Eq. (2), with the Eq. (5) end corrections; reproduced as Cox & D’Antonio Eqs. (7.33)-(7.35) and built on the same Bessel kernel as Mechel Sect. G.3); the membrane is the limp surface mass (Cox & D’Antonio Eq. (7.14); Bies Eq. (D.96)). Each sheet is closed by the shallow-cavity resonance it is designed around, helmholtz_resonance_frequency for a perforate and membrane_resonance_frequency for a membrane.

The air all of them propagate through is described by AirProperties, which carries the six quantities a visco-thermal model can need (speed of sound, density, viscosity, Prandtl number, ratio of specific heats and static pressure) with the values these models were published with. The narrow-channel models of slow_sound and metadiffuser take it as a single argument.

These are the elements a multilayer absorber is assembled from; declaring a stack of them and solving it with the transfer matrix is the subject of layered.

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

AirProperties(
speed_of_sound: float = 343.0,
density: float = 1.205,
viscosity: float = 1.84e-05,
prandtl_number: float = 0.71,
heat_capacity_ratio: float = 1.4,
atmospheric_pressure: float = 101325.0,
)

State of the air the visco-thermal models propagate through.

The six quantities a narrow-channel model needs: the speed of sound c0 in m/s, the density in kg/m3, the dynamic viscosity in Pa s, the Prandtl number Pr, the ratio of specific heats and the static pressure in Pa (the adiabatic bulk modulus is ). The defaults are dry air at 20 degC, the values the models were published with.

Every field is validated on construction, so an impossible air state is rejected once, where it is written, rather than at each model that reads it.

Raises

ExceptionWhen
ValueErrorIf any quantity is not positive and finite.
decoupling_frequency(
flow_resistivity: float,
*,
porosity: float,
frame_density: float,
) -> float

Zwikker-Kosten decoupling frequency Fd of a porous frame.

(Allard & Atalla 2e, Sect. 11.3.4, printed p. 251; the same closed form as their Eq. (6.90), printed p. 126). Above Fd the visco-inertial coupling between the pore fluid and the frame is too weak for the acoustic wave to shake the frame, so the rigid-frame equivalent fluid of johnson_champoux_allard applies; below it the frame moves and the limp correction of limp_frame matters.

Parameters

NameDescription
flow_resistivityAirflow resistivity sigma, in Pa s/m2 (> 0).
porosityOpen porosity phi (0 < phi <= 1).
frame_densityBulk density of the frame rho1, in kg/m3 (> 0): the mass of solid per unit volume of material, i.e. the density of the sample as weighed, not the density of the material the fibres are made of.

Returns: The decoupling frequency Fd, in hertz.

Raises

ExceptionWhen
ValueErrorfor a non-positive input or a porosity above 1.

Constant (phonometry.materials.absorbers.porous.AirProperties).

delany_bazley(
frequency: ArrayLike,
flow_resistivity: float,
*,
coefficients: str | tuple[float, ...] = 'delany_bazley',
speed_of_sound: float = 343.0,
air_density: float = 1.205,
) -> PorousMediumResult

Delany-Bazley one-parameter porous model (power laws in X).

and with (Mechel 2e Sect. G.11 Eqs. (1)-(2); Bies 5e Eqs. (D.22)-(D.23) with the Table D.1 coefficients; Hopkins Eqs. (1.171)-(1.173)). A PorousAbsorberWarning is raised when any X leaves the stated validity range (Hopkins Eq. (1.174)); the values are still returned.

Parameters

NameDescription
frequencyFrequency vector f, in hertz.
flow_resistivityAirflow resistivity sigma, in Pa s/m2.
coefficientsPreset name from DELANY_BAZLEY_COEFFICIENTS ("delany_bazley" rockwool/fibreglass default, "garai_pompoli" polyester, "dunn_davern" / "wu" foams) or an explicit (C1..C8) tuple.
speed_of_soundSpeed of sound c in air, in m/s.
air_densityAir density rho, in kg/m3.

Returns: A PorousMediumResult.

Constant (dict).

DELANY_BAZLEY_COEFFICIENTS = {'delany_bazley': (0.0571, 0.754, 0.087, 0.732, 0.0978, 0.7, 0.189, 0.595), 'garai_pompoli': (0.078, 0.623, 0.074, 0.66, 0.159, 0.571, 0.121, 0.53), 'dunn_davern': (0.114, 0.369, 0.0985, 0.758, 0.168, 0.715, 0.136, 0.491), 'wu': (0.212, 0.455, 0.105, 0.607, 0.163, 0.592, 0.188, 0.544)}

Constant (tuple).

DELANY_BAZLEY_VALIDITY = (0.01, 1.0)
helmholtz_resonance_frequency(
*,
cavity_depth: float,
plate_thickness: float,
hole_radius: float,
open_area: float,
end_correction: float | None = None,
speed_of_sound: float = 343.0,
) -> float

Resonance of a perforated sheet over a shallow cavity (closed form).

with the end-corrected plug length (Cox & D’Antonio 3e, Eqs. (7.4)/(7.6), valid for ).

Parameters

NameDescription
cavity_depthCavity depth d, in metres.
plate_thicknessPlate thickness t, in metres.
hole_radiusHole radius a, in metres.
open_areaFractional open area eps (0..1).
end_correctionEnd-correction factor delta per end; default perforation_end_correction of eps.
speed_of_soundSpeed of sound c in air, in m/s.

Returns: Resonance frequency f0, in hertz.

johnson_champoux_allard(
frequency: ArrayLike,
flow_resistivity: float,
*,
porosity: float,
tortuosity: float,
viscous_length: float,
thermal_length: float,
speed_of_sound: float = 343.0,
air_density: float = 1.205,
viscosity: float = 1.84e-05,
prandtl_number: float = 0.71,
heat_capacity_ratio: float = 1.4,
atmospheric_pressure: float = 101325.0,
) -> PorousMediumResult

Johnson-Champoux-Allard five-parameter rigid-frame model.

Effective density (Cox & D’Antonio 3e, Eq. (6.19)):

and effective bulk modulus (Eq. (6.20)):

with tortuosity T, porosity phi, viscous/thermal characteristic lengths L / L'; then and (Eqs. (6.24)-(6.25)). Both quantities are surface-normalised (the factors are included). The model has the exact limits as and as (Johnson et al. 1987), pinned in the tests.

Parameters

NameDescription
frequencyFrequency vector f, in hertz.
flow_resistivityAirflow resistivity sigma, in Pa s/m2.
porosityOpen porosity phi (0 < phi <= 1).
tortuosityHigh-frequency tortuosity (>= 1).
viscous_lengthViscous characteristic length L, in metres.
thermal_lengthThermal characteristic length L', in metres (physically ).
speed_of_soundSpeed of sound c in air, in m/s.
air_densityAir density rho, in kg/m3.
viscosityDynamic viscosity eta of air, in Pa s.
prandtl_numberPrandtl number Pr of air.
heat_capacity_ratioRatio of specific heats gamma.
atmospheric_pressureStatic pressure P0, in Pa.

Returns: A PorousMediumResult.

limp_frame(
medium: PorousMediumResult,
frame_density: float,
*,
porosity: float = 1.0,
) -> PorousMediumResult

Limp-frame correction of a rigid-frame equivalent fluid (A&A 11.3.4).

A light frame (aeronautic-grade fibreglass, felts, screens) is dragged along by the pore fluid instead of standing still, and the rigid-frame models of delany_bazley, miki and johnson_champoux_allard have no way to carry that inertia. Neglecting the stiffness of the frame altogether in the Biot mixed pressure-displacement formulation leaves an equivalent fluid with the same bulk modulus and a corrected effective density (Allard & Atalla 2e, Eqs. (11.53)-(11.55), printed pp. 252-253, after Panneton 2007):

with rho_eq the rigid-frame effective density of medium, rho0 the density of the pore fluid and the apparent total density of the material. What anchors this expression is the printed equation itself, transcribed term by term; Allard & Atalla tabulate no computed limp density anywhere, so there are no published digits to check against. The book also states two exact limits in prose, and both are verified, but they are weaker than they look: neither pins the and terms, since a sign-flipped variant of Eq. (11.55) satisfies both of them (and even the decay of the heavy-frame residual). They corroborate the transcription rather than determine it:

  • heavy frame: as the correction vanishes and the rigid-frame result is recovered (the book’s own reading of Eq. (11.55));
  • low frequency: since as (Eq. (5.37)), , a finite real density, where the rigid-frame model diverges. The rigid frame forbids rigid-body motion of the sample; the limp one allows it, which is why the two differ mainly at low frequency and why the limp model is the right one for an unconstrained sample in an impedance tube.

The corrected medium is a drop-in PorousMediumResult, so it can be handed to PorousLayer inside layered_absorber exactly like the rigid-frame one.

Use decoupling_frequency to see where the frame stops following the fluid and limp_frame_applicable for the published bulk-modulus rule of thumb on when the frame may be treated as limp at all.

Parameters

NameDescription
mediumA rigid-frame PorousMediumResult (its effective_density is rho_eq and its bulk_modulus is kept).
frame_densityBulk density of the frame rho1, in kg/m3 (> 0).
porosityOpen porosity phi (0 < phi <= 1, Default: 1,0, the high-porosity assumption of the one-parameter models).

Returns: A PorousMediumResult with model "limp_frame(<base model>)".

Raises

ExceptionWhen
ValueErrorfor a non-positive input or a porosity above 1.
limp_frame_applicable(
frame_bulk_modulus: float,
*,
criterion: str = 'doutres',
fluid_bulk_modulus: float = 101325.0,
) -> bool

Whether the limp-frame model may be used, by published rule of thumb.

Both published criteria compare the bulk modulus of the frame in vacuum K_c with that of the fluid in the pores K_f (Allard & Atalla 2e, printed pp. 253-254): Beranek (1947) requires , and the frame structural interaction study of Doutres et al. (2007) relaxes it to . With K_f taken as the isothermal bulk modulus of air, kPa, the relaxed criterion is the book’s statement that “the limp model is applicable for materials having a bulk modulus lower than 20 kPa”. Neither criterion accounts for boundary or mounting conditions, and the book notes that a thin light foam decoupled from a vibrating structure by an air gap behaves limply well above the limit.

Parameters

NameDescription
frame_bulk_modulusBulk modulus of the frame in vacuum K_c, in Pa (>= 0; pass abs(K_c) for a complex modulus).
criterionKey into LIMP_FRAME_CRITERIA, "doutres" (Default, 0,2) or "beranek" (0,05).
fluid_bulk_modulusBulk modulus of the pore fluid K_f, in Pa (Default: 101 325, the isothermal value for air).

Returns: True when does not exceed the threshold.

Raises

ExceptionWhen
ValueErrorfor a negative modulus or an unknown criterion.

Constant (dict).

LIMP_FRAME_CRITERIA = {'beranek': 0.05, 'doutres': 0.2}
membrane_impedance(
frequency: ArrayLike,
*,
surface_density: float,
resistance: float = 0.0,
) -> Complex

Transfer impedance of a limp impervious membrane.

- the surface-mass reactance (Cox & D’Antonio 3e, Eq. (7.14); Bies 5e Eq. (D.96)) plus an optional empirical resistance for the internal/fixing losses.

Parameters

NameDescription
frequencyFrequency vector f, in hertz.
surface_densityMass per unit area m, in kg/m2.
resistanceSeries flow resistance r, in Pa s/m (default 0).

Returns: Complex transfer impedance z, in Pa s/m.

membrane_resonance_frequency(
*,
surface_density: float,
cavity_depth: float,
isothermal: bool = False,
speed_of_sound: float = 343.0,
air_density: float = 1.205,
) -> float

Mass-spring resonance of a membrane over a shallow cavity.

for an adiabatic air spring - numerically the classical (Cox & D’Antonio 3e, Eq. (7.9)). With isothermal=True the spring stiffness drops by gamma, giving (Eq. (7.10)), the porous-filled cavity case below about 500 Hz.

Parameters

NameDescription
surface_densityMembrane mass per unit area m, in kg/m2.
cavity_depthCavity depth d, in metres.
isothermalUse the isothermal air-spring stiffness.
speed_of_soundSpeed of sound c in air, in m/s.
air_densityAir density rho, in kg/m3.

Returns: Resonance frequency f0, in hertz.

microperforated_plate_impedance(
frequency: ArrayLike,
*,
thickness: float,
hole_radius: float,
open_area: float,
end_correction: float = 0.85,
air_density: float = 1.205,
viscosity: float = 1.84e-05,
) -> Complex

Transfer impedance of a microperforated plate (Maa’s exact model).

The specific impedance of one submillimetre hole is the exact short-tube result (Maa 1998, Eq. (2); reproduced as Cox & D’Antonio 3e Eq. (7.33) and the same Bessel kernel as Mechel 2e Sect. G.3):

with the perforate constant . Dividing by the open area and adding Maa’s Eq. (5) end corrections - the Rayleigh/Ingard surface resistance and the piston end-correction reactance ( total for the default per end) - gives the sheet transfer impedance (Cox & D’Antonio Eq. (7.35)).

Parameters

NameDescription
frequencyFrequency vector f, in hertz.
thicknessPlate thickness t, in metres.
hole_radiusHole radius a, in metres (submillimetre for a genuine microperforated design).
open_areaFractional open area eps (0..1).
end_correctionEnd-correction factor delta per end (default 0.85, the isolated-orifice value used by Maa).
air_densityAir density rho, in kg/m3.
viscosityDynamic viscosity eta of air, in Pa s.

Returns: Complex transfer impedance z, in Pa s/m.

miki(
frequency: ArrayLike,
flow_resistivity: float,
*,
speed_of_sound: float = 343.0,
air_density: float = 1.205,
) -> PorousMediumResult

Miki (1990) positive-real modification of the Delany-Bazley model.

In the variable (Miki 1990, Eqs. (30)-(34)): and, from the propagation constant via , . The regression was constrained to be positive real, so the surface impedance of a hard-backed layer keeps a non-negative real part even below the Delany-Bazley range; a PorousAbsorberWarning still flags Y outside the fit range (paper Sect. 4.1).

Parameters

NameDescription
frequencyFrequency vector f, in hertz.
flow_resistivityAirflow resistivity sigma, in Pa s/m2.
speed_of_soundSpeed of sound c in air, in m/s.
air_densityAir density rho, in kg/m3.

Returns: A PorousMediumResult.

Constant (tuple).

MIKI_VALIDITY = (0.01, 1.0)
perforated_plate_impedance(
frequency: ArrayLike,
*,
thickness: float,
hole_radius: float,
open_area: float,
end_correction: float | None = None,
air_density: float = 1.205,
viscosity: float = 1.84e-05,
) -> Complex

Transfer impedance of a rigid perforated plate with circular holes.

Acoustic mass with both end corrections and the boundary-layer term (Cox & D’Antonio 3e, Eq. (7.6)):

and visco-thermal surface resistance (Eq. (7.12)):

giving (the series impedance added on top of the backing, Eq. (7.21)). Assumes hole radii well above the boundary-layer thickness; use microperforated_plate_impedance for submillimetre holes.

Parameters

NameDescription
frequencyFrequency vector f, in hertz.
thicknessPlate thickness t, in metres.
hole_radiusHole radius a, in metres.
open_areaFractional open area eps (0..1).
end_correctionEnd-correction factor delta per end; default perforation_end_correction of eps.
air_densityAir density rho, in kg/m3.
viscosityDynamic viscosity eta of air, in Pa s.

Returns: Complex transfer impedance z, in Pa s/m.

perforation_end_correction(open_area: float) -> float

End-correction factor delta of a circular perforation.

The Fok-function interaction correction for circular holes (Cox & D’Antonio 3e, Table 7.1, Nesterov row; no open-area limit):

Each orifice end adds of air-plug length, and for an isolated hole.

Parameters

NameDescription
open_areaFractional open area eps of the sheet (0..1).

Returns: End-correction factor delta (dimensionless, per end).

plot_absorber_stack(
layers: Sequence[Layer] | Layer,
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Draw a layered-absorber cross-section to scale, rigid backing at right.

Sound arrives from the left; each layer is drawn with its material fill and its thickness dimensioned below the stack. A membrane (no physical depth) is drawn as a thin sheet.

Parameters

NameDescription
layersThe layer sequence of layered_absorber, front layer first, or a single layer.
axExisting axes, or None to create a figure.
languageLabel language, "en" (default) or "es".
kwargsForwarded to the front-layer rectangle.

Returns: The axes.

Advisory for porous-model use outside the published fit range.

PorousMediumResult(
frequency: Real,
characteristic_impedance: Complex,
wavenumber: Complex,
effective_density: Complex,
bulk_modulus: Complex,
model: str,
flow_resistivity: float,
speed_of_sound: float,
air_density: float,
)

Equivalent-fluid characterisation of a porous material.

All arrays share the shape of frequency. characteristic_impedance is the complex characteristic impedance Zc in Pa s/m as seen from the material surface, wavenumber the complex wavenumber k in rad/m ( for the convention), effective_density and bulk_modulus the surface-normalised equivalent-fluid density and bulk modulus, so that and for every model.

property

Characteristic impedance normalised by of air.

property

Wavenumber normalised by the free-air wavenumber .

PorousMediumResult.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot the normalised Zc and k components against frequency.

Requires matplotlib (pip install phonometry[plot]); returns the Axes.