scipy.fftpack.dct

scipy.fftpack.dct(x, type=2, n=None, axis=- 1, norm=None, overwrite_x=False)[源代码]

返回任意类型序列x的离散余弦变换。

参数
xarray_like

输入数组。

type{1,2,3,4},可选

DCT的类型(请参阅备注)。默认类型为2。

n整型,可选

转换的长度。如果 n < x.shape[axis]x 被截断。如果 n > x.shape[axis]x 是零填充的。默认情况下,结果为 n = x.shape[axis]

axis整型,可选

沿其计算DCT的轴;缺省值在最后一个轴上(即, axis=-1 )。

norm{无,‘正畸’},可选

规格化模式(请参见注释)。默认值为None。

overwrite_x布尔值,可选

如果为True,则 x 可以销毁;默认值为false。

退货
y真实的ndarray

转换后的输入数组。

参见

idct

逆DCT

注意事项

对于一维数组 xdct(x, norm='ortho') 等于MATLAB dct(x)

从理论上讲,DCT有8种类型,只有前4种类型在SCIPY中实现。‘DCT’一般是指DCT类型2,而‘逆DCT’通常是指DCT类型3。

第I类

DCT-I有几种定义;我们使用以下定义(对于 norm=None )

\[y_k=x_0+(-1)^k x_{N-1}+2\sum_{n=1}^{N-2}x_n\cos\Left( \frac{\pi k n}{N-1}\右)\]

如果 norm='ortho'x[0]x[N-1] 乘以比例因子 \(\sqrt{{2}}\) ,以及 y[k] 乘以比例因子 f

\[\begin{split}F=\开始{案例} \frac{1}{2}\sqrt{\frac{1}{N-1}}&\text{if}k=0\text{or}N-1,\\ \frac{1}{2}\sqrt{\frac{2}{N-1}}&\text{否则}\end{case}\end{split}\]

1.2.0 新版功能: DCT-I中的正交化问题。

注解

仅当输入大小大于1时才支持DCT-I。

类型II

DCT-II有几种定义;我们使用以下定义(对于 norm=None )

\[y_k=2\sum_{n=0}^{N-1}x_n\cos\Left(\frac{\pi k(2n+1)}{2n}\right)\]

如果 norm='ortho'y[k] 乘以比例因子 f

\[\begin{split}F=\开始{案例} \sqrt{\frac{1}{4n}}&\text{if}k=0,\\ \sqrt{\frac{1}{2N}}&\text{否则}\end{case}\end{split}\]

这使得相应的系数矩阵正交。 (O @ O.T = np.eye(N) )。

类型III

有几种定义,我们使用以下定义(对于 norm=None )

\[y_k=x_0+2\sum_{n=1}^{N-1}x_n\cos\Left(\frac{\pi(2k+1)n}{2n}\right)\]

或者,对于 norm='ortho'

\[y_k=\frac{x_0}{\sqrt{N}}+\sqrt{\frac{2}{N}}\sum_{n=1}^{N-1}x_n \cos\左(\frac{\pi(2k+1)n}{2n}\右)\]

(非规格化的)DCT-III是(非规格化的)DCT-II的逆数,最高可达一个因子 2N 。正交规格化的DCT-III正好是正交规格化的DCT-II的逆。

第IV类

DCT-IV有几种定义;我们使用以下定义(对于 norm=None )

\[y_k=2\sum_{n=0}^{N-1}x_n\cos\Left(\frac{\pi(2k+1)(2n+1)}{4n}\right)\]

如果 norm='ortho'y[k] 乘以比例因子 f

\[F=\frac{1}{\sqrt{2N}}\]

1.2.0 新版功能: 支持DCT-IV。

参考文献

1

“一维和二维的快速余弦变换”(A Fast CoSine Transform In One And 2D),J·马克胡尔(J.Makhoul)著, IEEE Transactions on acoustics, speech and signal processing 卷。28(1),第27-34页, DOI:10.1109/TASSP.1980.1163351 (1980年)。

2

维基百科,“离散余弦变换”,https://en.wikipedia.org/wiki/Discrete_cosine_transform

示例

对于实数、偶数对称输入,类型1 DCT等同于FFT(尽管速度更快)。输出也是真实的,甚至是对称的。FFT输入的一半用于生成FFT输出的一半:

>>> from scipy.fftpack 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.])