DCT变换矩阵生成算法

DFT到DCT的推导过程

最终得到 \(\begin{array}{c}{ {\hat{\mathbf{x}}[n] = a[n] \sum_{m=0}^{N-1} x[m] \cos \left(\frac{\pi}{N}\left(m+\frac{1}{2}\right) n\right)}\\ a[n]=\left\{\begin{array}{ll}{\sqrt{1 / N},} & {n=0} \\ {\sqrt{2 / N},} & {n=1,2 \ldots N-1}\end{array}\right.} \end{array}\)

生成变换矩阵

\[x[m]=\sum_{n=0}^{N-1} X[n] c[m, n]=\sum_{n=0}^{N-1} a[n] X[n] \cos \left(\frac{(2 m+1) n \pi}{2 N}\right)=\sum_{n=0}^{N-1} X[n] c[n, m] \quad(m=0, \cdots, N-1)\]

有: \(c[n, m]=a[n] \cos (\frac{(2 m+1) n \pi}{2N})\)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/**DCT 中N个采样数据的变换矩阵的生成算法*/
#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1.0);

double C[1000][1000];
int main(){
    int N;
    cin >> N;
    for(int n=0; n<N; n++) for(int m=0; m<N; m++)
        C[n][m] = ((n==0 ? sqrt(1.0/N) : sqrt(2.0/N))*cos((2.0*m+1.0)*PI*n/2.0/N));
    for(int n=0; n<N; n++) for(int m=0; m<N; m++)
        printf("%.2f%c", C[n][m], " \n"[m==N-1]);
}

参考

Definition of DCT

# 使用单$作为行内数学公式分界符