Filter Design

The add-on fdesign can be used to design digital linear filters for the Hankel or Fourier transform, or for any linear transform ([Ghos70]). For this included or provided theoretical transform pairs can be used. Alternatively, one can use the EM modeller empymod to use the responses to an arbitrary 1D model as numerical transform pair.

More information can be found in the following places:

This filter designing tool uses the direct matrix inversion method as described in [Kong07] and is based on scripts by [Key12]. The whole project of fdesign started with the Matlab scripts from Kerry Key, which he used to design his filters for [Key09], [Key12]. Fruitful discussions with Evert Slob and Kerry Key improved the add-on substantially.

Note that the use of empymod to create numerical transform pairs is, as of now, only implemented for the Hankel transform.

Implemented analytical transform pairs

The following tables list the transform pairs which are implemented by default. Any other transform pair can be provided as input. A transform pair is defined in the following way:

from empymod.scripts import fdesign

def my_tp_pair(var):
    '''My transform pair.'''

    def lhs(l):
        return func(l, var)

    def rhs(r):
        return func(r, var)

    return fdesign.Ghosh(name, lhs, rhs)

Here, name must be one of j0, j1, sin, or cos, depending what type of transform pair it is. Additional variables are provided with var. The evaluation points of the lhs are denoted by l, and the evaluation points of the rhs are denoted as r. As an example here the implemented transform pair j0_1

def j0_1(a=1):
    '''Hankel transform pair J0_1 ([Ande75]_).'''

    def lhs(l):
        return l*np.exp(-a*l**2)

    def rhs(r):
        return np.exp(-r**2/(4*a))/(2*a)

    return Ghosh('j0', lhs, rhs)

Implemented Hankel transforms

  • j0_1 [Ande75]

    (1)\[\int^\infty_0 l \exp\left(-al^2\right) J_0(lr) dl = \frac{\exp\left(\frac{-r^2}{4a}\right)}{2a}\]
  • j0_2 [Ande75]

    (2)\[\int^\infty_0 \exp\left(-al\right) J_0(lr) dl = \frac{1}{\sqrt{a^2+r^2}}\]
  • j0_3 [GuSi97]

    (3)\[\int^\infty_0 l\exp\left(-al\right) J_0(lr) dl = \frac{a}{(a^2 + r^2)^{3/2}}\]
  • j0_4 [ChCo82]

    (4)\[\int^\infty_0 \frac{l}{\beta} \exp\left(-\beta z_v \right) J_0(lr) dl = \frac{\exp\left(-\gamma R\right)}{R}\]
  • j0_5 [ChCo82]

    (5)\[\int^\infty_0 l \exp\left(-\beta z_v \right) J_0(lr) dl = \frac{ z_v (\gamma R + 1)}{R^3}\exp\left(-\gamma R\right)\]
  • j1_1 [Ande75]

    (6)\[\int^\infty_0 l^2 \exp\left(-al^2\right) J_1(lr) dl = \frac{r}{4a^2} \exp\left(-\frac{r^2}{4a}\right)\]
  • j1_2 [Ande75]

    (7)\[\int^\infty_0 \exp\left(-al\right) J_1(lr) dl = \frac{\sqrt{a^2+r^2}-a}{r\sqrt{a^2 + r^2}}\]
  • j1_3 [Ande75]

    (8)\[\int^\infty_0 l \exp\left(-al\right) J_1(lr) dl = \frac{r}{(a^2 + r^2)^{3/2}}\]
  • j1_4 [ChCo82]

    (9)\[\int^\infty_0 \frac{l^2}{\beta} \exp\left(-\beta z_v \right) J_1(lr) dl = \frac{r(\gamma R+1)}{R^3}\exp\left(-\gamma R\right)\]
  • j1_5 [ChCo82]

    (10)\[\int^\infty_0 l^2 \exp\left(-\beta z_v \right) J_1(lr) dl = \frac{r z_v(\gamma^2R^2+3\gamma R+3)}{R^5}\exp\left(-\gamma R\right)\]


\[a >0, r>0\]
\[z_v = |z_{rec} - z_{src}|\]
\[R = \sqrt{r^2 + z_v^2}\]
\[\gamma = \sqrt{2j\pi\mu_0f/\rho}\]
\[\beta = \sqrt{l^2 + \gamma^2}\]

Implemented Fourier transforms

  • sin_1 [Ande75]

    (11)\[\int^\infty_0 l\exp\left(-a^2l^2\right) \sin(lr) dl = \frac{\sqrt{\pi}r}{4a^3} \exp\left(-\frac{r^2}{4a^2}\right)\]
  • sin_2 [Ande75]

    (12)\[\int^\infty_0 \exp\left(-al\right) \sin(lr) dl = \frac{r}{a^2 + r^2}\]
  • sin_3 [Ande75]

    (13)\[\int^\infty_0 \frac{l}{a^2+l^2} \sin(lr) dl = \frac{\pi}{2} \exp\left(-ar\right)\]
  • cos_1 [Ande75]

    (14)\[\int^\infty_0 \exp\left(-a^2l^2\right) \cos(lr) dl = \frac{\sqrt{\pi}}{2a} \exp\left(-\frac{r^2}{4a^2}\right)\]
  • cos_2 [Ande75]

    (15)\[\int^\infty_0 \exp\left(-al\right) \cos(lr) dl = \frac{a}{a^2 + r^2}\]
  • cos_3 [Ande75]

    (16)\[\int^\infty_0 \frac{1}{a^2+l^2} \cos(lr) dl = \frac{\pi}{2a} \exp\left(-ar\right)\]


design(n, spacing, shift, fI[, fC, r, …])

Digital linear filter (DLF) design

save_filter(name, filt[, full, path])

Save DLF-filter and inversion output to plain text files.

load_filter(name[, full, path, filter_coeff])

Load saved DLF-filter and inversion output from text files.

plot_result(filt, full[, prntres])

QC the inversion result.

print_result(filt[, full])

Print best filter information.


Hankel transform pair J0_1 ([Ande75]).


Hankel transform pair J0_2 ([Ande75]).


Hankel transform pair J0_3 ([GuSi97]).

j0_4([f, rho, z])

Hankel transform pair J0_4 ([ChCo82]).

j0_5([f, rho, z])

Hankel transform pair J0_5 ([ChCo82]).


Hankel transform pair J1_1 ([Ande75]).


Hankel transform pair J1_2 ([Ande75]).


Hankel transform pair J1_3 ([Ande75]).

j1_4([f, rho, z])

Hankel transform pair J1_4 ([ChCo82]).

j1_5([f, rho, z])

Hankel transform pair J1_5 ([ChCo82]).

sin_1([a, inverse])

Fourier sine transform pair sin_1 ([Ande75]).

sin_2([a, inverse])

Fourier sine transform pair sin_2 ([Ande75]).

sin_3([a, inverse])

Fourier sine transform pair sin_3 ([Ande75]).

cos_1([a, inverse])

Fourier cosine transform pair cos_1 ([Ande75]).

cos_2([a, inverse])

Fourier cosine transform pair cos_2 ([Ande75]).

cos_3([a, inverse])

Fourier cosine transform pair cos_3 ([Ande75]).

empy_hankel(ftype, zsrc, zrec, res, freqtime)

Numerical transform pair with empymod.


Ghosh(name, lhs, rhs)

Simple Class for Theoretical Transform Pairs.