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:
- taxis
numpy.ndarray Time axis
- hyaxis
numpy.ndarray Slow spatial axis
- hxaxis
numpy.ndarray Fast spatial axis
- pyaxis
numpy.ndarray Axis of scanning variable \(p_y\) of parametric curve
- pxaxis
numpy.ndarray Axis of scanning variable \(p_x\) of parametric curve
- nfft
int Number of samples in Fourier transform
- flims
tuple, 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)- kind
tuple, optional Curves to be used for stacking/spreading along the y- and x- axes (
("linear", "linear"),("linear", "parabolic"),("parabolic", "linear"), or("parabolic", "parabolic"))- engine
str, optional Engine used for computation (
numpyornumbaorcuda)- num_threads_per_blocks
tuple, optional Number of threads in each block (only when
engine=cuda)- dtype
str, optional Type of elements in input array.
- name
str, optional Name of operator (to be used by
pylops.utils.describe.describe)
- taxis
- Attributes:
- hyaxis
numpy.ndarray Slow spatial axis (or squared axis when
kind='parabolic')- hxaxis
numpy.ndarray Fast spatial axis (or squared axis when
kind='parabolic')- nhy
int Number of samples in slow spatial axis.
- nhx
int Number of samples in fast spatial axis.
- nt
int Number of samples in time axis.
- dhy
float Sampling step in slow spatial axis.
- dhx
float Sampling step in fast spatial axis.
- dt
float Sampling step in time axis.
- py
numpy.ndarray Axis of scanning variable \(p_y\) of parametric curve
- px
numpy.ndarray Axis of scanning variable \(p_x\) of parametric curve
- npy
int Number of samples in \(p_y\) axis.
- npx
int Number of samples in \(p_x\) axis.
- f
numpy.ndarray Fourier axis.
- nfft2
int Number of samples in positive Fourier axis.
- cdtype
str Complex type associated with
dtype.- flims
tuple Indices of lower and upper limits of Fourier axis to be used in
- num_blocks_matvec
tuple Number of blocks in each dimension for
matvec(only whenengine=cuda)- num_blocks_rmatvec
tuple Number of blocks in each dimension for
rmatvec(only whenengine=cuda)- dims
tuple Shape of the array after the adjoint, but before flattening.
For example,
x_reshaped = (Op.H * y.ravel()).reshape(Op.dims).- dimsd
tuple Shape of the array after the forward, but before flattening.
For example,
y_reshaped = (Op * x.ravel()).reshape(Op.dimsd).- shape
tuple Operator shape.
- hyaxis
- Raises:
- ValueError
If
engineis neithernumpy,numba, norcuda.- ValueError
If
kindis 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()