C語言實現離散餘弦變換DCT

離散餘弦變換DCT

離散餘弦變換DCT具有信號譜分量豐富、能量集中,且不需要對語音相位進行估算等優點,能在較低的運算複雜度下取得較好的語音增強效果。
X(k)=α(k)n=0N1x(n)cos[π(2n+1)k2N]X(k)=\alpha(k)\sum_{n=0}^{N-1}x(n)cos[\frac{\pi(2n+1)k}{2N}]α(k)={1/Nk=02/N1kN1\alpha(k)=\begin{cases} \sqrt{1/N}\qquad k=0 \\ \sqrt{2/N}\qquad 1\le k \le N-1 \end{cases}

matlab實現DCT運算

x=[2 3 3 2];
y = dct(x)

在這裏插入圖片描述

C語言實現DCT運算

#include<stdio.h>
#include<math.h>
#define PI 3.141593
#define N 4
int main()
{
   int k, n;
   int x[] = {2,3,3,2};
   double A, s, X[4];
   for(k = 0; k < N; k++)
   {
      s = 0;
      if(k==0)
        A = sqrt(1.0/N); //計算k=0時的係數
      else
        A = sqrt(2.0/N); //計算k!=0時的係數
      for(n = 0; n < N; n++)
      {
         double tmp = x[n]*cos((PI*(2*n+1)*k)/(2*N));
         s = s + tmp;	//累加求和
      }
         X[k] = A * s;	//X[k]等於累和結果s乘以係數A
   }
      for(k = 0; k < N; k++)  
        printf("%f\n", X[k]);
}

在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章