Auf der Suche nach 8x8 (oder NXN) Discrete Cosinus Transform (DCT)/IDCT Pseudo-Code [geschlossen
Frage
Ich suche schon seit einiger Zeit Google, um Pseudo-Code eines anständig effizienten 8x8 (oder NXN) DCT-Algorithmus zu finden, und ich kann nichts finden!
Ich habe den naiven Ansatz implementiert, und es hat viel zu lange gedauert, um auszuführen.
Wenn Sie einen Pseudo-Code veröffentlichen oder auf ein gutes Buch/ein gutes Dokument/eine gute Website verweisen, wäre dies hilfreich.
C- oder C ++ - Beispiele wären noch besser!
Lösung
Wie in den Kommentaren angefordert, Quelle (leicht gewarnt werden, ist es in C#, aber der Unterschied zu C ++ sollte minimal sein, und ja, ich weiß, dass der Code lahm ist):
Hauptschleife (A = Ergebnis, B = Eingabe):
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];
}
}
Unterstützungssachen:
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);
}
}
Bearbeiten: Ich habe es zeitlich festgelegt - für 512 x 512 Pixel (Einzelkanal) dauert es eine halbe Sekunde. Sicher, das ist langsam, aber bei weitem nicht "für immer".
Andere Tipps
Fftw Hat eine open -Source -effiziente Implementierung