Schnelle DCT-Implementierung


7

Ich habe Probleme herauszufinden, wie ich den schnellen 8x8 DCT-Algorithmusdiagrammen in den folgenden beiden Abhandlungen folgen kann:

(1) Ein schneller Berechnungsalgorithmus für die diskrete Cosinustransformation von Chen et al.

und

(2) Praktisch schnelle 1-D-DCT-Algorithmen mit 11 Multiplikationen von Loeffler et al.

Insbesondere sieht das zweite Diagramm, das den Algorithmus in (2) zeigt, wie folgt aus:

Geben Sie hier die Bildbeschreibung ein

Die Beschreibung der Operationen in diesem Algorithmus lautet:

Geben Sie hier die Bildbeschreibung ein

Ich habe einige Fragen zu dieser Formulierung und bin mir nicht sicher, wo ich die Antworten finden kann:

  1. (2) legt nahe, dass dieser Algorithmus eine DCT erzeugt, die um einen bestimmten Wert skaliert wird C=2. Es wird erwähnt, dass diesCwurde willkürlich gewählt, um Multiplikationen bei der Berechnung des Gleichstromkoeffizienten zu vermeiden. Wirklich die einzige Voraussetzung ist dasC.D.C.T.C.ichD.C.T.=4N.2. Meine Frage lautet also: Was ist der Skalierungsfaktor der Ausgabekoeffizienten unter Verwendung dieses Algorithmus? Es scheint, als ob sie sich von der ursprünglichen Definition der DCT unterscheiden, aber ich weiß nicht, um wie viel (hauptsächlich, weil ich tatsächlich keine Beziehung zwischen diesem Diagramm und der ursprünglichen Formulierung der DCT sehe):

    F.(k)=2c(k)N.n=0N.- -1f(n)cos((2n+1)πk2N.)
    wo c(k)=12 zum k=0 und c(k)=1 zum k0.
  2. In dem Artikel heißt es, dass die IDCT mit genau demselben Algorithmus durchgeführt werden kann, wobei jedoch die Ausgaben in Eingaben umgewandelt werden und umgekehrt. Müssen die DCT-Koeffizienten zunächst in Bit-umgekehrter Reihenfolge angeordnet werden, bevor sie durch die IDCT geleitet werden? Zweitens sollte für die Rotationsblöcke (die Quadrate im Diagramm) nicht die umgekehrte Operation sein:

    Ö0=ich0kcosnπ2N.- -ich1kSündenπ2N.Ö1=ich1kSündenπ2N.+ich1kcosnπ2N.
    Meine Argumentation lautet: Die Umkehrung einer Rotation um θ ist eine Rotation von - -θ. Daher ersetzen wir einfach den Winkel durch seine Umkehrung und verwenden die Identitätencos(- -θ)=cos(θ) und Sünde(- -θ)=- -Sünde(θ). Drittens, was ist der Skalierungsfaktor der transformierten Werte nach der IDCT? (2) sagt2N.2, aber empirisch hat dies nicht zu korrekten Ergebnissen geführt.
  3. Angenommen, nachdem ich den Algorithmus ausgeführt habe, habe ich das Ergebnis jeder Spur in den Werten gespeichert d0 ... d7. Welche der folgenden ist korrekt:

    Ausgang [0] = d0 oder Ausgang [0] = d0
    Ausgang [4] = d1 Ausgang [1] = d4
    Ausgang [2] = d2 Ausgang [2] = d2
    Ausgang [6] = d3 Ausgang [3] = d6
    Ausgang [7] = d4 Ausgang [4] = d7
    Ausgang [3] = d5 Ausgang [5] = d3
    Ausgang [5] = d6 Ausgang [6] = d5
    Ausgang [1] = d7 Ausgang [7] = d1 

Wenn es Möglichkeiten gibt, diese Frage zu verbessern, oder wenn ich sie woanders stellen sollte, lassen Sie es mich bitte wissen.


Um diese Art von Fragen praktisch zu beantworten, benötigen Sie eine Reihe vorberechneter DCT-Werte und passen Ihre Implementierung an, bis die Ergebnisse mit den vorberechneten übereinstimmen ....
Fat32

Ich habe all diese Fragen und mehr ... hast du es jemals herausgefunden? Ich habe eine C-Implementierung gefunden, die ich versuche, Materialform zu extrahieren. Ich werde etwas schreiben, wenn ich Antworten finde.
Pepijn

Antworten:


4

Okay, nachdem ich einige Tage auf dieses Problem gestarrt habe, hoffe ich, dass ich der nächsten armen Seele ein bisschen Anleitung geben kann.

  1. Ja, die Skalierung ist anders. Im Vergleich zum scipy.fftpack.dctDC-Begriff ist12 und die anderen Begriffe 22. Aber anscheinend bricht alles in der inversen Transformation gut ab.
  2. Die umgekehrte Eingabereihenfolge ist genau so, wie sie herauskommt: Bit umgekehrt. Im wahrsten Sinne des Wortes, als ob Sie die Figur umdrehen und die Linien verbinden. Und ja, Sie haben Recht, dass die Sünde ein Minus bekommt. Ich sehe einen Skalierungsfaktor von 8, FWIW.
  3. Die Ausgabereihenfolge der Inversen entspricht der Eingabereihenfolge der Vorwärtstransformation. Damitx[n]=IDCT(DCT(x[n]))8

Beachten Sie auch, dass das Diagramm einen Fehler enthält 2c6 für den geraden Drehblock.


Vielen Dank, dass Sie sich die Zeit genommen haben, diese Fragen zu beantworten! Meine ursprüngliche Motivation dafür war im Zusammenhang mit einem 2D-Komprimierungsalgorithmus, daher bin ich mir über die relative Reihenfolge der Ausgaben immer noch etwas unklar (ich möchte, dass sie zwischen 0 und 7 liegen, damit ich sie von klein auf haben kann zum größten). Sie sind auch nicht ganz umgekehrt: 3 -> 5, 5 -> 6, 7 -> 1 sind nicht genau Bitumkehrungen (oder habe ich hier falsch verstanden).
Mokosha

1
Die Reihenfolge stimmt mit en.wikipedia.org/wiki/Bit-reversal_permutation überein, also gibt es das. Sie können sie natürlich nach Belieben nachbestellen. Ich würde vorschlagen, dies im Zick-Zack-Schritt direkt zu berücksichtigen, um zusätzliche Kosten zu vermeiden.
Pepijn
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.