Seuraa 
Viestejä950
Liittynyt11.12.2010

Jos joku tarvitsee DCT:tä/IDCT:tä, niin ohessa on lyhyt C-koodin pätkä. main-funktiosta pitäisi helposti selvitä, mitä lasketaan ja tulostetaan.

 

* Ensin tulostetaan alkuperäiset arvot.

 

* Sitten muodostetaan DCT, ja tulostetaan kertoimet.

 

* Lopuksi lasketaan IDCT, jonka arvot pitää täsmätä alkuperäisten kanssa.

 

* DCT:tä voi kvantisoida, ja esim. GSM bittireitti perustuu juuri tähän ominaisuuteen.

 

#include
#include

#define pi 3.14159265358979323846

void mkDCT(double *dst, double *src, int N)
{
   for (int k=0; k   {
      dst[k]=0;
      for (int n=0; n      {
         dst[k]+=src[n]*cos(pi*k/N*(n+0.5));
      }
   }
}

void mkIDCT(double *dst, double *src, int N)
{
   for (int k=0; k   {
      dst[k]=src[0]/2;
      for (int n=1; n      {
         dst[k]+=src[n]*cos(pi*n/N*(k+0.5));
      }
      dst[k]=dst[k]*2/N;
   }
}

void main(void)
{
   #define N 32
   double X[N];

   for (int i=0; i   {
      double x=(double)i/(double)N;
      X[i] = 0.3*x*x*x*x + 0.5*x*x*x - 0.9*x*x - 0.1*x + 0.75;
   }

   for (int i=0; i   printf("%25.20f\n", X[i]);
   printf("\n\n");

   double Y[N];

   mkDCT(Y, X, N);

   for (int i=0; i   printf("%25.20f\n", Y[i]);
   printf("\n\n");

   double Z[N];

   mkIDCT(Z, Y, N);

   for (int i=0; i   printf("%25.20f\n", Z[i]);
   printf("\n\n");
}

Kommentit (0)

Suosituimmat

Uusimmat

Uusimmat

Suosituimmat