1. 개요
Discrete Cosine Transform (DCT)이산 푸리에 변환(DFT)과 매우 유사한 변환이며 주로 DCT로 줄여서 부른다.
2. 공식
DCT에는 여러 방법이 존재하나 DCT-I과 DCT-II의 두 가지가 주로 사용된다.[math(\displaystyle n, k, N ∈ \mathbb{Z})]이며 [math(\displaystyle α[n] = \begin{cases} \frac{1}{2} & (n=0, N-1) \\ 1 & (1 \leq n \leq N-2) \end{cases})] 일 때, DCT-I과 그 역변환(inverse)은 각각 다음과 같이 정의된다.
DCT-I : [math(\displaystyle X[k] = 2\sum_{n=0}^{N-1} α[n] x[n] \cos\!\left\{\frac{\pi}{N-1} n k \right\} (0 \leq k \leq N-1))] |
iDCT-I : [math(\displaystyle x[n] = \frac{1}{N-1}\sum_{k=0}^{N-1} α[k] X[k] \cos\!\left\{\frac{\pi}{N-1} n k \right\} (0 \leq n \leq N-1))] |
[math(\displaystyle β[k] = \begin{cases} \frac{1}{2} & (k=0) \\ 1 & (1 \leq k \leq N-1) \end{cases})]일 때, DCT-II와 그 역변환은 다음과 같다.
DCT-II : [math(\displaystyle X[k] = 2\sum_{n=0}^{N-1} x[n] \cos\!\left\{\frac{\pi}{N} \left(n+\frac{1}{2}\right) k \right\} (0 \leq k \leq N-1))] |
iDCT-II : [math(\displaystyle x[n] = \frac{1}{N}\sum_{k=0}^{N-1} β[k] X[k] \cos\!\left\{\frac{\pi}{N} \left(n+\frac{1}{2}\right) k \right\} (0 \leq n \leq N-1))] |
참고로 [math(\displaystyle \tildeβ[k] = \begin{cases} \frac{1}{\sqrt 2} & (k=0) \\ 1 & (1 \leq k \leq N-1) \end{cases})]일 때, DCT-II와 그 역변환을 다음과 같이 정의하기도 한다.
DCT-II : [math(\displaystyle \tilde X[k] = \sqrt {\frac{2}{N}} \sum_{n=0}^{N-1} x[n] \cos\!\left\{\frac{\pi}{N} \left(n+\frac{1}{2}\right) k \right\} (0 \leq k \leq N-1))] |
iDCT-II : [math(\displaystyle x[n] = \sqrt {\frac{2}{N}} \sum_{k=0}^{N-1} \tilde β[k] \tilde X[k] \cos\!\left\{\frac{\pi}{N} \left(n+\frac{1}{2}\right) k \right\} (0 \leq n \leq N-1))] |
다음과 같이 N=32인 임의의 수열이 주어졌을 경우,
DCT-II를 거쳐 최종적으로 변환된 수열은 다음과 같이 나타난다.
만약 원본 수열을 DFT로 변환한다면, 결과는 다음과 같은 실수부와 허수부의 결합으로 나타난다.
즉 푸리에 변환과 역 푸리에 변환이 주어진 수열을 복소 지수 함수와의 일차 결합으로 표현하도록 정의된다면, DCT는 복소 지수 함수가 아닌 코사인 함수를 사용해서 주어진 길이 N의 유한한 수열을 실수 계수로 재구성하도록 정의되는 것이다.[1]
3. 유용성
위에서 보다시피 DCT, 그 중에서도 DCT-II는 변환 결과물이 항상 실수가 나오고 변환된 계수들이 낮은 인덱스에 몰려 있다는 특징이 있다. 이 특징을 응용하여, 위의 DCT-II 및 DFT 결과물에서 각각 몇 개의 계수를 0으로 만들고, 이를 다시 역변환하여 본래 수열과의 오차를 나타내면 다음과 같다.보다시피 DFT는 조금만 잘라도 원본과의 차이가 계속 늘어나지만, DCT-II는 25개까지 잘라도 오차가 크게 증가하지 않는다는 것을 알 수 있다.
이와 같이 DCT는 특정한 계수 이상의 값을 잘라내기 좋아서 오디오, 영상 등의 신호처리에서 널리 사용된다. 예를 들면 TV에는 동영상을 처리하기 위해 Inverse-DCT를 계산하는 회로가 들어 있고, JPEG의 경우 주어진 데이터를 DCT한 후 양자화를 통해 눈이 잘 인식하지 못하는 고주파 성분을 날리는 방식으로 정보량을 줄인다.
4. 기타
DCT는 수식을 바로 계산하면 계산량이 매우 많기 때문에 FFT처럼 버터플라이[2]를 적용해 연산량을 줄여서 계산할 수 있다.[1] 오일러 공식을 보면 알겠지만, 복소 지수 함수는 코사인 함수 급수와 사인 함수 급수를 모두 포함하고 있다. 사인 함수 급수는 특정 인수의 치역을 나타내는 것이므로 즉 이산 코사인 변환은 한 함수에서의 특정 인수의 정의역을 나타내는 데 특화된 변환이다.[2] 신호가 흘러가는 모습이 나비 모양과 닮았다고 해서 버터플라이라는 이름이 붙었다.