Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C: Modified discrete cosine transform

msdos464 [21.11.2007 13:47:00]

#

http://en.wikipedia.org/wiki/Modified_discrete_cosine_transform

Tuollaista kokeilin laskeskella, mutta muunnoksen ja käänteismuunnoksen jälkeen tulos ei pysy enää samana.. Onko koodin kaavassa jokin virhe? Olen kyllä moneen kertaan lukenut läpi.

// Modified Discrete Cosine Transform v0.1

#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>

int main(void) {
   const char str[] = "abbaKabba"; // data

   int i, n, N = strlen(str)/2, mid = 0;
   double *real = calloc(sizeof(double), N), pi_n = 3.14159265359 / N, tmp_l;

   for (i = 0; i < 2*N; i++) {
      mid += str[i];
      printf("%i ", str[i]);
   } mid /= i; printf("\n\nN = %i, mid = %i\n\n", N, mid);

   // vähennetään datasta sen keskiarvo, ettei amplitudit kasva niin suuriksi

   for (i = 0; i < N; i++) { // muunnos looppi
      for (n = 0; n < 2*N; n++)
         real[i] += (str[n] - mid)*cos(pi_n * (n + 0.5 + N/2) * (i + 0.5));
      printf("\t%.3f\n", real[i]);
   }

   for (i = 0; i < 2*N; i++) { // käänteismuunnos looppi
      for (tmp_l = n = 0; n < N; n++)
         tmp_l += real[n] * cos(pi_n * (i + 0.5 + N/2) * (n + 0.5));
      tmp_l = tmp_l / N + mid;

      printf("%.3f => %X = %c\n", tmp_l, (char) round(tmp_l), (char) round(tmp_l));
   }

   free(real);
   return 0;
}

Laskimella kun laskin, niin samoja tuloksia tuli. Mutta en silti usko, että wikipediassa olisi väärin. Mikäköhän mättää?

Koittakaa laskea muunnos vaikka jonolle {-4, 6, -3, 3}.

X_0 = -3.827
X_1 = 9.239 (pyöristettyjä)

arvoiksi käänteismuunnoksesta tulee noin {-5, 5, 0, 0}.

:/

Antti Laaksonen [22.11.2007 10:04:42]

#

Ainakin semmoinen asia pistää silmään, että ohjelmassasi kaavan osana on kokonaislukujen jakolasku (N/2), jonka tulos on myös kokonaisluku. Tietysti voit huvin vuoksi varmistaa kaavan jostain toisesta lähteestä.

msdos464 [22.11.2007 15:31:06]

#

Antti Laaksonen kirjoitti:

Ainakin semmoinen asia pistää silmään, että ohjelmassasi kaavan osana on kokonaislukujen jakolasku (N/2), jonka tulos on myös kokonaisluku.

Hyvä huomio.. tietenkään tuo ei haittaa jos N sattuu olemaan parillinen, mutta pitää ottaa se kuitenkin huomioon.

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta