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
注意事项
对于一维数组
x
,dct(x, norm='ortho')
等于MATLABdct(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.])