Home

EnglishGerman formal - Sie
VHDL Filterbank
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 )
 
Erster Test
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 )
 
Loop-Test
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 ...

 
VHDL Filterbank
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 Wink

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:

Filter

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 Smile

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 )
 
Strategie di mercato