scipy.fft.dct

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

返回任意类型序列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{“向后”,“正向”,“向前”},选填

规格化模式(请参见注释)。默认值为“向后”。

overwrite_x布尔值,可选

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

workers整型,可选

用于并行计算的最大工作进程数。如果为负值,则值从 os.cpu_count() 。看见 fft 了解更多详细信息。

退货
y真实的ndarray

转换后的输入数组。

参见

idct

逆DCT

注意事项

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

norm="backward" ,没有任何扩展 dct 以及 idct 按以下比例进行缩放 1/N 哪里 N 是DCT的“逻辑”大小。为 norm="forward" 这个 1/N 将归一化应用于正向 dct 取而代之的是和 idct 是不规范的。为 norm='ortho' 这两个方向都按相同的因子进行缩放 1/sqrt(N)

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

第I类

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

\[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时才支持DCT-I。

类型II

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

\[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="backward" )

\[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="backward" )

\[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

“一维和二维的快速余弦变换”(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.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.])