scipy.fftpack.

dct#

scipy.fftpack.dct(x, type=2, n=None, axis=-1, norm=None, overwrite_x=False)[Quelle]#

Gibt die diskrete Cosinus-Transformation einer Sequenz beliebigen Typs x zurück.

Parameter:
xarray_like

Das Eingabearray.

type{1, 2, 3, 4}, optional

Typ der DCT (siehe Hinweise). Der Standardtyp ist 2.

nint, optional

Länge der Transformation. Wenn n < x.shape[axis], wird x abgeschnitten. Wenn n > x.shape[axis], wird x mit Nullen aufgefüllt. Die Standardeinstellung ergibt n = x.shape[axis].

axisint, optional

Achse, entlang der die DCT berechnet wird; der Standardwert ist die letzte Achse (d.h. axis=-1).

norm{None, ‘ortho’}, optional

Normalisierungsmodus (siehe Hinweise). Standard ist None.

overwrite_xbool, optional

Wenn True, kann der Inhalt von x zerstört werden; die Standardeinstellung ist False.

Rückgabe:
yndarray von reellen Zahlen

Das transformierte Eingabearray.

Siehe auch

idct

Inverse DCT

Hinweise

Für ein eindimensionales Array x gilt: dct(x, norm='ortho') ist gleich dem MATLAB-Befehl dct(x).

Es gibt theoretisch 8 Arten der DCT, nur die ersten 4 Typen sind in SciPy implementiert. „Die“ DCT bezieht sich im Allgemeinen auf DCT-Typ 2, und „die“ inverse DCT bezieht sich im Allgemeinen auf DCT-Typ 3.

Typ I

Es gibt mehrere Definitionen der DCT-I; wir verwenden die folgende (für 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} \right)\]

Wenn norm='ortho', werden x[0] und x[N-1] mit einem Skalierungsfaktor von \(\sqrt{2}\) multipliziert, und y[k] wird mit einem Skalierungsfaktor f multipliziert.

\[\begin{split}f = \begin{cases} \frac{1}{2}\sqrt{\frac{1}{N-1}} & \text{falls }k=0\text{ oder }N-1, \\ \frac{1}{2}\sqrt{\frac{2}{N-1}} & \text{sonst} \end{cases}\end{split}\]

Hinzugefügt in Version 1.2.0: Orthonormalisierung in DCT-I.

Hinweis

Die DCT-I wird nur für Eingabegrößen > 1 unterstützt.

Typ II

Es gibt mehrere Definitionen der DCT-II; wir verwenden die folgende (für norm=None)

\[y_k = 2 \sum_{n=0}^{N-1} x_n \cos\left(\frac{\pi k(2n+1)}{2N} \right)\]

Wenn norm='ortho', wird y[k] mit einem Skalierungsfaktor f multipliziert.

\[\begin{split}f = \begin{cases} \sqrt{\frac{1}{4N}} & \text{falls }k=0, \\ \sqrt{\frac{1}{2N}} & \text{sonst} \end{cases}\end{split}\]

Dies macht die entsprechende Matrix der Koeffizienten orthonormal (O @ O.T = np.eye(N)).

Typ III

Es gibt mehrere Definitionen, wir verwenden die folgende (für norm=None)

\[y_k = x_0 + 2 \sum_{n=1}^{N-1} x_n \cos\left(\frac{\pi(2k+1)n}{2N}\right)\]

oder für norm='ortho'

\[y_k = \frac{x_0}{\sqrt{N}} + \sqrt{\frac{2}{N}} \sum_{n=1}^{N-1} x_n \cos\left(\frac{\pi(2k+1)n}{2N}\right)\]

Die (nicht normierte) DCT-III ist die Inverse der (nicht normierten) DCT-II, bis auf einen Faktor 2N. Die orthonormalisierte DCT-III ist exakt die Inverse der orthonormalisierten DCT-II.

Typ IV

Es gibt mehrere Definitionen der DCT-IV; wir verwenden die folgende (für norm=None)

\[y_k = 2 \sum_{n=0}^{N-1} x_n \cos\left(\frac{\pi(2k+1)(2n+1)}{4N} \right)\]

Wenn norm='ortho', wird y[k] mit einem Skalierungsfaktor f multipliziert.

\[f = \frac{1}{\sqrt{2N}}\]

Hinzugefügt in Version 1.2.0: Unterstützung für DCT-IV.

Referenzen

[1]

„A Fast Cosine Transform in One and Two Dimensions“, von J. Makhoul, IEEE Transactions on acoustics, speech and signal processing Bd. 28(1), S. 27-34, DOI:10.1109/TASSP.1980.1163351 (1980).

[2]

Wikipedia, „Discrete cosine transform“, https://en.wikipedia.org/wiki/Discrete_cosine_transform

Beispiele

Die DCT vom Typ 1 ist äquivalent zur FFT (wenn auch schneller) für reelle, gerade-symmetrische Eingaben. Die Ausgabe ist ebenfalls reell und gerade-symmetrisch. Die Hälfte der FFT-Eingabe wird verwendet, um die Hälfte der FFT-Ausgabe zu generieren.

>>> from scipy.fftpack 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.])