It’s well known that an point DCT-4 can be computed using an point complex FFT. Although the algorithm is widespread, the texts which I have read on the subject have not provided the details as to how it works. I’ve been trying to understand this for a while (I tend not to use algorithms until I understand them) and finally figured it out and thought I would share (please provide comments/links if you can find a better or shorter explanation – this is as good as I could get).
Start with the definition:
Trig functions are hard to manipulate in expressions (for me anyway), so knowing that is real, we change the into a complex exponential and obtain the following:
It is worth noting that the sign of the exponent is irrelevant.
We then split the expression up to operate over two half-length sequences composed of and . The second sequence is reversed and decimated because when the is replaced by in the term of the exponential, the expression is negated rather than the offset being modified. We move the term into another exponential which becomes trivial as cancels the denominator. i.e.:
The exponentials still contain no term which resembles an DFT (over length anyway). To get one, we break up into the terms and . Again we choose to reverse the second sequence because it will keep the exponential terms in a similar but negated form.
Now because we are only interested in the real terms, we can ignore or conjugate anything which contributes to the imaginary term of the above expressions. This means that we can conjugate the exponentials when they are only modulating a real term. Doing this, we obtain:
Almost there, but to obtain the full benefit we need the inner terms to be the same. If we now multiply the term by , we get:
Done. If we expand out the and terms completely we get:
Which give us the steps for a DFT based DCT-4 algorithm:
- Transform the point real sequence into the point complex sequence .
- Multiply each element of the sequence by .
- Find , the DFT of the sequence .
- Multiply each element of by .
- The DCT-4 outputs are given by: