| 2074 | http://www.ece.utexas.edu/~bevans/courses/ee381k/lectures/09_DCT/lecture9/: |
| 2075 | */ |
| 2076 | template<typename T> static void |
| 2077 | DCT( const T* src, int src_step, T* dft_src, T* dft_dst, T* dst, int dst_step, |
| 2078 | int n, int nf, int* factors, const int* itab, const Complex<T>* dft_wave, |
| 2079 | const Complex<T>* dct_wave, const void* spec, Complex<T>* buf ) |
| 2080 | { |
| 2081 | static const T sin_45 = (T)0.70710678118654752440084436210485; |
| 2082 | int j, n2 = n >> 1; |
| 2083 | |
| 2084 | src_step /= sizeof(src[0]); |
| 2085 | dst_step /= sizeof(dst[0]); |
| 2086 | T* dst1 = dst + (n-1)*dst_step; |
| 2087 | |
| 2088 | if( n == 1 ) |
| 2089 | { |
| 2090 | dst[0] = src[0]; |
| 2091 | return; |
| 2092 | } |
| 2093 | |
| 2094 | for( j = 0; j < n2; j++, src += src_step*2 ) |
| 2095 | { |
| 2096 | dft_src[j] = src[0]; |
| 2097 | dft_src[n-j-1] = src[src_step]; |
| 2098 | } |
| 2099 | |
| 2100 | RealDFT( dft_src, dft_dst, n, nf, factors, |
| 2101 | itab, dft_wave, n, spec, buf, 0, 1.0 ); |
| 2102 | src = dft_dst; |
| 2103 | |
| 2104 | dst[0] = (T)(src[0]*dct_wave->re*sin_45); |
| 2105 | dst += dst_step; |
| 2106 | for( j = 1, dct_wave++; j < n2; j++, dct_wave++, |
| 2107 | dst += dst_step, dst1 -= dst_step ) |
| 2108 | { |
| 2109 | T t0 = dct_wave->re*src[j*2-1] - dct_wave->im*src[j*2]; |
| 2110 | T t1 = -dct_wave->im*src[j*2-1] - dct_wave->re*src[j*2]; |
| 2111 | dst[0] = t0; |
| 2112 | dst1[0] = t1; |
| 2113 | } |
| 2114 | |
| 2115 | dst[0] = src[n-1]*dct_wave->re; |
| 2116 | } |
| 2117 | |
| 2118 | |
| 2119 | template<typename T> static void |