函数原型: scipy.fftpack.dct (x,type=2,n=None,axis=-1,norm=None,overwrite_x=False)
返回任意类型序列x的离散余弦变换。
-
参数:
x: array_like
输入的序列、矩阵
type:可选参数
可以是{1,2,3,4},默认为2;是DCT的类型参数(参阅注释)
n:int,可选参数
DCT的长度,如果n <x.shape [axis],则x被截断。 如果n> x.shape [axis],则x补零。 默认结果为n = x.shape [axis]。
axis: int,可选参数
计算dct的轴; 默认值位于最后一个轴上(即axis = -1)。
norm:{None, ‘ortho’},可选参数
规范化模式(参阅注释),默认为无。
overwrite_x:bool,可选参数
如果为True,则x的内容可以被销毁; 默认值为False。
-
返回:
y:实数数组
输入序列转换后的数组。
-
注释
对于一维数组x,
dct(x,norm ='ortho')
等于MATLABdct(x)
。理论上,DCT有8种类型,只有前4种类型可以实现。 "the"DCT通常是指DCT类型2,而“ the” Inverse DCT通常是指DCT类型3。
-
类型1
类型1有几种定义。 我们使用以下内容(对于norm = None):
N-2 y[k] = x[0] + (-1)**k x[N-1] + 2 * sum x[n]*cos(pi*k*n/(N-1)) n=1
如果norm =‘ortho’,则将x [0]和x [N-1]乘以sqrt(2)的比例因子,并将y [k]乘以比例因子f:
f = 0.5*sqrt(1/(N-1)) if k = 0 or N-1, f = 0.5*sqrt(2/(N-1)) otherwise.
注意:仅当输入大小 > 1时,类型1才可以用。
-
类型2
类型2有几种定义,我们使用以下内容(对于norm = None):
N-1 y[k] = 2* sum x[n]*cos(pi*k*(2n+1)/(2*N)), 0 <= k < N. n=0
如果norm =‘ortho’,则将y [k]乘以缩放因子f:
f = sqrt(1/(4*N)) if k = 0, f = sqrt(1/(2*N)) otherwise.
这使得相应的系数矩阵正交。
-
类型3
类型3有几种定义,我们使用以下内容(对于norm = None):
N-1 y[k] = x[0] + 2 * sum x[n]*cos(pi*(k+0.5)*n/N), 0 <= k < N. n=1
或者,对于norm ='ortho’且0 <= k <N:
N-1 y[k] = x[0] / sqrt(N) + sqrt(2/N) * sum x[n]*cos(pi*(k+0.5)*n/N) n=1
(未归一化的)DCT-III是(未归一化的)DCT-II的倒数,最大为2N;正交规范化的DCT-III恰好是正交规范化的DCT-II的逆。
-
类型4
类型4有几种定义,我们使用以下内容(对于norm = None):
N-1 y[k] = 2* sum x[n]*cos(pi*(2k+1)*(2n+1)/(4*N)), 0 <= k < N. n=0
如果norm =‘ortho’,则将y [k]乘以缩放因子f:
f = 0.5*sqrt(2/N)
-
-
举例
对于实数,偶对称的输入,类型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.])