sfs.fd.source

Compute the sound field generated by a sound source.

import sfs
import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = 8, 4.5  # inch

x0 = 1.5, 1, 0
f = 500  # Hz
omega = 2 * np.pi * f

normalization_point = 4 * np.pi
normalization_line = \
    np.sqrt(8 * np.pi * omega / sfs.default.c) * np.exp(1j * np.pi / 4)

grid = sfs.util.xyz_grid([-2, 3], [-1, 2], 0, spacing=0.02)

# Grid for vector fields:
vgrid = sfs.util.xyz_grid([-2, 3], [-1, 2], 0, spacing=0.1)

Functions

line(omega, x0, grid, *[, c])

Line source parallel to the z-axis.

line_bandlimited(omega, x0, grid, *[, …])

Spatially bandlimited (modal) line source parallel to the z-axis.

line_dipole(omega, x0, n0, grid, *[, c])

Line source with dipole characteristics parallel to the z-axis.

line_dirichlet_edge(omega, x0, grid, *[, …])

Line source scattered at an edge with Dirichlet boundary conditions.

line_velocity(omega, x0, grid, *[, c, rho0])

Velocity of line source parallel to the z-axis.

plane(omega, x0, n0, grid, *[, c])

Plane wave.

plane_averaged_intensity(omega, x0, n0, grid, *)

Averaged intensity of a plane wave.

plane_velocity(omega, x0, n0, grid, *[, c, rho0])

Velocity of a plane wave.

point(omega, x0, grid, *[, c])

Sound pressure of a point source.

point_averaged_intensity(omega, x0, grid, *)

Velocity of a point source.

point_dipole(omega, x0, n0, grid, *[, c])

Point source with dipole characteristics.

point_image_sources(omega, x0, grid, L, *, …)

Point source in a rectangular room using the mirror image source model.

point_modal(omega, x0, grid, L, *[, N, …])

Point source in a rectangular room using a modal room model.

point_modal_velocity(omega, x0, grid, L, *)

Velocity of point source in a rectangular room using a modal room model.

point_velocity(omega, x0, grid, *[, c, rho0])

Particle velocity of a point source.

pulsating_sphere(omega, center, radius, …)

Sound pressure of a pulsating sphere.

pulsating_sphere_velocity(omega, center, …)

Particle velocity of a pulsating sphere.

sfs.fd.source.point(omega, x0, grid, *, c=None)[source]

Sound pressure of a point source.

Parameters
  • omega (float) – Frequency of source.

  • x0 ((3,) array_like) – Position of source.

  • grid (triple of array_like) – The grid that is used for the sound field calculations. See sfs.util.xyz_grid().

  • c (float, optional) – Speed of sound.

Returns

numpy.ndarray – Sound pressure at positions given by grid.

Notes

\[G(\x-\x_0,\w) = \frac{1}{4\pi} \frac{\e{-\i\wc|\x-\x_0|}}{|\x-\x_0|}\]

Examples

p = sfs.fd.source.point(omega, x0, grid)
sfs.plot2d.amplitude(p, grid)
plt.title("Point Source at {} m".format(x0))
_images/sfs-fd-source-2.svg

Normalization …

sfs.plot2d.amplitude(p * normalization_point, grid,
                     colorbar_kwargs=dict(label="p / Pa"))
plt.title("Point Source at {} m (normalized)".format(x0))
_images/sfs-fd-source-3.svg
sfs.fd.source.point_velocity(omega, x0, grid, *, c=None, rho0=None)[source]

Particle velocity of a point source.

Parameters
  • omega (float) – Frequency of source.

  • x0 ((3,) array_like) – Position of source.

  • grid (triple of array_like) – The grid that is used for the sound field calculations. See sfs.util.xyz_grid().

  • c (float, optional) – Speed of sound.

  • rho0 (float, optional) – Static density of air.

Returns

XyzComponents – Particle velocity at positions given by grid.

Examples

The particle velocity can be plotted on top of the sound pressure:

v = sfs.fd.source.point_velocity(omega, x0, vgrid)
sfs.plot2d.amplitude(p * normalization_point, grid)
sfs.plot2d.vectors(v * normalization_point, vgrid)
plt.title("Sound Pressure and Particle Velocity")
_images/sfs-fd-source-4.svg
sfs.fd.source.point_averaged_intensity(omega, x0, grid, *, c=None, rho0=None)[source]

Velocity of a point source.

Parameters
  • omega (float) – Frequency of source.

  • x0 ((3,) array_like) – Position of source.

  • grid (triple of array_like) – The grid that is used for the sound field calculations. See sfs.util.xyz_grid().

  • c (float, optional) – Speed of sound.

  • rho0 (float, optional) – Static density of air.

Returns

XyzComponents – Averaged intensity at positions given by grid.

sfs.fd.source.point_dipole(omega, x0, n0, grid, *, c=None)[source]

Point source with dipole characteristics.

Parameters
  • omega (float) – Frequency of source.

  • x0 ((3,) array_like) – Position of source.

  • n0 ((3,) array_like) – Normal vector (direction) of dipole.

  • grid (triple of array_like) – The grid that is used for the sound field calculations. See sfs.util.xyz_grid().

  • c (float, optional) – Speed of sound.

Returns

numpy.ndarray – Sound pressure at positions given by grid.

Notes

\[G(\x-\x_0,\w) = \frac{1}{4\pi} \left(\i\wc + \frac{1}{|\x-\x_0|}\right) \frac{\scalarprod{\x-\x_0}{\n_\text{s}}}{|\x-\x_0|^2} \e{-\i\wc|\x-\x_0}\]

Examples

n0 = 0, 1, 0
p = sfs.fd.source.point_dipole(omega, x0, n0, grid)
sfs.plot2d.amplitude(p, grid)
plt.title("Dipole Point Source at {} m".format(x0))
_images/sfs-fd-source-5.svg
sfs.fd.source.point_modal(omega, x0, grid, L, *, N=None, deltan=0, c=None)[source]

Point source in a rectangular room using a modal room model.

Parameters
  • omega (float) – Frequency of source.

  • x0 ((3,) array_like) – Position of source.

  • grid (triple of array_like) – The grid that is used for the sound field calculations. See sfs.util.xyz_grid().

  • L ((3,) array_like) – Dimensionons of the rectangular room.

  • N ((3,) array_like or int, optional) – For all three spatial dimensions per dimension maximum order or list of orders. A scalar applies to all three dimensions. If no order is provided it is approximately determined.

  • deltan (float, optional) – Absorption coefficient of the walls.

  • c (float, optional) – Speed of sound.

Returns

numpy.ndarray – Sound pressure at positions given by grid.

sfs.fd.source.point_modal_velocity(omega, x0, grid, L, *, N=None, deltan=0, c=None)[source]

Velocity of point source in a rectangular room using a modal room model.

Parameters
  • omega (float) – Frequency of source.

  • x0 ((3,) array_like) – Position of source.

  • grid (triple of array_like) – The grid that is used for the sound field calculations. See sfs.util.xyz_grid().

  • L ((3,) array_like) – Dimensionons of the rectangular room.

  • N ((3,) array_like or int, optional) – Combination of modal orders in the three-spatial dimensions to calculate the sound field for or maximum order for all dimensions. If not given, the maximum modal order is approximately determined and the sound field is computed up to this maximum order.

  • deltan (float, optional) – Absorption coefficient of the walls.

  • c (float, optional) – Speed of sound.

Returns

XyzComponents – Particle velocity at positions given by grid.

sfs.fd.source.point_image_sources(omega, x0, grid, L, *, max_order, coeffs=None, c=None)[source]

Point source in a rectangular room using the mirror image source model.

Parameters
  • omega (float) – Frequency of source.

  • x0 ((3,) array_like) – Position of source.

  • grid (triple of array_like) – The grid that is used for the sound field calculations. See sfs.util.xyz_grid().

  • L ((3,) array_like) – Dimensions of the rectangular room.

  • max_order (int) – Maximum number of reflections for each image source.

  • coeffs ((6,) array_like, optional) – Reflection coeffecients of the walls. If not given, the reflection coefficients are set to one.

  • c (float, optional) – Speed of sound.

Returns

numpy.ndarray – Sound pressure at positions given by grid.

sfs.fd.source.line(omega, x0, grid, *, c=None)[source]

Line source parallel to the z-axis.

Parameters
  • omega (float) – Frequency of source.

  • x0 ((3,) array_like) – Position of source. Note: third component of x0 is ignored.

  • grid (triple of array_like) – The grid that is used for the sound field calculations. See sfs.util.xyz_grid().

  • c (float, optional) – Speed of sound.

Returns

numpy.ndarray – Sound pressure at positions given by grid.

Notes

\[G(\x-\x_0,\w) = -\frac{\i}{4} \Hankel{2}{0}{\wc|\x-\x_0|}\]

Examples

p = sfs.fd.source.line(omega, x0, grid)
sfs.plot2d.amplitude(p, grid)
plt.title("Line Source at {} m".format(x0[:2]))
_images/sfs-fd-source-6.svg

Normalization …

sfs.plot2d.amplitude(p * normalization_line, grid,
                     colorbar_kwargs=dict(label="p / Pa"))
plt.title("Line Source at {} m (normalized)".format(x0[:2]))
_images/sfs-fd-source-7.svg
sfs.fd.source.line_velocity(omega, x0, grid, *, c=None, rho0=None)[source]

Velocity of line source parallel to the z-axis.

Parameters
  • omega (float) – Frequency of source.

  • x0 ((3,) array_like) – Position of source. Note: third component of x0 is ignored.

  • grid (triple of array_like) – The grid that is used for the sound field calculations. See sfs.util.xyz_grid().

  • c (float, optional) – Speed of sound.

Returns

XyzComponents – Particle velocity at positions given by grid.

Examples

The particle velocity can be plotted on top of the sound pressure:

v = sfs.fd.source.line_velocity(omega, x0, vgrid)
sfs.plot2d.amplitude(p * normalization_line, grid)
sfs.plot2d.vectors(v * normalization_line, vgrid)
plt.title("Sound Pressure and Particle Velocity")
_images/sfs-fd-source-8.svg
sfs.fd.source.line_dipole(omega, x0, n0, grid, *, c=None)[source]

Line source with dipole characteristics parallel to the z-axis.

Parameters
  • omega (float) – Frequency of source.

  • x0 ((3,) array_like) – Position of source. Note: third component of x0 is ignored.

  • x0 ((3,) array_like) – Normal vector of the source.

  • grid (triple of array_like) – The grid that is used for the sound field calculations. See sfs.util.xyz_grid().

  • c (float, optional) – Speed of sound.

Notes

\[G(\x-\x_0,\w) = \frac{\i k}{4} \Hankel{2}{1}{\wc|\x-\x_0|} \cos{\phi}\]
sfs.fd.source.line_bandlimited(omega, x0, grid, *, max_order=None, c=None)[source]

Spatially bandlimited (modal) line source parallel to the z-axis.

Parameters
  • omega (float) – Frequency of source.

  • x0 ((3,) array_like) – Position of source. Note: third component of x0 is ignored.

  • grid (triple of array_like) – The grid that is used for the sound field calculations. See sfs.util.xyz_grid().

  • max_order (int, optional) – Number of elements for series expansion of the source. No bandlimitation if not given.

  • c (float, optional) – Speed of sound.

Returns

numpy.ndarray – Sound pressure at positions given by grid.

Notes

\[\begin{split}G(\x-\x_0,\w) = -\frac{\i}{4} \sum_{\nu = - N}^{N} e^{j \nu (\alpha - \alpha_0)} \begin{cases} J_\nu(\frac{\omega}{c} r) H_\nu^\text{(2)}(\frac{\omega}{c} r_0) & \text{for } r \leq r_0 \\ J_\nu(\frac{\omega}{c} r_0) H_\nu^\text{(2)}(\frac{\omega}{c} r) & \text{for } r > r_0 \\ \end{cases}\end{split}\]

Examples

p = sfs.fd.source.line_bandlimited(omega, x0, grid, max_order=10)
sfs.plot2d.amplitude(p * normalization_line, grid)
plt.title("Bandlimited Line Source at {} m".format(x0[:2]))
_images/sfs-fd-source-9.svg
sfs.fd.source.line_dirichlet_edge(omega, x0, grid, *, alpha=4.71238898038469, Nc=None, c=None)[source]

Line source scattered at an edge with Dirichlet boundary conditions.

[Mos12], eq.(10.18/19)

Parameters
  • omega (float) – Angular frequency.

  • x0 ((3,) array_like) – Position of line source.

  • grid (triple of array_like) – The grid that is used for the sound field calculations. See sfs.util.xyz_grid().

  • alpha (float, optional) – Outer angle of edge.

  • Nc (int, optional) – Number of elements for series expansion of driving function. Estimated if not given.

  • c (float, optional) – Speed of sound

Returns

numpy.ndarray – Complex pressure at grid positions.

sfs.fd.source.plane(omega, x0, n0, grid, *, c=None)[source]

Plane wave.

Parameters
  • omega (float) – Frequency of plane wave.

  • x0 ((3,) array_like) – Position of plane wave.

  • n0 ((3,) array_like) – Normal vector (direction) of plane wave.

  • grid (triple of array_like) – The grid that is used for the sound field calculations. See sfs.util.xyz_grid().

  • c (float, optional) – Speed of sound.

Returns

numpy.ndarray – Sound pressure at positions given by grid.

Notes

\[G(\x,\w) = \e{-\i\wc\n\x}\]

Examples

direction = 45  # degree
n0 = sfs.util.direction_vector(np.radians(direction))
p = sfs.fd.source.plane(omega, x0, n0, grid)
sfs.plot2d.amplitude(p, grid, colorbar_kwargs=dict(label="p / Pa"))
plt.title("Plane wave with direction {} degree".format(direction))
_images/sfs-fd-source-10.svg
sfs.fd.source.plane_velocity(omega, x0, n0, grid, *, c=None, rho0=None)[source]

Velocity of a plane wave.

Parameters
  • omega (float) – Frequency of plane wave.

  • x0 ((3,) array_like) – Position of plane wave.

  • n0 ((3,) array_like) – Normal vector (direction) of plane wave.

  • grid (triple of array_like) – The grid that is used for the sound field calculations. See sfs.util.xyz_grid().

  • c (float, optional) – Speed of sound.

  • rho0 (float, optional) – Static density of air.

Returns

XyzComponents – Particle velocity at positions given by grid.

Notes

\[V(\x,\w) = \frac{1}{\rho c} \e{-\i\wc\n\x} \n\]

Examples

The particle velocity can be plotted on top of the sound pressure:

v = sfs.fd.source.plane_velocity(omega, x0, n0, vgrid)
sfs.plot2d.amplitude(p, grid)
sfs.plot2d.vectors(v, vgrid)
plt.title("Sound Pressure and Particle Velocity")
_images/sfs-fd-source-11.svg
sfs.fd.source.plane_averaged_intensity(omega, x0, n0, grid, *, c=None, rho0=None)[source]

Averaged intensity of a plane wave.

Parameters
  • omega (float) – Frequency of plane wave.

  • x0 ((3,) array_like) – Position of plane wave.

  • n0 ((3,) array_like) – Normal vector (direction) of plane wave.

  • grid (triple of array_like) – The grid that is used for the sound field calculations. See sfs.util.xyz_grid().

  • c (float, optional) – Speed of sound.

  • rho0 (float, optional) – Static density of air.

Returns

XyzComponents – Averaged intensity at positions given by grid.

Notes

\[I(\x,\w) = \frac{1}{2\rho c} \n\]
sfs.fd.source.pulsating_sphere(omega, center, radius, amplitude, grid, *, inside=False, c=None)[source]

Sound pressure of a pulsating sphere.

Parameters
  • omega (float) – Frequency of pulsating sphere

  • center ((3,) array_like) – Center of sphere.

  • radius (float) – Radius of sphere.

  • amplitude (float) – Amplitude of displacement.

  • grid (triple of array_like) – The grid that is used for the sound field calculations. See sfs.util.xyz_grid().

  • inside (bool, optional) – As default, numpy.nan is returned for inside the sphere. If inside=True, the sound field inside the sphere is extrapolated.

  • c (float, optional) – Speed of sound.

Returns

numpy.ndarray – Sound pressure at positions given by grid. If inside=False, numpy.nan is returned for inside the sphere.

Examples

radius = 0.25
amplitude = 1 / (radius * omega * sfs.default.rho0 * sfs.default.c)
p = sfs.fd.source.pulsating_sphere(omega, x0, radius, amplitude, grid)
sfs.plot2d.amplitude(p, grid)
plt.title("Sound Pressure of a Pulsating Sphere")
_images/sfs-fd-source-12.svg
sfs.fd.source.pulsating_sphere_velocity(omega, center, radius, amplitude, grid, *, c=None)[source]

Particle velocity of a pulsating sphere.

Parameters
  • omega (float) – Frequency of pulsating sphere

  • center ((3,) array_like) – Center of sphere.

  • radius (float) – Radius of sphere.

  • amplitude (float) – Amplitude of displacement.

  • grid (triple of array_like) – The grid that is used for the sound field calculations. See sfs.util.xyz_grid().

  • c (float, optional) – Speed of sound.

Returns

XyzComponents – Particle velocity at positions given by grid. numpy.nan is returned for inside the sphere.

Examples

v = sfs.fd.source.pulsating_sphere_velocity(omega, x0, radius, amplitude, vgrid)
sfs.plot2d.amplitude(p, grid)
sfs.plot2d.vectors(v, vgrid)
plt.title("Sound Pressure and Particle Velocity of a Pulsating Sphere")
_images/sfs-fd-source-13.svg