Unixery & daemon worship 🔥


It's a Unix system! I know this!

Equalizer in Linux mit ALSA

Ich habe mir neue In-Ear Kopfhörer gekauft (Tin HiFi P1), die für mich zwar prinzipiell super klingen, aber im Bassbereich eine mangelnde Quantität (nicht Qualität!) aufweisen. Also was soll’s, da nehme ich doch einfach einen Equalizer und hebe den Bass ein gutes Stück an. Statt das per Hardware zu machen, z.B. mit einem Behringer DEQ2496, dachte ich mir: “Mach’s doch einfach gleich am Rechner, der die Musik abspielt.” Denn dann geht das auch am Notebook oder mit einem USB DAC.

Möglichkeiten in Linux

Pulseeffects

Mit Pulseeffects hat man die unendlichen Möglichkeiten an Klangeffekten, alles schön mit graphischer Oberfläche. Leider war mir die CPU-Auslastung für ein bisschen EQ hier zu hoch.

Alsaequal

Eins Stufe drunter liegt Alsaequal. Das Projekt sieht mir aber ziemlich tot aus.

LADSPA-Plugins direkt in ALSA

Man kann die LADSPA-Plugins, die Pulseeffects und Alsaequal für das Sound-Processing nutzen, auch direkt in ALSA einbinden. Das wollte ich mal probieren.

Wie läuft das ab?

Kurz erklärt, wie das abläuft: Man legt ein virtuelles Audio-Gerät an und dieses wird von der Musik-App als Ausgabegerät genutzt. Dabei werden die Audiodaten dann über das LADSPA-Plugin geroutet (für das Sound-Processing) und dann weiter zur eigentlichen Soundkarte (bzw. in meinem Fall zum USB-DAC). Zwischen Musik-App (Eingabe), LADSPA-Plugin (Processing) und USB-DAC (Ausgabe) braucht man noch das sogenannte “plug”-Plugin. Das passt automatisch das Audioformat so an, wie es die jeweils nächste Stufe braucht. Das sieht dann so aus:

Musik-App --> virtual plug device --> LADSPA plugins --> another virtual plug device --> USB DAC

Audio-Geräte

Die vorhanden Audiogeräte kann man mit dem Befehl aplay -L anzeigen. Da findet sich dann für meinen Sabaj DA3 USB DAC u.a. folgendes:

front:CARD=v12,DEV=0
    SABAJ DA3 v1.2, USB Audio
    Front output / input

Den Namen des Geräts braucht man dann in der asound.conf.

10-Band Equalizer

Für den 10 Band Equalizer benutze ich ein Plugin aus den LADSPA SWH Plugins (Amp) und ein Plugin aus den LADSPA Caps Plugins (EQ10). Da ich den Bass anheben will, muss ich erstmal etwas Headroom dafür schaffen, sonst kann es zum Übersteuern kommen (Clipping). Deshalb senkt das Amp Plugin den Gesamtpegel des Audiosignals erstmal ab, bevor es in den eigentlichen EQ geht.

In der /etc/asound.conf muss man folgendes einstellen:

pcm.eq10 {
    type plug
    slave.pcm ladspa_eq10
}

pcm.plugsabajusb {
    type plug
    slave.pcm "front:CARD=v12,DEV=0"
}

pcm.ladspa_eq10 {
    type ladspa
    slave.pcm "plugsabajusb"
    path "/usr/lib64/ladspa"

    plugins [
        {
            # LADSPA SWH plugin "Amp"
            # Controls the gain of the input signal in dB's (range: -70 dB .. +70 dB)
            id 1181
            input {
                # lower gain to get some headroom before amplifying bands with equaliser
                controls [ -7.5 ]
            }
        }
        {
            # LADSPA Caps plugin "EQ10" (http://quitte.de/dsp/caps.html#Eq10)
            # A classic octave-band constant-Q second-order filter design, basically a direct digital translation of an analog original.
            # 10 band equaliser frequencies: 31 Hz, 63 Hz, 125 Hz, 250 Hz, 500 Hz, 1 kHz, 2 kHz, 4 kHz, 8 kHz, 16 kHz (range -48 dB .. +24dB)
            id 1773
            input {
                controls [ 3.8 7.5 1.5 0 0 0 0 0 0 0 ]
            }
        }
    ]
}

Um nochmal das Audio-Routing für diese konkrete Konfiguration zu verdeutlichen:

Musik-App --> pcm.eq10 --> pcm.ladspa_eq10 --> pcm.plugsabajusb --> front:CARD=v12,DEV=0 (USB DAC)

Parametrischer Equalizer

Auch ein Parametrischer Equalizer ist möglich. Den gibt’s in den Caps Plugins. Hier spare ich mir das Amp-Plugin vorher, denn ich erhöhe nicht nur den Bassbereich, sondern senke mittels Kuhschwanzfilter einfach den gesamten Mitten-/Höhenbereich. Das sieht dann so aus:

pcm.eq4p {
    type plug
    slave.pcm ladspa_eq4p
}

pcm.plugsabajusb {
    type plug
    slave.pcm "front:CARD=v12,DEV=0"
}

pcm.ladspa_eq4p {
    type ladspa
    slave.pcm "plugsabajusb"
    path "/usr/lib64/ladspa"

    plugins [
        {
            # LADSPA Caps plugin "EQ4p" (http://quitte.de/dsp/caps.html#Eq4p)
            # There are four sets of four numbers: mode, f, Q, gain
            # modes: -1 off, 0 lowshelve, 1 band, 2 hishelve
            id 2608
            input {
                #          lowshelve      lowshelve     off         hishelve
                controls [ 0 20 0.6 -3    0 50 0.4 3    -1 0 0 0    2 80 0.2 -4.5 ]
            }
        }
    ]
}

Mehr oder weniger wird hier über 80 Hz um 4,5 dB abgesenkt. Unter 50 Hz werden nochmal 3 dB draufgelegt, die unter 20 Hz wieder abgezogen werden. Mit den Q-Faktoren gibt das dann halt irgendeine Ausgleichskurve.

Musikplayer

Meine Musik spiele ich mit Squeezelite ab. Dem Player teilt man dann das Ausgabegerät folgendermaßen mit:

squeezelite -o eq4p ...