Vous recherchez 8x8 (ou nxn) transformée en cosinus discrète (TCD) / IDCT pseudo-code [fermé]

StackOverflow https://stackoverflow.com/questions/8363753

  •  27-10-2019
  •  | 
  •  

Question

J'ai été à la recherche Google pour un certain temps maintenant de trouver pseudo-code d'un 8x8 décemment efficace (ou nxn) algorithme TCD, et je ne trouve rien!

Je mis en œuvre l'approche naïve, et il a fallu beaucoup trop longtemps pour exécuter.

Si vous pouviez poster une pseudo-code ou référence à un bon livre / document / site, ce serait utile.

C ou les exemples C de seraient encore mieux!

Était-ce utile?

La solution

Comme demandé dans les commentaires, source (légèrement averti, il est en C #, mais la différence avec C ++ devrait être minime, et oui je sais que le code est boiteux):

boucle principale (A = résultat, B = entrée):

for (int y = 0; y < 8; y++)
{
    for (int x = 0; x < 8; x++)
    {
        A[y * 8 + x] = 0;
        for (int u = 0; u < 8; u++)
            for (int v = 0; v < 8; v++)
                A[y * 8 + x] += alpha(u) * alpha(v) * B[u, v] *
                    cosine[u, x] * cosine[v, y];
    }
}

stuff Support:

static double alpha(int i)
{
    if (i == 0)
        return SQRT2o2 * 0.5;
    return 0.5;
}
const double SQRT2o2 = 1.414213562373095048801688724209 * 0.5;
cosine = new double[8, 8];
const double inv16 = 1.0 / 16.0;
for (int i = 0; i < 8; i++)
{
     for (int j = 0; j < 8; j++)
     {
         cosine[j, i] = Math.Cos(Math.PI * j * (2.0 * i + 1) * inv16);
     }
}

edit: je chronométré - pour 512 par 512 pixels (canal unique), il faut une demi-seconde. Bien sûr, qui est lent, mais loin d'être « pour toujours ».

Autres conseils

FFTW a une mise en œuvre efficace open source

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top