scipy.fft.dct¶

scipy.fft.
dct
(x, type=2, n=None, axis=1, norm=None, overwrite_x=False, workers=None)[source]¶ Return the Discrete Cosine Transform of arbitrary type sequence x.
 Parameters
 xarray_like
The input array.
 type{1, 2, 3, 4}, optional
Type of the DCT (see Notes). Default type is 2.
 nint, optional
Length of the transform. If
n < x.shape[axis]
, x is truncated. Ifn > x.shape[axis]
, x is zeropadded. The default results inn = x.shape[axis]
. axisint, optional
Axis along which the dct is computed; the default is over the last axis (i.e.,
axis=1
). norm{None, ‘ortho’}, optional
Normalization mode (see Notes). Default is None.
 overwrite_xbool, optional
If True, the contents of x can be destroyed; the default is False.
 workersint, optional
Maximum number of workers to use for parallel computation. If negative, the value wraps around from
os.cpu_count()
. Seefft
for more details.
 Returns
 yndarray of real
The transformed input array.
See also
idct
Inverse DCT
Notes
For a single dimension array
x
,dct(x, norm='ortho')
is equal to MATLABdct(x)
.For
norm=None
, there is no scaling ondct
and theidct
is scaled by1/N
whereN
is the “logical” size of the DCT. Fornorm='ortho'
both directions are scaled by the same factor1/sqrt(N)
.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 DCTI; we use the following (for
norm=None
)\[y_k = x_0 + (1)^k x_{N1} + 2 \sum_{n=1}^{N2} x_n \cos\left( \frac{\pi k n}{N1} \right)\]If
norm='ortho'
,x[0]
andx[N1]
are multiplied by a scaling factor of \(\sqrt{2}\), andy[k]
is multiplied by a scaling factorf
\[\begin{split}f = \begin{cases} \frac{1}{2}\sqrt{\frac{1}{N1}} & \text{if }k=0\text{ or }N1, \\ \frac{1}{2}\sqrt{\frac{2}{N1}} & \text{otherwise} \end{cases}\end{split}\]Note
The DCTI is only supported for input size > 1.
Type II
There are several definitions of the DCTII; we use the following (for
norm=None
)\[y_k = 2 \sum_{n=0}^{N1} x_n \cos\left(\frac{\pi k(2n+1)}{2N} \right)\]If
norm='ortho'
,y[k]
is multiplied by a scaling factorf
\[\begin{split}f = \begin{cases} \sqrt{\frac{1}{4N}} & \text{if }k=0, \\ \sqrt{\frac{1}{2N}} & \text{otherwise} \end{cases}\end{split}\]which 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=None
)\[y_k = x_0 + 2 \sum_{n=1}^{N1} x_n \cos\left(\frac{\pi(2k+1)n}{2N}\right)\]or, for
norm='ortho'
\[y_k = \frac{x_0}{\sqrt{N}} + \sqrt{\frac{2}{N}} \sum_{n=1}^{N1} x_n \cos\left(\frac{\pi(2k+1)n}{2N}\right)\]The (unnormalized) DCTIII is the inverse of the (unnormalized) DCTII, up to a factor 2N. The orthonormalized DCTIII is exactly the inverse of the orthonormalized DCTII.
Type IV
There are several definitions of the DCTIV; we use the following (for
norm=None
)\[y_k = 2 \sum_{n=0}^{N1} x_n \cos\left(\frac{\pi(2k+1)(2n+1)}{4N} \right)\]If
norm='ortho'
,y[k]
is multiplied by a scaling factorf
\[f = \frac{1}{\sqrt{2N}}\]References
 1
‘A Fast Cosine Transform in One and Two Dimensions’, by J. Makhoul, IEEE Transactions on acoustics, speech and signal processing vol. 28(1), pp. 2734, DOI:10.1109/TASSP.1980.1163351 (1980).
 2
Wikipedia, “Discrete cosine transform”, https://en.wikipedia.org/wiki/Discrete_cosine_transform
Examples
The Type 1 DCT is equivalent to the FFT (though faster) for real, evensymmetrical inputs. The output is also real and evensymmetrical. Half of the FFT input is used to generate half of the FFT output:
>>> from scipy.fft import fft, dct >>> fft(np.array([4., 3., 5., 10., 5., 3.])).real array([ 30., 8., 6., 2., 6., 8.]) >>> dct(np.array([4., 3., 5., 10.]), 1) array([ 30., 8., 6., 2.])