dct#
- scipy.fft.dct(x, type=2, n=None, axis=-1, norm=None, overwrite_x=False, workers=None, orthogonalize=None)[source]#
返回任意類型序列 x 的離散餘弦轉換。
- 參數:
- xarray_like
輸入陣列。
- type{1, 2, 3, 4}, optional
DCT 的類型(請參閱 Notes)。預設類型為 2。
- nint, optional
轉換的長度。如果
n < x.shape[axis]
,則會截斷 x。如果n > x.shape[axis]
,則會對 x 進行零填充。預設結果為n = x.shape[axis]
。- axisint, optional
計算 dct 的軸;預設值為最後一個軸(即
axis=-1
)。- norm{“backward”, “ortho”, “forward”}, optional
正規化模式(請參閱 Notes)。預設值為 “backward”。
- overwrite_xbool, optional
如果為 True,則可以破壞 x 的內容;預設值為 False。
- workersint, optional
用於平行計算的最大工作進程數。如果為負數,則該值會從
os.cpu_count()
環繞。有關更多詳細資訊,請參閱fft
。- orthogonalizebool, optional
是否使用正交化 DCT 變體(請參閱 Notes)。當
norm="ortho"
時,預設值為True
,否則為False
。在 1.8.0 版本中新增。
- 返回:
- yndarray of real
轉換後的輸入陣列。
另請參閱
idct
反 DCT
Notes
對於單維陣列
x
,dct(x, norm='ortho')
等於 MATLABdct(x)
。警告
對於
type in {1, 2, 3}
,norm="ortho"
會破壞與直接傅立葉轉換的直接對應關係。若要恢復它,您必須指定orthogonalize=False
。對於
norm="ortho"
,dct
和idct
在兩個方向上都按相同的整體因子縮放。依預設,轉換也會正交化,對於類型 1、2 和 3,這表示修改轉換定義以給出 DCT 矩陣的正交性(請參閱下文)。對於
norm="backward"
,dct
上沒有縮放,而idct
按1/N
縮放,其中N
是 DCT 的「邏輯」大小。對於norm="forward"
,1/N
正規化會應用於正向dct
,而idct
則未正規化。理論上有 8 種 DCT 類型,SciPy 中僅實作了前 4 種。「The」DCT 通常指的是 DCT 類型 2,而「the」反 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} \right)\]如果
orthogonalize=True
,則x[0]
和x[N-1]
乘以縮放因子 \(\sqrt{2}\),且y[0]
和y[N-1]
除以 \(\sqrt{2}\)。當與norm="ortho"
結合使用時,這會使對應的係數矩陣成為正交矩陣 (O @ O.T = np.eye(N)
)。注意
DCT-I 僅支援輸入大小 > 1。
類型 II
DCT-II 有幾種定義;我們使用以下定義(對於
norm="backward"
)\[y_k = 2 \sum_{n=0}^{N-1} x_n \cos\left(\frac{\pi k(2n+1)}{2N} \right)\]如果
orthogonalize=True
,則y[0]
除以 \(\sqrt{2}\),當與norm="ortho"
結合使用時,這會使對應的係數矩陣成為正交矩陣 (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)\]如果
orthogonalize=True
,則x[0]
項乘以 \(\sqrt{2}\),當與norm="ortho"
結合使用時,這會使對應的係數矩陣成為正交矩陣 (O @ O.T = np.eye(N)
)。(未正規化的)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)\]orthogonalize
在此處沒有任何作用,因為 DCT-IV 矩陣在縮放因子2N
內已經是正交的。參考文獻
[1]‘一維和二維快速餘弦轉換’,J. Makhoul 著,IEEE Transactions on acoustics, speech and signal processing vol. 28(1), pp. 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 >>> import numpy as np >>> 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.])