bundles / scipy 1.17.1 / scipy / fft / _realtransforms / dct
_Function
scipy.fft._realtransforms:dct
Signature
def dct ( x , type = 2 , n = None , axis = -1 , norm = None , overwrite_x = False , workers = None , orthogonalize = None ) Summary
Return the Discrete Cosine Transform of arbitrary type sequence x.
Parameters
x: array_likeThe input array.
type: {1, 2, 3, 4}, optionalType of the DCT (see Notes). Default type is 2.
n: int, optionalLength of the transform. If
n < x.shape[axis],xis truncated. Ifn > x.shape[axis],xis zero-padded. The default results inn = x.shape[axis].axis: int, optionalAxis along which the dct is computed; the default is over the last axis (i.e.,
axis=-1).norm: {"backward", "ortho", "forward"}, optionalNormalization mode (see Notes). Default is "backward".
overwrite_x: bool, optionalIf True, the contents of
xcan be destroyed; the default is False.workers: int, optionalMaximum number of workers to use for parallel computation. If negative, the value wraps around from
os.cpu_count(). See fft for more details.orthogonalize: bool, optionalWhether to use the orthogonalized DCT variant (see Notes). Defaults to
Truewhennorm="ortho"andFalseotherwise.
Returns
y: ndarray of realThe transformed input array.
Notes
For a single dimension array x, dct(x, norm='ortho') is equal to MATLAB dct(x).
For norm="ortho" both the dct and idct are scaled by the same overall factor in both directions. By default, the transform is also orthogonalized which for types 1, 2 and 3 means the transform definition is modified to give orthogonality of the DCT matrix (see below).
For norm="backward", there is no scaling on dct and the idct is scaled by 1/N where N is the "logical" size of the DCT. For norm="forward" the 1/N normalization is applied to the forward dct instead and the idct is unnormalized.
There are, theoretically, 8 types of the DCT, only the first 4 types are implemented in SciPy.'The' DCT generally refers to DCT type 2, and 'the' Inverse DCT generally refers to DCT type 3.
Type I
There are several definitions of the DCT-I; we use the following (for norm="backward")
If orthogonalize=True, x[0] and x[N-1] are multiplied by a scaling factor of , and y[0] and y[N-1] are divided by . When combined with norm="ortho", this makes the corresponding matrix of coefficients orthonormal (O @ O.T = np.eye(N)).
Type II
There are several definitions of the DCT-II; we use the following (for norm="backward")
If orthogonalize=True, y[0] is divided by which, when combined with norm="ortho", makes the corresponding matrix of coefficients orthonormal (O @ O.T = np.eye(N)).
Type III
There are several definitions, we use the following (for norm="backward")
If orthogonalize=True, x[0] terms are multiplied by which, when combined with norm="ortho", makes the corresponding matrix of coefficients orthonormal (O @ O.T = np.eye(N)).
The (unnormalized) DCT-III is the inverse of the (unnormalized) DCT-II, up to a factor 2N. The orthonormalized DCT-III is exactly the inverse of the orthonormalized DCT-II.
Type IV
There are several definitions of the DCT-IV; we use the following (for norm="backward")
orthogonalize has no effect here, as the DCT-IV matrix is already orthogonal up to a scale factor of 2N.
Array API Standard Support
dct has experimental support for Python Array API Standard compatible backends in addition to NumPy. Please consider testing these features by setting an environment variable SCIPY_ARRAY_API=1 and providing CuPy, PyTorch, JAX, or Dask arrays as array arguments. The following combinations of backend and device (or other capability) are supported.
==================== ==================== ==================== Library CPU GPU ==================== ==================== ==================== NumPy ✅ n/a CuPy n/a ⛔ PyTorch ✅ ⛔ JAX ⛔ ⛔ Dask ⚠️ computes graph n/a ==================== ==================== ====================
See
dev-arrayapifor more information.
Examples
The Type 1 DCT is equivalent to the FFT (though faster) for real, even-symmetrical inputs. The output is also real and even-symmetrical. Half of the FFT input is used to generate half of the FFT output:from scipy.fft import fft, dct import numpy as np✓
fft(np.array([4., 3., 5., 10., 5., 3.])).real dct(np.array([4., 3., 5., 10.]), 1)✗
See also
- idct
Inverse DCT
Aliases
-
scipy.fft.dct