9. Driving functions for WFS

In the following, the driving functions for WFS in the frequency and temporal domain for selected source models are presented. The temporal domain functions consist of a filtering of the source signal and a weighting and delaying of the individual secondary source signals. This property allows for a very efficient implementation of WFS driving functions in the temporal domain. It is one of the main advantages of WFS in comparison to most of the NFC-HOA, SDM solutions discussed above.

9.1. Plane Wave

npw = 0, -1, 0  # direction of plane wave
omega = 2 * np.pi * 1000  # frequency
xref = 0, 0, 0  # 2.5D reference point
array = sfs.array.circular(200, 1.5)
grid = sfs.util.xyz_grid([-1.75, 1.75], [-1.75, 1.75], 0, spacing=0.02)
d, selection, secondary_source = \
    sfs.fd.wfs.plane_25d(omega, array.x, array.n, npw, xref=xref)
twin = sfs.tapering.tukey(selection, alpha=.3)
p = sfs.fd.synthesize(d, twin, array, secondary_source, grid=grid)
sfs.plot2d.amplitude(p, grid, xnorm=xref)
sfs.plot2d.secondary_sources(array.x, array.n, grid=grid)
../_images/wfs-25d-plane-wave.svg

Fig. 9.1 Sound pressure for a monochromatic plane wave synthesized with 2.5D WFS (9.10). Parameters: \(\n_k = (0, -1, 0)\), \(\xref = (0, 0, 0)\), \(f = 1\) kHz.

By inserting the source model of a plane wave (7.1) into (5.2) and (6.5) it follows

(9.1)\[D(\x_0,\w) = 2 w(\x_0) A(\w) \i\wc \scalarprod{\n_k}{\n_{\x_0}} \e{-\i\wc \scalarprod{\n_k}{\x_0}},\]
(9.2)\[D_\text{2.5D}(\x_0,\w) = 2 w(\x_0) A(\w) \sqrt{2\pi|\xref-x_0|} \sqrt{\i\wc } \scalarprod{\n_k}{\n_{\x_0}} \e{-\i\wc \scalarprod{\n_k}{\x_0}}.\]

Transferred to the temporal domain via an inverse Fourier transform (2.2), it follows

(9.3)\[d(\x_0,t) = 2 a(t) * h(t) * w(\x_0) \scalarprod{\n_k}{\n_{\x_0}} \dirac{t - \frac{\scalarprod{\n_k}{\x_0}}{c}},\]
(9.4)\[\begin{aligned} d_\text{2.5D}(\x_0,t) =& 2 a(t) * h_\text{2.5D}(t) * w(\x_0) \sqrt{2\pi|\xref-x_0|} \\ &\cdot \scalarprod{\n_k}{\n_{\x_0}} \dirac{t - \frac{\scalarprod{\n_k}{\x_0}}{c}}, \end{aligned}\]

where

(9.5)\[h(t) = \mathcal{F}^{-1}\left\{\i\wc \right\},\]

and

(9.6)\[h_\text{2.5D}(t) = \mathcal{F}^{-1}\left\{ \sqrt{\i\wc }\right\}\]

denote the so called pre-equalization filters in WFS.

The window function \(w(\x_0)\) for a plane wave as source model can be calculated after [SRA08] as

(9.7)\[w(\x_0) = \begin{cases} 1 & \scalarprod{\n_k}{\n_{\x_0}} > 0 \\ 0 & \text{else} \end{cases}\]

9.2. Point Source

xs = 0, 2.5, 0  # position of source
omega = 2 * np.pi * 1000  # frequency
xref = 0, 0, 0  # 2.5D reference point
array = sfs.array.circular(200, 1.5)
grid = sfs.util.xyz_grid([-1.75, 1.75], [-1.75, 1.75], 0, spacing=0.02)
d, selection, secondary_source = \
    sfs.fd.wfs.point_25d(omega, array.x, array.n, xs, xref=xref)
twin = sfs.tapering.tukey(selection, alpha=.3)
p = sfs.fd.synthesize(d, twin, array, secondary_source, grid=grid)
normalization = 4 * np.pi
sfs.plot2d.amplitude(normalization * p, grid)
sfs.plot2d.secondary_sources(array.x, array.n, grid=grid)
../_images/wfs-25d-point-source.svg

Fig. 9.2 Sound pressure for a monochromatic point source synthesized with 2.5D WFS (9.10). Parameters: \(\xs = (0, 2.5, 0)\) m, \(\xref = (0, 0, 0)\), \(f = 1\) kHz.

By inserting the source model for a point source (7.6) into (5.2) it follows

(9.8)\[D(\x_0,\w) = \frac{1}{2\pi} A(\w) w(\x_0) \i\wc \left(1 + \frac{1}{\i\wc|\x_0-\xs|} \right) \frac{\scalarprod{\x_0-\xs}{\n_{\x_0}}}{|\x_0-\xs|^2} \e{-\i\wc |\x_0-\xs|}.\]

Under the assumption of \(\wc |\x_0-\xs| \gg 1\), (9.8) can be approximated by [Sch16], eq. (2.118)

(9.9)\[D(\x_0,\w) = \frac{1}{2\pi} A(\w) w(\x_0) \i\wc \frac{\scalarprod{\x_0-\xs}{\n_{\x_0}}}{|\x_0-\xs|^2} \e{-\i\wc |\x_0-\xs|}.\]

It has the advantage that its temporal domain version could again be implemented as a simple weighting- and delaying-mechanism.

To reach at 2.5D for a point source, we will start in 3D and apply stationary phase approximations instead of directly using (6.5) – see discussion after [Sch16], (2.146). Under the assumption of \(\frac{\omega}{c} (|\x_0-\xs| + |\x-\x_0|) \gg 1\) it then follows [Sch16], eq. (2.137), [Sta97], eq. (3.10, 3.11)

(9.10)\[\begin{aligned} D_\text{2.5D}(\x_0,\w) =& \frac{1}{\sqrt{2\pi}} A(\w) w(\x_0) \sqrt{\i\wc} \sqrt{\frac{|\xref-\x_0|}{|\xref-\x_0|+|\x_0-\xs|}} \\ &\cdot \frac{\scalarprod{\x_0-\xs}{\n_{\x_0}}} {|\x_0-\xs|^{\frac{3}{2}}} \e{-\i\wc |\x_0-\xs|}, \end{aligned}\]

whereby \(\xref\) is a reference point at which the synthesis is correct. A second stationary phase approximation can be applied to reach at [Sch16], eq. (2.131, 2.141), [Sta97], eq. (3.16, 3.17)

(9.11)\[\begin{aligned} D_\text{2.5D}(\x_0,\w) =& \frac{1}{\sqrt{2\pi}} A(\w) w(\x_0) \sqrt{\i\wc} \sqrt{\frac{d_\text{ref}}{d_\text{ref}+d_\text{s}}} \\ &\cdot \frac{\scalarprod{\x_0-\xs}{\n_{\x_0}}} {|\x_0-\xs|^{\frac{3}{2}}} \e{-\i\wc |\x_0-\xs|}, \end{aligned}\]

which is the traditional formulation of a point source in WFS as given by eq. (2.27) in [Ver97] [1]. Now \(d_\text{ref}\) is the distance of a line parallel to the secondary source distribution and \(d_\text{s}\) the shortest possible distance from the point source to the linear secondary source distribution.

The default WFS driving functions for a point source in the SFS Toolbox are (9.9) and (9.10). Transferring both to the temporal domain via an inverse Fourier transform (2.2) it follows

(9.12)\[d(\x_0,t) = \frac{1}{2{\pi}} a(t) * h(t) * w(\x_0) \frac{\scalarprod{\x_0-\xs}{\n_{\x_0}}}{|\x_0-\xs|^2} \dirac{t-\frac{|\x_0-\xs|}{c}},\]
(9.13)\[\begin{aligned} d_\text{2.5D}(\x_0,t) =& \frac{1}{\sqrt{2\pi}} a(t) * h_\text{2.5D}(t) * w(\x_0) \sqrt{\frac{|\xref-\x_0|}{|\x_0-\xs|+|\xref-\x_0|}} \\ &\cdot \frac{\scalarprod{\x_0-\xs}{\n_{\x_0}}} {|\x_0-\xs|^{\frac{3}{2}}} \dirac{t-\frac{|\x_0-\xs|}{c}}, \\ \end{aligned}\]
(9.14)\[\begin{aligned} d_\text{2.5D}(\x_0,t) =& \frac{1}{\sqrt{2\pi}} a(t) * h_\text{2.5D}(t) * w(\x_0) \sqrt{\frac{d_\text{ref}}{d_\text{ref}+d_\text{s}}} \\ &\cdot \frac{\scalarprod{\x_0-\xs}{\n_{\x_0}}} {|\x_0-\xs|^{\frac{3}{2}}} \dirac{t-\frac{|\x_0-\xs|}{c}}. \end{aligned}\]

The window function \(w(\x_0)\) for a point source as source model can be calculated after [SRA08] as

(9.15)\[w(\x_0) = \begin{cases} 1 & \scalarprod{\x_0-\xs}{\n_{\x_0}} > 0 \\ 0 & \text{else} \end{cases}\]

9.3. Line Source

xs = 0, 2.5, 0  # position of source
omega = 2 * np.pi * 1000  # frequency
array = sfs.array.circular(200, 1.5)
grid = sfs.util.xyz_grid([-1.75, 1.75], [-1.75, 1.75], 0, spacing=0.02)
d, selection, secondary_source = \
    sfs.fd.wfs.line_2d(omega, array.x, array.n, xs)
twin = sfs.tapering.tukey(selection, alpha=.3)
p = sfs.fd.synthesize(d, twin, array, secondary_source, grid=grid)
normalization = (np.sqrt(8 * np.pi * omega / sfs.default.c)
                 * np.exp(1j * np.pi / 4))
sfs.plot2d.amplitude(normalization * p, grid)
sfs.plot2d.secondary_sources(array.x, array.n, grid=grid)
../_images/wfs-25d-line-source.svg

Fig. 9.3 Sound pressure for a monochromatic line source synthesized with 2D WFS (9.17). Parameters: \(\xs = (0, 2.5, 0)\) m, \(\xref = (0, 0, 0)\), \(f = 1\) kHz.

For a line source its orientation \(\n_\text{s}\) has an influence on the synthesized sound field as well. Let \(|\vec{v}|\) be the distance between \(\x_0\) and the line source with

(9.16)\[\vec{v} = \x_0-\xs - \scalarprod{\x_0-\xs}{\n_\text{s}} \n_\text{s},\]

where \(|\n_\text{s}| = 1\). For a 2D or 2.5D secondary source setup and a line source orientation perpendicular to the plane where the secondary sources are located this automatically simplifies to \(\vec{v} = \x_0 - \xs\).

By inserting the source model for a line source (7.12) into (5.2) and (6.5) and calculating the derivate of the Hankel function after http://dlmf.nist.gov/10.6.E6 it follows

(9.17)\[D(\x_0,\w) = -\frac{1}{2}A(\w) w(\x_0) \i\wc \frac{\scalarprod{\vec{v}}{\n_{\x_0}}}{|\vec{v}|} \Hankel{2}{1}{\wc |\vec{v}|},\]
(9.18)\[D_\text{2.5D}(\x_0,\w) = -\frac{1}{2}g_0 A(\w) w(\x_0) \sqrt{\i\wc} \frac{\scalarprod{\vec{v}}{\n_{\x_0}}}{|\vec{v}|} \Hankel{2}{1}{\wc |\vec{v}|}.\]

Applying \(\Hankel{2}{1}{\zeta} \approx -\sqrt{\frac{2}{\pi\i}\zeta} \e{-\i\zeta}\) for \(z\gg1\) after [Wil99], eq. (4.23) and transferred to the temporal domain via an inverse Fourier transform (2.2) it follows

(9.19)\[d(\x_0,t) = \sqrt{\frac{1}{2\pi}} a(t) * h(t) * w(\x0) \frac{\scalarprod{\vec{v}}{\n_{\x_0}}}{|\vec{v}|^{\frac{3}{2}}} \dirac{t-\frac{|\vec{v}|}{c}},\]
(9.20)\[d_\text{2.5D}(\x_0,t) = g_0 \sqrt{\frac{1}{2\pi}} a(t) * {\mathcal{F}^{-1}\left\{\sqrt{\frac{c} {\i\w}}\right\}} * w(\x0) \frac{\scalarprod{\vec{v}}{\n_{\x_0}}}{|\vec{v}|^{\frac{3}{2}}} \dirac{t-\frac{|\vec{v}|}{c}},\]

The window function \(w(\x_0)\) for a line source as source model can be calculated after [SRA08] as

(9.21)\[w(\x_0) = \begin{cases} 1 & \scalarprod{\vec{v}}{\n_{\x_0}} > 0 \\ 0 & \text{else} \end{cases}\]

9.4. Focused Source

xs = 0, 0.5, 0  # position of source
ns = 0, -1, 0  # direction of source
omega = 2 * np.pi * 1000  # frequency
xref = 0, 0, 0  # 2.5D reference point
array= sfs.array.circular(200, 1.5)
grid = sfs.util.xyz_grid([-1.75, 1.75], [-1.75, 1.75], 0, spacing=0.02)
d, selection, secondary_source = \
    sfs.fd.wfs.focused_25d(omega, array.x, array.n, xs, ns, xref=xref)
twin = sfs.tapering.tukey(selection, alpha=.3)
p = sfs.fd.synthesize(d, twin, array, secondary_source, grid=grid)
sfs.plot2d.amplitude(p, grid)
sfs.plot2d.secondary_sources(array.x, array.n, grid=grid)
../_images/wfs-25d-focused-source.svg

Fig. 9.4 Sound pressure for a monochromatic focused source synthesized with 2.5D WFS (9.23). Parameters: \(\xs = (0, 0.5, 0)\) m, \(\n_\text{s} = (0, -1, 0)\), \(\xref = (0, 0, 0)\), \(f = 1\) kHz.

As mentioned before, focused sources exhibit a field that converges in a focal point inside the audience area. After passing the focal point, the field becomes a diverging one as can be seen in Fig. 9.4. In order to choose the active secondary sources, especially for circular or spherical geometries, the focused source also needs a direction \(\n_\text{s}\).

The driving function for a focused source is given by the td-reversed versions of the driving function for a point source (9.12) and (9.13) as

(9.22)\[D(\x_0,\w) = \frac{1}{2\pi} A(\w) w(\x_0) \i\wc \frac{\scalarprod{\x_0-\xs}{\n_{\x_0}}}{|\x_0-\xs|^2} \e{\i\wc |\x_0-\xs|}.\]

The 2.5D driving functions are given by the td-reversed version of (9.13) for a reference point after [Ver97], eq. (A.14) as

(9.23)\[\begin{aligned} D_\text{2.5D}(\x_0,\w) =& \frac{1}{\sqrt{2\pi}} A(\w) w(\x_0) \sqrt{\i\wc} \sqrt{\frac{|\xref-\x_0|}{||\x_0-\xs|-|\xref-\x_0||}} \\ &\cdot \frac{\scalarprod{\x_0-\xs}{\n_{\x_0}}} {|\x_0-\xs|^{\frac{3}{2}}} \e{\i\wc |\x_0-\xs|}, \end{aligned}\]

and the time reversed version of (9.14) for a reference line, compare [Sta97], eq. (3.16)

(9.24)\[\begin{aligned} D_\text{2.5D}(\x_0,\w) =& \frac{1}{\sqrt{2\pi}} A(\w) w(\x_0) \sqrt{\i\wc} \sqrt{\frac{d_\text{ref}}{d_\text{ref}-d_\text{s}}} \\ &\cdot \frac{\scalarprod{\x_0-\xs}{\n_{\x_0}}} {|\x_0-\xs|^{\frac{3}{2}}} \e{\i\wc |\x_0-\xs|}, \end{aligned}\]

where \(d_\text{ref}\) is the distance of a line parallel to the secondary source distribution and \(d_\text{s}\) the shortest possible distance from the focused source to the linear secondary source distribution.

Transferred to the temporal domain via an inverse Fourier transform (2.2) it follows

(9.25)\[d(\x_0,t) = \frac{1}{2{\pi}} a(t) * h(t) * w(\x_0) \frac{\scalarprod{\x_0-\xs}{\n_{\x_0}}}{|\x_0-\xs|^2} \dirac{t+\frac{|\x_0-\xs|}{c}},\]
(9.26)\[\begin{aligned} d_\text{2.5D}(\x_0,t) =& \frac{1}{\sqrt{2\pi}} a(t) * h_\text{2.5D}(t) * w(\x_0) \sqrt{\frac{|\xref-\x_0|}{||\x_0-\xs|-|\xref-\x_0||}} \\ &\cdot \frac{\scalarprod{\x_0-\xs}{\n_{\x_0}}} {|\x_0-\xs|^{\frac{3}{2}}} \dirac{t+\frac{|\x_0-\xs|}{c}}, \\ \end{aligned}\]
(9.27)\[\begin{aligned} d_\text{2.5D}(\x_0,t) =& \frac{1}{\sqrt{2\pi}} a(t) * h_\text{2.5D}(t) * w(\x_0) \sqrt{\frac{d_\text{ref}}{d_\text{ref}-d_\text{s}}} \\ &\cdot \frac{\scalarprod{\x_0-\xs}{\n_{\x_0}}} {|\x_0-\xs|^{\frac{3}{2}}} \dirac{t+\frac{|\x_0-\xs|}{c}}. \end{aligned}\]

In this document a focused source always refers to the td-reversed version of a point source, but a focused line source can be defined in the same way starting from (9.17)

(9.28)\[D(\x_0,\w) = -\frac{1}{2}A(\w) w(\x_0) \i\wc \frac{\scalarprod{\x_0-\xs}{\n_{\x_0}}}{|\x_0-\xs|} \Hankel{1}{1}{\wc |\x_0-\xs|}.\]

Transferred to the temporal domain via an inverse Fourier transform (2.2) it follows

(9.29)\[d(\x_0,t) = \sqrt{\frac{1}{2\pi}} a(t) * h(t) * w(\x0) \frac{\scalarprod{\x_0-\xs}{\n_{\x_0}}}{|\x_0-\xs|^{\frac{3}{2}}} \dirac{t+\frac{|\x_0-\xs|}{c}}.\]

The window function \(w(\x_0)\) for a focused source can be calculated as

(9.30)\[w(\x_0) = \begin{cases} 1 & \scalarprod{\n_\text{s}}{\xs-\x_0} > 0 \\ 0 & \text{else} \end{cases}\]
[1]Whereby \(r\) corresponds to \(|\x_0-\xs|\) and \(\cos\varphi\) to \(\frac{\scalarprod{\x_0-\xs}{\n_{\x_0}}}{|\x_0-\xs|}\).