Skip to content

electroacoustics.piston

Radiation of a rigid circular piston set in an infinite baffle.

The baffled circular piston is the canonical acoustic radiator: a flat rigid disc of radius a vibrating with a uniform normal velocity in an otherwise rigid infinite plane. It is the model behind a loudspeaker cone in a large cabinet, the open end of a duct, and the reference source for the radiation efficiency of any finite vibrating surface, so its two results — the radiation impedance the air presents to the piston and the directivity of the far field — are the base of the electroacoustics domain (Beranek & Mellow, Acoustics: Sound Fields, Transducers and Vibration 2nd ed., §4.4; Bies, Hansen & Howard, Engineering Noise Control 5th ed.).

Radiation impedance. The reaction force of the air on the piston is with the mechanical radiation impedance

where is the wavenumber, the characteristic impedance of air and S the piston area. The dimensionless piston resistance and reactance functions are (Beranek & Mellow Eq. (4.30))

with J1 the Bessel function of the first kind and H1 the Struve function, both of order one, evaluated at .

  • Low frequency (): so the radiated power rises as , and . The reactance is mass-like, with the radiation (accreted) mass (Beranek & Mellow Eq. (4.32)): the piston drags an extra of air, equivalent to a layer thick over its face.
  • High frequency (): and , so — the piston radiates as if into an infinite tube and the air loads it purely resistively.

Directivity. The far-field pressure of the baffled piston varies with the polar angle theta from the axis as (Beranek & Mellow Eq. (4.42))

The main lobe narrows as ka grows; its first null is at (the first zero of J1), which exists only once . The directivity factor Q (on-axis intensity over the intensity of a point source of equal power radiating into the full sphere) and the directivity index follow from integrating over the radiating hemisphere,

which tends to ( dB, the half-space baffle gain) at low ka and to () at high ka.

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

piston_directivity(ka: ArrayLike, theta: ArrayLike) -> np.ndarray | float

Far-field directivity .

The pressure amplitude of a baffled circular piston relative to its on-axis value (Beranek & Mellow Eq. (4.42)), normalized so .

Parameters

NameDescription
kaWavenumber-radius product ka (scalar or array).
thetaPolar angle from the axis, rad (scalar or array). Broadcast against ka.

Returns: D (float for scalar inputs, else an array).

piston_directivity_pattern(
ka: ArrayLike,
angles: ArrayLike | None = None,
) -> PistonDirectivity

Far-field directivity pattern of one or more baffled circular pistons.

Samples the directivity (Beranek & Mellow Eq. (4.42)) at every ka over a polar-angle grid and bundles it into a PistonDirectivity that exposes .plot(). The main lobe narrows as ka grows; its first null appears once ka passes the first zero of J1 ().

Parameters

NameDescription
kaWavenumber-radius product(s) ka (scalar or 1-D array), each non-negative.
anglesPolar angles theta from the axis, rad (1-D). None (default) uses 361 points spanning the front hemisphere -90 deg to +90 deg, 0.5 deg apart.

Returns: A PistonDirectivity.

piston_reactance(x: ArrayLike) -> np.ndarray | float

Piston reactance function (H1 Struve order 1).

The imaginary part of the normalized radiation impedance of a baffled circular piston (Beranek & Mellow Eq. (4.30)). It rises as (mass-like) at low and decays to 0 at high x.

Parameters

NameDescription
xArgument (scalar or array), dimensionless.

Returns: X1(x) (float for scalar input, else an array).

piston_resistance(x: ArrayLike) -> np.ndarray | float

Piston resistance function .

The real part of the normalized radiation impedance of a baffled circular piston, as a function of (Beranek & Mellow Eq. (4.30)). It rises as at low x and tends to 1 at high x.

Parameters

NameDescription
xArgument (scalar or array), dimensionless.

Returns: R1(x) (float for scalar input, else an array).

PistonDirectivity(
angles: np.ndarray,
ka: np.ndarray,
directivity: np.ndarray,
directivity_db: np.ndarray,
)

Far-field directivity pattern of a baffled circular piston.

Bundles the far-field directivity (Beranek & Mellow Eq. (4.42)) of one or more baffled circular pistons over a shared polar-angle grid, so the classic beam pattern can be drawn with plot. The maths is piston_directivity; this is a thin, plottable bundle around it.

Attributes

NameDescription
anglesPolar angles theta from the axis, rad.
kaWavenumber-radius products ka, one per pattern (a 1-D array).
directivityLinear directivity , normalized so , as a (len(ka), len(angles)) array; row i is the pattern for ka[i].
directivity_dbDirectivity in dB, , same shape as directivity (the side-lobe nulls floor at a large negative value rather than -inf).
PistonDirectivity.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot the far-field directivity (beam) pattern on a polar axes.

Draws the directivity in dB against the polar angle: one curve per ka value as a single family (still one concept, the directivity pattern). A polar axes is created when ax is None. Requires matplotlib (pip install phonometry[plot]).

Parameters

NameDescription
axExisting (polar) axes, or None to create a figure.
languageLabel language, "en" (default) or "es".
kwargsForwarded to the Axes.plot call when the result holds a single ka; ignored for a multi-ka family so one user color or label cannot collapse the per-curve styling.

Returns: The axes.

plot_piston_geometry(
radius: float,
ax: Axes | None = None,
*,
angles: ArrayLike | None = None,
directivity: ArrayLike | None = None,
lobe_label: str | None = None,
language: str = 'en',
**kwargs: Any,
) -> Axes

Draw a baffled piston to scale, optionally with a directivity lobe.

The rigid baffle is the vertical wall, the piston the plate of radius a set into it; when angles/directivity are given the normalised far-field lobe is overlaid on the radiation side.

Parameters

NameDescription
radiusPiston radius a, in metres.
axExisting axes, or None to create a figure.
anglesFar-field angles, in radians (0 on axis), matching directivity.
directivityLinear directivity values in [0, 1].
lobe_labelOptional legend label for the lobe (e.g. the ka).
languageLabel language, "en" (default) or "es".
kwargsForwarded to the piston rectangle.

Returns: The axes.

radiating_piston(
radius: float,
frequencies: ArrayLike,
*,
speed_of_sound: float = 343.0,
density: float = 1.206,
angles: ArrayLike | None = None,
) -> RadiatingPistonResult

Radiation impedance and directivity of a rigid baffled circular piston.

Evaluates the piston resistance and reactance , the mechanical radiation impedance , the low-frequency radiation mass and the directivity index over the given frequencies (Beranek & Mellow §4.4). Pass angles to also sample the far-field directivity pattern .

Parameters

NameDescription
radiusPiston radius a, m.
frequenciesFrequencies f, Hz (scalar or 1-D array), all > 0.
speed_of_soundSpeed of sound c, m/s (default 343).
densityAir density , kg/m3 (default 1.206).
anglesOptional polar angles theta from the axis, rad, at which to sample the directivity pattern.

Returns: A RadiatingPistonResult.

RadiatingPistonResult(
frequencies: np.ndarray,
ka: np.ndarray,
resistance: np.ndarray,
reactance: np.ndarray,
radiation_resistance: np.ndarray,
radiation_reactance: np.ndarray,
radiation_mass: float,
directivity_index: np.ndarray,
angles: np.ndarray | None,
directivity: np.ndarray | None,
radius: float,
speed_of_sound: float,
density: float,
)

Radiation impedance and directivity of a baffled circular piston.

Attributes

NameDescription
frequenciesFrequencies f, Hz.
kaWavenumber-radius product ka at each frequency.
resistanceNormalized piston resistance (real part of ).
reactanceNormalized piston reactance (imaginary part of ).
radiation_resistanceMechanical radiation resistance , N s/m.
radiation_reactanceMechanical radiation reactance , N s/m.
radiation_massLow-frequency accreted air mass , kg (a single value; the mass limit of radiation_reactance / omega).
directivity_indexDirectivity index , dB.
anglesPolar angles of directivity, rad, or None if not requested.
directivityFar-field directivity as a (n_freq, n_angle) array, or None if angles was not given.
radiusPiston radius a, m.
speed_of_soundSpeed of sound c, m/s.
densityAir density , kg/m3.
RadiatingPistonResult.plot(
ax: Axes | None = None,
*,
language: str = 'en',
**kwargs: Any,
) -> Axes

Plot the normalized piston resistance and reactance against ka.

Reproduces the classic Beranek & Mellow figure: R1 rising to 1 and X1 peaking then decaying, over the ka range of the result. Requires matplotlib (pip install phonometry[plot]).

Parameters

NameDescription
languageLabel language, "en" (default) or "es".
RadiatingPistonResult.plot_geometry(
ax: Axes | None = None,
*,
frequency_index: int = -1,
language: str = 'en',
**kwargs: Any,
) -> Axes

Draw the baffled piston to scale, with its directivity lobe.

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

Parameters

NameDescription
axExisting axes, or None to create a figure.
frequency_indexIndex of the frequency whose far-field lobe is overlaid (default: the highest); ignored when the result carries no directivity.
languageLabel language, "en" (default) or "es".
kwargsForwarded to the piston rectangle.