scipy.fft.

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

對於單維陣列 xdct(x, norm='ortho') 等於 MATLAB dct(x)

警告

對於 type in {1, 2, 3}norm="ortho" 會破壞與直接傅立葉轉換的直接對應關係。若要恢復它,您必須指定 orthogonalize=False

對於 norm="ortho"dctidct 在兩個方向上都按相同的整體因子縮放。依預設,轉換也會正交化,對於類型 1、2 和 3,這表示修改轉換定義以給出 DCT 矩陣的正交性(請參閱下文)。

對於 norm="backward"dct 上沒有縮放,而 idct1/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.])