| @cindex discrete Hankel transforms |
| @cindex Hankel transforms, discrete |
| @cindex transforms, Hankel |
| This chapter describes functions for performing Discrete Hankel |
| Transforms (DHTs). The functions are declared in the header file |
| @file{gsl_dht.h}. |
| |
| @menu |
| * Discrete Hankel Transform Definition:: |
| * Discrete Hankel Transform Functions:: |
| * Discrete Hankel Transform References:: |
| @end menu |
| |
| @node Discrete Hankel Transform Definition |
| @section Definitions |
| |
| The discrete Hankel transform acts on a vector of sampled data, where |
| the samples are assumed to have been taken at points related to the |
| zeroes of a Bessel function of fixed order; compare this to the case of |
| the discrete Fourier transform, where samples are taken at points |
| related to the zeroes of the sine or cosine function. |
| |
| Specifically, let @math{f(t)} be a function on the unit interval. |
| Then the finite @math{\nu}-Hankel transform of @math{f(t)} is defined |
| to be the set of numbers @math{g_m} given by, |
| @tex |
| \beforedisplay |
| $$ |
| g_m = \int_0^1 t dt\, J_\nu(j_{\nu,m}t) f(t), |
| $$ |
| \afterdisplay |
| @end tex |
| @ifinfo |
| @example |
| g_m = \int_0^1 t dt J_\nu(j_(\nu,m)t) f(t), |
| @end example |
| |
| @end ifinfo |
| @noindent |
| so that, |
| @tex |
| \beforedisplay |
| $$ |
| f(t) = \sum_{m=1}^\infty {{2 J_\nu(j_{\nu,m}x)}\over{J_{\nu+1}(j_{\nu,m})^2}} g_m. |
| $$ |
| \afterdisplay |
| @end tex |
| @ifinfo |
| @example |
| f(t) = \sum_@{m=1@}^\infty (2 J_\nu(j_(\nu,m)x) / J_(\nu+1)(j_(\nu,m))^2) g_m. |
| @end example |
| |
| @end ifinfo |
| @noindent |
| Suppose that @math{f} is band-limited in the sense that |
| @math{g_m=0} for @math{m > M}. Then we have the following |
| fundamental sampling theorem. |
| @tex |
| \beforedisplay |
| $$ |
| g_m = {{2}\over{j_{\nu,M}^2}} |
| \sum_{k=1}^{M-1} f\left({{j_{\nu,k}}\over{j_{\nu,M}}}\right) |
| {{J_\nu(j_{\nu,m} j_{\nu,k} / j_{\nu,M})}\over{J_{\nu+1}(j_{\nu,k})^2}}. |
| $$ |
| \afterdisplay |
| @end tex |
| @ifinfo |
| @example |
| g_m = (2 / j_(\nu,M)^2) |
| \sum_@{k=1@}^@{M-1@} f(j_(\nu,k)/j_(\nu,M)) |
| (J_\nu(j_(\nu,m) j_(\nu,k) / j_(\nu,M)) / J_(\nu+1)(j_(\nu,k))^2). |
| @end example |
| |
| @end ifinfo |
| @noindent |
| It is this discrete expression which defines the discrete Hankel |
| transform. The kernel in the summation above defines the matrix of the |
| @math{\nu}-Hankel transform of size @math{M-1}. The coefficients of |
| this matrix, being dependent on @math{\nu} and @math{M}, must be |
| precomputed and stored; the @code{gsl_dht} object encapsulates this |
| data. The allocation function @code{gsl_dht_alloc} returns a |
| @code{gsl_dht} object which must be properly initialized with |
| @code{gsl_dht_init} before it can be used to perform transforms on data |
| sample vectors, for fixed @math{\nu} and @math{M}, using the |
| @code{gsl_dht_apply} function. The implementation allows a scaling of |
| the fundamental interval, for convenience, so that one can assume the |
| function is defined on the interval @math{[0,X]}, rather than the unit |
| interval. |
| |
| Notice that by assumption @math{f(t)} vanishes at the endpoints |
| of the interval, consistent with the inversion formula |
| and the sampling formula given above. Therefore, this transform |
| corresponds to an orthogonal expansion in eigenfunctions |
| of the Dirichlet problem for the Bessel differential equation. |
| |
| |
| @node Discrete Hankel Transform Functions |
| @section Functions |
| |
| @deftypefun {gsl_dht *} gsl_dht_alloc (size_t @var{size}) |
| This function allocates a Discrete Hankel transform object of size |
| @var{size}. |
| @end deftypefun |
| |
| @deftypefun int gsl_dht_init (gsl_dht * @var{t}, double @var{nu}, double @var{xmax}) |
| This function initializes the transform @var{t} for the given values of |
| @var{nu} and @var{x}. |
| @end deftypefun |
| |
| @deftypefun {gsl_dht *} gsl_dht_new (size_t @var{size}, double @var{nu}, double @var{xmax}) |
| This function allocates a Discrete Hankel transform object of size |
| @var{size} and initializes it for the given values of @var{nu} and |
| @var{x}. |
| @end deftypefun |
| |
| @deftypefun void gsl_dht_free (gsl_dht * @var{t}) |
| This function frees the transform @var{t}. |
| @end deftypefun |
| |
| @deftypefun int gsl_dht_apply (const gsl_dht * @var{t}, double * @var{f_in}, double * @var{f_out}) |
| This function applies the transform @var{t} to the array @var{f_in} |
| whose size is equal to the size of the transform. The result is stored |
| in the array @var{f_out} which must be of the same length. |
| @end deftypefun |
| |
| @deftypefun double gsl_dht_x_sample (const gsl_dht * @var{t}, int @var{n}) |
| This function returns the value of the @var{n}-th sample point in the unit interval, |
| @c{${({j_{\nu,n+1}} / {j_{\nu,M}}}) X$} |
| @math{(j_@{\nu,n+1@}/j_@{\nu,M@}) X}. These are the |
| points where the function @math{f(t)} is assumed to be sampled. |
| @end deftypefun |
| |
| @deftypefun double gsl_dht_k_sample (const gsl_dht * @var{t}, int @var{n}) |
| This function returns the value of the @var{n}-th sample point in ``k-space'', |
| @c{${{j_{\nu,n+1}} / X}$} |
| @math{j_@{\nu,n+1@}/X}. |
| @end deftypefun |
| |
| @node Discrete Hankel Transform References |
| @section References and Further Reading |
| |
| The algorithms used by these functions are described in the following papers, |
| |
| @itemize @asis |
| @item |
| H. Fisk Johnson, Comp.@: Phys.@: Comm.@: 43, 181 (1987). |
| @end itemize |
| |
| @itemize @asis |
| @item |
| D. Lemoine, J. Chem.@: Phys.@: 101, 3936 (1994). |
| @end itemize |