Seuraa 
Viestejä950
Liittynyt11.12.2010

Ohessa on lyhyt C-koodinpätkä DCT:n ja IDCT:n laskemiseen. main-funktiolla asiaan pääsee nopeasti käsiksi, jos aihe ei ole tuttu.

 

* Ensin generoidaan alkuperäiset signaalin arvot.

   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");

* Sitten arvoista muodostetaan mkDCT -funktiolla kertoimet. Kerrointen järkevyys on siinä, että niitä voi kvantisoida ja pakata tehokkaasti. GSM perusajatus on juuri tämä.

   double Y[N];

   mkDCT(Y, X, N);

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

* Lopuksi kertoimista (jotka olisi pakattu) palautetaan alkuperäinen signaali.

   double Z[N];

   mkIDCT(Z, Y, N);

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

Koodi:

 

#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 16
   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