LAME: Berechnung der psychoakustischen Eigenschaften
Dies ist der erste Vorgang, der ein Frame bearbeitet. Er gliedert sich in zwei Untervorgänge:
- Ermittlung des Blocktyps (long/short)
- Berechnung der Energie, Entropie, usw.
Da die Ermittlung des Blocktyps nur von den Eingabedaten abhängig ist, lässt sich der Vorgang
in einer asynchronen Programmiersprache wie folgt beschreiben:
PsychoAcoustics(frames)
{
AttackDetection(frames);
RestOfPsychoAcoustics(frames);
}
1. Ermittlung des Blocktyps (AttackDetection)
Wie oben erwähnt, hängt die Ermittlung des Blocktyps nur von den konvertierten Samples ab.
Der Blocktyp wird für jedes Sub-Frame (Granule) und jeden Kanal ermittelt. Er wird sowohl im
MDCT-Vorgang als auch im Quantisierer benötigt.
2. Berechnung der psychoakustischen Eigenschaften
Dieser Vorgang hängt direkt von der Ermittlung des Blocktyps ab. Nur beim Enkodieren in konstanter Bitrate (CBR) existiert zusätzlich eine Abhängigkeit zum
Quantisierer. Die berechneten Werte werden vom Quantisierer benötigt.
Für den gesamten Vorgang wurden mehrere Klassen implementiert, deren Dateien im Projektmappenordner "PSY" abgelegt wurden.
Optimierungen:
Neben der Aufteilung des Vorgangs in zwei kleinere Vorgänge war es auch möglich, Teile mit SSE2-Befehlen zu beschleunigen.
Nach der Ermittlung der Blocktypen der beiden Kanäle des ersten Granules, werden diese als Optimierung sofort für die weiteren Vorgänge freigeben, während
die Ermittlung der Blocktypen des zweiten Granules noch aussteht.
Die wichtigste Änderung war jedoch die Auflösung einer Abhängigkeit zum Quantisierer: In der Originalversion wird dort der Wert "maskingLower" berechnet,
der für die Berechnung der psychoakustischen Eigenschaften verwendet wird. Da "maskingLower" relativ einfach zu berechnen ist, wird er zusätzlich auch in
diesem Vorgang lokal berechnet, ohne auf den Quantisierer warten zu müssen.
Somit erhält man folgendes Abhängigkeitsdiagramm:
Weitere Optimierungsmöglichkeiten wurden in der Fallstudie nicht untersucht.
|