|
Effektivwert Berechnung (RMS) |
|
Wednesday, 9. April 2008 |
|
Der Dynamik-Kompressor soll ein look-ahead-Kompressor werden. Die Eigenschaft eines solchen Kompressors ist, dass er z.B. 2ms zwischenspeichert, sich das Signal anschaut wie es sich verändern wird und das Audio dann um die gleiche Zeit verzögert ausgibt. Der Komporessor kann damit quasi in die Zukunft sehen und das Audio beeinflussen bevor es zum klippen anfängt. Als interessante Größe, auf die der Kompressor anspricht, wird gerne der Effektivwert der Musik verwendet. Der Effektivwert wird so berechnet:
Bei dem Kompressor wurde ein 128tap Schieberegister verwendet, das als BRAM realisiert wurde. Im Prinzip handelt es sich bei der RMS Berechung um die Berechnung der Filter für die Filterbank, aber mit dem Unterschied, dass das Ergebnis nochmal um 6 Bits nach rechts geschoben wird und davon dann die Wurzel berechnet wird. Weiterhin gibt es kein ROM für Koeffizienten, da jeder Wert quadriert werden muss. Die Berechnung der Wurzel war dann mithilfe von Wikipedia sehr einfach zu implementieren:
public static int sqrt(int num) {
int op = num;
int res = 0;
int one = 1 << 14; // The second-to-top bit is set: 1L<<30 for long
// "one" starts at the highest power of four <= the argument.
while (one > op)
one >>= 2;
while (one != 0) {
if (op >= res + one) {
op -= res + one;
res += 2 * one;
}
res >>= 1;
one >>= 2;
}
return res;
}
Es werden dafür keine Multiplikationen benötigt. Alles in allem benötigt die RMS-Berechnung über 128 Werte ~370LE, 2 Multiplizierer und 4608Bits Speicher. Nur für eine RMS-Berechnung erscheint das irgendwie ziemlich viel ...
|
|
Letzte Aktualisierung ( Wednesday, 9. April 2008 )
|
|
|
Monday, 7. April 2008 |
|
Heute konnte ich die ersten praktischen Tests meiner Filterbank machen. Dazu war noch etwas vorarbeit am Code des DE1-Demos notwendig. Zum Beispiel mussten die ADC-Daten parallelisiert und die DAC-Daten serialisiert werden. Außerdem wurde die PLL-Frequenz auf 36,864MHz erhöht, da die Berechnungen der Filterbank mit 18,432MHz nicht innerhalb eines Sample-Zyklus fertig geworden wäre.
Die Intergration der Filterbank in das modifizierte Demo war dann völlig problemlos. Und es scheint zu funktionieren. Ich konnte keine hörbaren Verzerrungen feststellen und auch die Trennung in HI und LO Frequenzband hat funktioniert.
Die Logikauslastung einer Stereo-Filterbank ist auf ~500LE + 9216Bits RAM + 4608Bits ROM gesunken. Weiterhin wurde die interne Breite von 16 auf 18 Bit erhöht. Dies hat sich angeboten weil:
- das BRAM intern 18Bit organisiert ist und man sonst etwas verschwendet hätte und
- zwei 9Bit Multiplizierer verwendet werden
D.h. man bekommt eine höhere Genauigkeit und muss dafür fast nichts bezahlen.
Der nächste Schritt liegt wohl darin jetzt die Filter zu Kaskadieren, wobei ich denke, dass eine asymmetrisches Kaskadierung sinnvoller ist, d.h. die Frequenzbänder werden immer in HI und LO Band geteilt, wovon immer das LO-Band wieder in HI- und LO-Band geteilt wird. Dadurch werden die Bänder zu den niedrigeren Frequenzen immer schmalbandiger. Man muss allerdings darauf Rücksicht nehmen, dass vor der Synthese aller Bänder jeweils die HI-Bänder entsprechend verzögert werden müssen, weil die Signallaufzeiten unterschiedlich sind.
Ein weiterer Schritt ist dann die Steuerung über einen Microcontroller, über den man dann die Verstärkungsfaktoren der einzelnen Bänder einstellen kann. Dazu werde ich wohl mein SAM7-Mini-Board verwenden, weil das schon USB hat.
Danach fehlt dann noch die Dynamik-Kompression, die sich noch als schwierig erweisen dürfte. Ich hab kaum Ahnung was sinnvolle Zeiten für Release- und Attack sind und ob sich die Zeiten in den einzelnen Frequenzbändern auch noch unterscheiden.
|
|
Letzte Aktualisierung ( Monday, 7. April 2008 )
|
|
|
Saturday, 5. April 2008 |
|
Ich konnte zwar meine Filterbank nicht auf dem Altera DE1 ausprobieren, aber ich hab zumindest den LineIn -> ADC -> FPGA -> DAC -> LineOut Test hingekriegt. Dazu musste ich mir erstmal die Arbeit machen und das Toplevel-Modul (Default-Demo) auf dem DE1 nach VHDL zu übersetzen, damit ich damit auch was anfangen kann. Wahrscheinlich haben sich andere die Arbeit schon gemacht, aber im Internet hab ich nichts davon gefunden. Weiterhin musste ich mich noch durch das furchtbare Datenblatt des CODECs quälen und die Konfiguration so ändern, dass der LineIn nicht mehr auf den LineOut ge-bypass-t wird, sondern dass der ADC aktiv wird.
Die nächsten Tage werde ich dann meinen Filter einbauen und schauen was passiert ...
|
|
|
Saturday, 5. April 2008 |
|
Der erste Eintrag in meinem Technik-Bastel-Blog ... Ich war mir
unsicher ob ich überhaupt einen Blog führen soll, schließlich ist es so
als würde jemand einem bei der Arbeit zuschauen und nicht nur
Ergebnisse, sondern auch Fehlschläge miterleben, oder über naive
Lösungsansätze lächeln. Ich hab mich dazu entschieden das Risiko
einzugehen und Blogs sind ja nicht in Stein gemeißelt und können gleich
wieder gelöscht werden
Nun aber zu meinem aktuellen Projek ...
Das Ziel ist eine VHDL-Multi-Channel-Filterbank für Audio-Anwendungen.
Weiteres Ziel soll die Integration eines
Multi-Channel-Dynamik-Kompressors werden. Und das alles in VHDL, damit
ein in Zukunft geplantes Controller-System keine Arbeit damit hat.
Der erste Schritt ist bereits gemacht. Ein
Zweikanal-perfect-reconstruction Filter, der noch getestet werden muss.
Folgendes Bild zeigt, wie diese aussieht:
Quelle: Filterdesign Demo
Details der aktuellen Implementierung:
Implementiert wurde das Ganze in VHDL unter Quartus 2 für Altera.
Eine Filterbank besteht aus 4 FIR Filtern, wobei immer ein Filter
kombiniert wurde aus Polyphase Interpolation/Dezimation und
Tief/Hochpass (wie im Filterdesign Demo). Als Filterlänge wurde jeweils
64tap gewählt. So passen die Koeffizienten für ein Filter in jeweils
1kBit BRAM.
Die FIR-Filter selbst wurden, damit sie möglichst wenig Resourcen
benötigen, mit Hilfe einer MAC-Einheit implementiert. Zusätzlich wird
der MAC auch noch gemultiplext, damit alle 4 Filter von einem MAC
berechnet werden kann, der auf der 600fachen Sample-Frequenz arbeitet.
Genauer gesagt berechnet ein MAC 8 Filter, da Stereo. Die
Logikauslastung für eine Filterbank beträgt so ca. 600LE (Altera), 2
9x9Bit Multiplizierer und 16kBit BRAM
Laut Simulationstests mit dem Modelsim scheint das zu funktionieren,
aber genau wird man es erst wissen wenn ich es auf meinem Altera DE1
ausprobiert habe.
|
|
Letzte Aktualisierung ( Saturday, 5. April 2008 )
|
|
|