pylops.signalprocessing.FourierRadon3D

class pylops.signalprocessing.FourierRadon3D(taxis, hyaxis, hxaxis, pyaxis, pxaxis, nfft, flims=None, kind=('linear', 'linear'), engine='numpy', num_threads_per_blocks=(2, 16, 16), dtype='float64', name='R')[source]

3D Fourier Radon transform

Apply Radon forward (and adjoint) transform using Fast Fourier Transform to a 3-dimensional array of size \([n_{p_y} \times n_{p_x} \times n_t]\) (and \([n_y \times n_x \times n_t]\)).

Note that forward and adjoint follow the same convention of the time-space implementation in pylops.signalprocessing.Radon3D.

Parameters:
taxisnumpy.ndarray

Time axis

hyaxisnumpy.ndarray

Slow spatial axis

hxaxisnumpy.ndarray

Fast spatial axis

pyaxisnumpy.ndarray

Axis of scanning variable \(p_y\) of parametric curve

pxaxisnumpy.ndarray

Axis of scanning variable \(p_x\) of parametric curve

nfftint

Number of samples in Fourier transform

flimstuple, optional

Indices of lower and upper limits of Fourier axis to be used in the application of the Radon matrix (when None, use entire axis)

kindtuple, optional

Curves to be used for stacking/spreading along the y- and x- axes (("linear", "linear"), ("linear", "parabolic"), ("parabolic", "linear"), or ("parabolic", "parabolic"))

enginestr, optional

Engine used for computation (numpy or numba or cuda)

num_threads_per_blockstuple, optional

Number of threads in each block (only when engine=cuda)

dtypestr, optional

Type of elements in input array.

namestr, optional

Name of operator (to be used by pylops.utils.describe.describe)

Attributes:
hyaxisnumpy.ndarray

Slow spatial axis (or squared axis when kind='parabolic')

hxaxisnumpy.ndarray

Fast spatial axis (or squared axis when kind='parabolic')

nhyint

Number of samples in slow spatial axis.

nhxint

Number of samples in fast spatial axis.

ntint

Number of samples in time axis.

dhyfloat

Sampling step in slow spatial axis.

dhxfloat

Sampling step in fast spatial axis.

dtfloat

Sampling step in time axis.

pynumpy.ndarray

Axis of scanning variable \(p_y\) of parametric curve

pxnumpy.ndarray

Axis of scanning variable \(p_x\) of parametric curve

npyint

Number of samples in \(p_y\) axis.

npxint

Number of samples in \(p_x\) axis.

fnumpy.ndarray

Fourier axis.

nfft2int

Number of samples in positive Fourier axis.

cdtypestr

Complex type associated with dtype.

flimstuple

Indices of lower and upper limits of Fourier axis to be used in

num_blocks_matvectuple

Number of blocks in each dimension for matvec (only when engine=cuda)

num_blocks_rmatvectuple

Number of blocks in each dimension for rmatvec (only when engine=cuda)

dimstuple

Shape of the array after the adjoint, but before flattening.

For example, x_reshaped = (Op.H * y.ravel()).reshape(Op.dims).

dimsdtuple

Shape of the array after the forward, but before flattening.

For example, y_reshaped = (Op * x.ravel()).reshape(Op.dimsd).

shapetuple

Operator shape.

Raises:
ValueError

If engine is neither numpy, numba, nor cuda.

ValueError

If kind is not a tuple of two elements.

Notes

The FourierRadon3D operator applies the Radon transform in the frequency domain. After transforming a 3-dimensional array of size \([n_y \times n_x \times n_t]\) into the frequency domain, the following linear transformation is applied to each frequency component in adjoint mode:

\[\begin{split}\begin{bmatrix} \mathbf{m}(p_{y,1}, \mathbf{p}_{x}, \omega_i) \\ \mathbf{m}(p_{y,2}, \mathbf{p}_{x}, \omega_i) \\ \vdots \\ \mathbf{m}(p_{y,N_{py}}, \mathbf{p}_{x}, \omega_i) \end{bmatrix} = \begin{bmatrix} e^{-j \omega_i (p_{y,1} y^l_1 + \mathbf{p}_x \cdot \mathbf{x}^l)} & e^{-j \omega_i (p_{y,1} y^l_2 + \mathbf{p}_x \cdot \mathbf{x}^l)} & \ldots & e^{-j \omega_i (p_{y,1} y^l_{N_y} + \mathbf{p}_x \cdot \mathbf{x}^l)} \\ e^{-j \omega_i (p_{y,2} y^l_1 + \mathbf{p}_x \cdot \mathbf{x}^l)} & e^{-j \omega_i (p_{y,2} y^l_2 + \mathbf{p}_x \cdot \mathbf{x}^l)} & \ldots & e^{-j \omega_i (p_{y,2} y^l_{N_y} + \mathbf{p}_x \cdot \mathbf{x}^l)} \\ \vdots & \vdots & \ddots & \vdots \\ e^{-j \omega_i (p_{y,N_{py}} y^l_1 + \mathbf{p}_x \cdot \mathbf{x}^l)} & e^{-j \omega_i (p_{y,N_{py}} y^l_2 + \mathbf{p}_x \cdot \mathbf{x}^l)} & \ldots & e^{-j \omega_i (p_{y,N_{py}} y^l_{N_y} + \mathbf{p}_x \cdot \mathbf{x}^l)} \\ \end{bmatrix} \begin{bmatrix} \mathbf{d}(y_1, \mathbf{x}, \omega_i) \\ \mathbf{d}(y_2, \mathbf{x}, \omega_i) \\ \vdots \\ \mathbf{d}(y_{N_y}, \mathbf{x}, \omega_i) \end{bmatrix}\end{split}\]

where \(\cdot\) represents the element-wise multiplication of two vectors and math:l=1,2. Similarly the forward mode is implemented by applying the transpose and complex conjugate of the above matrix to the model transformed to the Fourier domain.

Refer to [1] for more theoretical and implementation details.

[1]

Sacchi, M. “Statistical and Transform Methods for Geophysical Signal Processing”, 2007.

Methods

__init__(taxis, hyaxis, hxaxis, pyaxis, ...)

adjoint()

apply_columns(cols)

Apply subset of columns of operator

cond([uselobpcg])

Condition number of linear operator.

conj()

Complex conjugate operator

div(y[, niter, densesolver])

Solve the linear problem \(\mathbf{y}=\mathbf{A}\mathbf{x}\).

dot(x)

Matrix-matrix or matrix-vector multiplication.

eigs([neigs, symmetric, niter, uselobpcg])

Most significant eigenvalues of linear operator.

matmat(X)

Matrix-matrix multiplication.

matvec(x)

Matrix-vector multiplication.

reset_count()

Reset counters

rmatmat(X)

Matrix-matrix multiplication.

rmatvec(x)

Adjoint matrix-vector multiplication.

todense([backend])

Return dense matrix.

toimag([forw, adj])

Imag operator

toreal([forw, adj])

Real operator

tosparse()

Return sparse matrix.

trace([neval, method, backend])

Trace of linear operator.

transpose()

Examples using pylops.signalprocessing.FourierRadon3D

Fourier Radon Transform

Fourier Radon Transform