pylops.signalprocessing.FFT2D¶

pylops.signalprocessing.
FFT2D
(dims, dirs=(0, 1), nffts=None, sampling=1.0, norm='ortho', real=False, ifftshift_before=False, fftshift_after=False, dtype='complex128', engine='numpy')[source]¶ Two dimensional FastFourier Transform.
Apply two dimensional FastFourier Transform (FFT) to any pair of axes of a multidimensional array depending on the choice of
dirs
.Using the default NumPy engine, the FFT operator is an overload to either the NumPy
numpy.fft.fft2
(ornumpy.fft.rfft2
for real models) in forward mode, and tonumpy.fft.ifft2
(ornumpy.fft.irfft2
for real models) in adjoint mode, or their CuPy equivalents. Alternatively, when the SciPy engine is chosen, the overloads are ofscipy.fft.fft2
(orscipy.fft.rfft2
for real models) in forward mode, and toscipy.fft.ifft2
(orscipy.fft.irfft2
for real models) in adjoint mode.When using
real=True
, the result of the forward is also multiplied by \(\sqrt{2}\) for all frequency bins except zero and Nyquist, and the input of the adjoint is multiplied by \(1 / \sqrt{2}\) for the same frequencies.For a real valued input signal, it is advised to use the flag
real=True
as it stores the values of the Fourier transform of the last direction at positive frequencies only as values at negative frequencies are simply their complex conjugates.Parameters:  dims :
tuple
Number of samples for each dimension
 dirs :
tuple
, optional Pair of directions along which FFT2D is applied
 nffts :
tuple
orint
, optional Number of samples in Fourier Transform for each direction. In case only one dimension needs to be specified, use
None
for the other dimension in the tuple. The direction with None will usedims[dir]
asnfft
. When supplying a tuple, the order must agree with that ofdirs
. When a single value is passed, it will be used for both directions. As such the default is equivalent tonffts=(None, None)
. sampling :
tuple
orfloat
, optional Sampling steps for each direction. When supplied a single value, it is used for both directions. Unlike
nffts
, anyNone
will not be converted to the default value. norm : {“ortho”, “none”, “1/n”}, optional
New in version 1.17.0.
 “ortho”: Scales forward and adjoint FFT transforms with \(1/\sqrt{N_F}\),
where \(N_F\) is the number of samples in the Fourier domain given by
product of all elements of
nffts
.  “none”: Does not scale the forward or the adjoint FFT transforms.
 “1/n”: Scales both the forward and adjoint FFT transforms by \(1/N_F\).
Note
For “none” and “1/n”, the operator is not unitary, that is, the adjoint is not the inverse. To invert the operator, simply use
Op \ y
. “ortho”: Scales forward and adjoint FFT transforms with \(1/\sqrt{N_F}\),
where \(N_F\) is the number of samples in the Fourier domain given by
product of all elements of
 real :
bool
, optional Model to which fft is applied has real numbers (
True
) or not (False
). Used to enforce that the output of adjoint of a real model is real. Note that the real FFT is applied only to the first dimension to which the FFT2D operator is applied (last element ofdirs
) ifftshift_before :
tuple
orbool
, optional Apply ifftshift (
True
) or not (False
) to model vector (before FFT). Consider using this option when the model vector’s respective axis is symmetric with respect to the zero value sample. This will shift the zero value sample to coincide with the zero index sample. With such an arrangement, FFT will not introduce a sampledependent phaseshift when compared to the continuous Fourier Transform. When passing a single value, the shift will the same for every direction. Pass a tuple to specify which dimensions are shifted. fftshift_after :
tuple
orbool
, optional Apply fftshift (
True
) or not (False
) to data vector (after FFT). Consider using this option when you require frequencies to be arranged naturally, from negative to positive. When not applying fftshift after FFT, frequencies are arranged from zero to largest positive, and then from negative Nyquist to the frequency bin before zero. When passing a single value, the shift will the same for every direction. Pass a tuple to specify which dimensions are shifted. engine :
str
, optional New in version 1.17.0.
Engine used for fft computation (
numpy
orscipy
). dtype :
str
, optional Type of elements in input array. Note that the
dtype
of the operator is the corresponding complex type even when a real type is provided. In addition, note that the NumPy backend does not support returningdtype
different thancomplex128
. As such, when using the NumPy backend, arrays will be forcecasted to types corresponding to the supplieddtype
. The SciPy backend supports all precisions natively. Under both backends, when a realdtype
is supplied, a real result will be enforced on the result of thermatvec
and the input of thematvec
.
Raises:  ValueError
 If
dims
has less than two elements.  If
dirs
does not have exactly two elements.  If
nffts
orsampling
are not either a single value or a tuple with two elements.  If
norm
is not one of “ortho”, “none”, or “1/n”.
 If
 NotImplementedError
If
engine
is neithernumpy
, norscipy
.
Notes
The FFT2D operator (using
norm="ortho"
) applies the twodimensional forward Fourier transform to a signal \(d(y, x)\) in forward mode:\[D(k_y, k_x) = \mathscr{F} (d) = \frac{1}{\sqrt{N_F}} \iint\limits_{\infty}^\infty d(y, x) e^{j2\pi k_yy} e^{j2\pi k_xx} \,\mathrm{d}y \,\mathrm{d}x\]Similarly, the twodimensional inverse Fourier transform is applied to the Fourier spectrum \(D(k_y, k_x)\) in adjoint mode:
\[d(y,x) = \mathscr{F}^{1} (D) = \frac{1}{\sqrt{N_F}} \iint\limits_{\infty}^\infty D(k_y, k_x) e^{j2\pi k_yy} e^{j2\pi k_xx} \,\mathrm{d}k_y \,\mathrm{d}k_x\]where \(N_F\) is the number of samples in the Fourier domain given by the product of the element of
nffts
. Both operators are effectively discretized and solved by a fast iterative algorithm known as Fast Fourier Transform. Note that the FFT2D operator (usingnorm="ortho"
) is a special operator in that the adjoint is also the inverse of the forward mode. For other norms, this does not hold (seenorm
help). However, for any norm, the 2D Fourier transform is Hermitian for real input signals.Attributes:  dims_fft :
tuple
Shape of the array after the forward, but before linearization.
For example,
y_reshaped = (Op * x.ravel()).reshape(Op.dims_fft)
. f1 :
numpy.ndarray
Discrete Fourier Transform sample frequencies along
dir[0]
 f2 :
numpy.ndarray
Discrete Fourier Transform sample frequencies along
dir[1]
 real :
bool
When
True
, usesrfft2
/irfft2
 rdtype :
bool
Expected input type to the forward
 cdtype :
bool
Output type of the forward. Complex equivalent to
rdtype
. shape :
tuple
Operator shape
 clinear :
bool
New in version 1.17.0.
Operator is complexlinear. Is false when either
real=True
or whendtype
is not a complex type. explicit :
bool
Operator contains a matrix that can be solved explicitly (
True
) or not (False
)
 dims :