Diskrétní kosinová transformace
Diskrétní kosinová transformace (anglicky discrete cosine transform, zkratka DCT) je diskrétní transformace podobná diskrétní Fourierově transformaci (DFT), ale produkující pouze reálné koeficienty. Je jednou z mnoha transformací příbuzných Fourierově transformaci. Existuje 8 standardních variant DCT, z nichž 4 jsou běžně používané.
Nejběžnější varianta diskrétní kosinové transformace je DCT typu II, která je často nazývána pouze „DCT“. K ní inverzní transformace je DCT typu III, také rovněž často nazývána pouze „inverzní DCT“ nebo zkratkou „IDCT“.
Aplikace
editovatDCT je často používána při zpracování signálu a obrazu, obzvláště pro ztrátovou kompresi. Je například použita v obrazovém formátu JPEG, formátech MJPEG, MPEG a DV. Její modifikace jsou použity v audio formátech AAC, Vorbis a MP3.
Definice
editovatFormálně je DCT lineární invertovatelná funkce F : RN → RN (kde R značí množinu reálných čísel); nebo ekvivalentně čtvercová matice N × N. Existuje několik variant DCT s mírně modifikovanou definicí. N reálných čísel x0, …, xN-1 je transformováno do N reálných čísel X0, …, XN-1 podle jedné z rovnic:
DCT-I
editovatDCT-I není definována pro N < 2. (Všechny ostatní typy DCT jsou definovány pro libovolné N.)
Inverzní transformace k DCT-I je DCT-I násobená 2/(N-1).
DCT-II
editovatDCT-II je pravděpodobně nejrozšířenější forma a je často uváděna pouze jako „DCT“.
Inverzní transformace k DCT-II je DCT-III násobená 2/N.
DCT-III
editovatProtože je to inverzní transformace k DCT-II (až na „měřítko“, anglicky scale factor), je tato forma někdy uváděna pouze jako „inverzní DCT“ („IDCT“).
Inverzní transformace k DCT-III je DCT-II násobená 2/N.
DCT-IV
editovatInverzní transformace k DCT-IV je DCT-IV násobená 2/N.
DCT V-VIII
editovatTyto varianty se v praxi používají zřídka.
Vícerozměrné DCT
editovatVícerozměrná transformace (transformace vícerozměrné funkce) může být spočítána jako série jednorozměrných transformací postupně v každém rozměru. Pro 2D například nejprve po řádcích a pak po sloupcích (nebo naopak).
2D DCT-II je například dána rovnicí:
Výpočet
editovatPřestože přímá aplikace těchto rovnic může vyžadovat O(N2) operací, je možné spočítat stejnou transformaci pouze se složitostí O(N log N) použitím rychlé Fourierovy transformace (anglicky fast Fourier transform, FFT).
Příklad
editovatÚseky zdrojového kódu v jazyce C (DCT typu II a typu III):
Dopředná
editovatDopředná (anglicky forward) 1D DCT (typu II):
void fct(const double *input, double *output)
{
for(int h=0; h<LENGTH; h++)
{
double sum = 0;
for(int j=0; j<LENGTH; j++)
{
double xk = input[j];
double c = (M_PI/LENGTH)*h*(j+0.5);
sum += xk*cos(c);
}
output[h] = sum;
}
}
Zpětná
editovatZpětná (anglicky inverse) 1D DCT (typu III):
void ict(const double *input, double *output)
{
for(int h=0; h<LENGTH; h++)
{
double sum = 0;
for(int j=1; j<LENGTH; j++)
{
double xk = input[j];
double c = (M_PI/LENGTH)*j*(h+0.5);
sum += xk*cos(c);
}
sum += 0.5*input[0];
sum *= 2/(double)LENGTH;
output[h] = sum;
}
}
Související články
editovat- goniometrická funkce kosinus
- diskrétní vlnková transformace
Reference
editovatV tomto článku byl použit překlad textu z článku Discrete cosine transform na anglické Wikipedii.
Externí odkazy
editovat- Obrázky, zvuky či videa k tématu Diskrétní kosinová transformace na Wikimedia Commons
- (anglicky) DCT na serveru PlanetMath Archivováno 22. 6. 2011 na Wayback Machine.
- (anglicky) The Discrete Cosine Transform (DCT): Theory and Application Archivováno 28. 5. 2008 na Wayback Machine.
- (česky) Programujeme JPEG: diskrétní kosinová transformace (DCT) – článek o DCT na root.cz