Audio Calibration: vom Audiosignal zum vergleichbaren Messwert

Im letzten Beitrag habe ich über den aktuellen Stand des BirchEar Sensors, die bestückte Platine, das Webinterface und meine Erfahrungen mit dem Thema OTA berichtet. Seitdem ist die Firmware wieder ein gutes Stück weitergewachsen. Die wichtigste Erweiterung ist die Audio Calibration.

Die beiden I2S-Mikrofone des Sensors liefern bereits ein brauchbares Audiosignal. Trotzdem hat jedes Mikrofon einen eigenen Frequenzgang. Manche Frequenzbereiche werden etwas stärker, andere schwächer aufgenommen. Auch das Gehäuse, die Öffnungen vor den Mikrofonen und die Einbausituation beeinflussen das Ergebnis. Für eine reine Tonaufnahme ist das häufig kein großes Problem. Wenn mehrere Sensoren miteinander verglichen oder Geräusche später ausgewertet werden sollen, wird dieser Unterschied jedoch relevant.

Ziel der neuen Kalibrierung ist deshalb nicht, den Klang „schöner“ zu machen. Sie soll bekannte Abweichungen des Sensors möglichst gezielt ausgleichen. Aus dem Audiosignal wird damit ein besser vergleichbares Messsignal.

Wo die Kalibrierung arbeitet

Die Verarbeitung wurde als eigener Baustein direkt hinter der digitalen Verstärkung in die Firmware integriert:

Mikrofon → digitale Verstärkung → Audio Calibration → Pegelberechnung, WAV-Datei und weitere Verarbeitung

Diese Reihenfolge ist wichtig. Die digitale Verstärkung hebt zunächst das Eingangssignal auf den gewünschten Arbeitspegel. Danach korrigiert der Kalibrierungsfilter den Frequenzgang. Alle folgenden Funktionen arbeiten somit mit dem bereits korrigierten Signal.

Die Kalibrierung ist modular aufgebaut. Als feste Typbezeichnungen sind derzeit PASS, FIR, BIQUAD und IIR vorgesehen. In Echtzeit umgesetzt sind aktuell PASS und FIR:

  • PASS lässt das Signal unverändert passieren.
  • FIR aktiviert einen Filter mit 64 oder 128 Koeffizienten.

Damit bleibt die Struktur für spätere Erweiterungen offen, ohne dass Konfigurationen später grundsätzlich geändert werden müssen.

Warum ein FIR-Filter?

Ein FIR-Filter – ausgeschrieben Finite Impulse Response – berechnet jeden neuen Ausgangswert aus dem aktuellen und einer festen Anzahl vorheriger Abtastwerte. Die verwendeten Koeffizienten legen fest, welche Frequenzbereiche angehoben oder abgesenkt werden.

Für BirchEar bietet dieser Filter einige Vorteile:

  • Der Frequenzgang kann sehr gezielt korrigiert werden.
  • Ein linearphasiger Filter verändert die zeitlichen Beziehungen der Frequenzanteile kontrolliert.
  • Die Berechnung ist reproduzierbar und gut testbar.
  • Mit 64 oder 128 Taps bleibt der Rechenaufwand für den Raspberry Pi Pico 2 W beherrschbar.

Die Audioverarbeitung läuft auf dem Aufnahme-Core. Sämtlicher benötigter Speicher ist bereits Bestandteil des Recorders. Während ein Audioblock verarbeitet wird, findet keine dynamische Speicherreservierung statt. Das reduziert das Risiko von Aussetzern oder schwer reproduzierbaren Laufzeitproblemen.

Die Kalibrierungsseite im Webinterface

Im Webinterface gibt es unter Audio → Calibration eine eigene Seite. Dort kann die aktuelle Kalibrierung angesehen, importiert, exportiert oder vollständig zurückgesetzt werden.

Für eine manuelle Korrektur stehen sieben Regler zur Verfügung:

  • 50 Hz
  • 100 Hz
  • 250 Hz
  • 500 Hz
  • 1.000 Hz
  • 2.000 Hz
  • 4.000 Hz

Negative Werte dämpfen den jeweiligen Frequenzbereich, positive Werte verstärken ihn. Zusätzlich kann zwischen 64 und 128 Taps gewählt werden. Aus den eingestellten Punkten erzeugt JavaScript direkt im Browser einen linear interpolierten, mit einem Hamming-Fenster versehenen FIR-Filter. Anschließend wird die Gleichspannungsverstärkung auf 1 normalisiert.

Die eigentliche Berechnung der Filterkoeffizienten erfolgt bewusst nicht auf dem Pico. Der Sensor erhält nur den fertigen und geprüften Koeffizientensatz. Das hält die Firmware schlank und trennt die rechenintensive Filtererstellung sauber von der Echtzeitverarbeitung.

Bei positiven Verstärkungen weist das Webinterface auf den zusätzlich benötigten Headroom hin. Das ist wichtig, weil eine Anhebung einzelner Frequenzen zu Übersteuerungen führen kann, auch wenn das ungefilterte Signal vorher noch unterhalb der maximalen Aussteuerung lag.

Konfiguration ohne Neustart

Die Kalibrierung wird als separates JSON-Dokument im LittleFS des Sensors gespeichert:

/config/audio_calibration.json

Über die REST-Schnittstelle kann die vollständige Konfiguration gelesen, geschrieben oder zurückgesetzt werden:

  • GET /api/audio/calibration
  • PUT /api/audio/calibration
  • POST /api/audio/calibration/reset

Beim Aktivieren einer neuen Konfiguration wird die Aufnahme kurz angehalten, der Filterzustand kontrolliert ausgetauscht und die Aufnahme anschließend fortgesetzt. Ein Neustart des Sensors ist nicht erforderlich.

Der Pico übernimmt dabei nicht ungeprüft jede übertragene Datei. Er kontrolliert unter anderem den Filtertyp, die Anzahl der Taps, die Länge des Koeffizientenfeldes und unzulässige Zahlenwerte. Für einen FIR-Filter muss die Summe der Koeffizienten – und damit die Verstärkung bei 0 Hz – zwischen 0,95 und 1,05 liegen. Fehlerhafte Konfigurationen werden abgelehnt, anstatt möglicherweise die laufende Aufnahme zu beeinträchtigen.

Live-FFT: die Wirkung direkt sichtbar machen

Mit Firmware 3.5.0 ist zusätzlich eine Live-Spektrumsanzeige hinzugekommen. Während der Aufnahme werden Momentaufnahmen des Signals vor und nach der Kalibrierung in einem lock-free Doppelpuffer abgelegt. Der Audio-Core kopiert nur die Samples. Die eigentliche FFT-Berechnung läuft auf dem Web-Core und belastet damit nicht den zeitkritischen Aufnahmepfad.

Verwendet wird eine 1024-Punkt-FFT mit Hann-Fenster. Bei 16 kHz Abtastrate ergibt sich eine Frequenzauflösung von 15,625 Hz. Die Schnittstelle liefert 256 Frequenz-Bins ab 31,25 Hz bis in Richtung der Nyquist-Frequenz. Das Webinterface fragt diese Daten fünfmal pro Sekunde ab und glättet die Anzeige zeitlich, damit sie trotz der natürlichen Schwankungen eines Audiosignals gut ablesbar bleibt.

Im Diagramm werden drei Informationen gemeinsam dargestellt:

  • Grau: das gemessene Originalsignal
  • Orange: die konfigurierte Übertragungsfunktion des FIR-Filters
  • Grün: das gemessene, korrigierte Signal

Damit ist unmittelbar erkennbar, ob eine Änderung am Equalizer in die gewünschte Richtung wirkt.

Wichtig ist die Unterscheidung: Die graue und die grüne Kurve stammen aus der laufenden FFT-Messung. Die orange Kurve zeigt die berechnete Übertragungsfunktion des Filters. Sie ist keine dritte Echtzeitmessung, sondern die mathematische Beschreibung der eingestellten Korrektur.

Wie eine echte Kalibrierung ablaufen kann

Für eine reproduzierbare Kalibrierung reicht es nicht, die Regler nur nach optischem Eindruck einzustellen. Der geplante Ablauf sieht deshalb so aus:

  1. Ein definiertes Testsignal oder Rauschen wird über eine möglichst bekannte Schallquelle wiedergegeben.
  2. Ein Referenzmikrofon und der BirchEar Sensor messen an möglichst gleicher Position.
  3. Aus der Abweichung wird eine Zielkurve für den Sensor bestimmt.
  4. Ein externer Rechner oder Server interpoliert diese Kurve und erzeugt daraus den FIR-Koeffizientensatz.
  5. Die fertige JSON-Konfiguration wird an den Sensor übertragen.
  6. Mit der Live-FFT wird überprüft, ob sich Original- und korrigiertes Signal wie erwartet unterscheiden.

Die grafischen Regler im Browser eignen sich gut für erste Versuche und manuelle Anpassungen. Für eine präzise Kalibrierung soll die Filterberechnung später automatisiert aus einer Referenzmessung entstehen.

Sicherheit und Rückweg

Bei der Entwicklung war mir wichtig, dass eine fehlerhafte Kalibrierung nicht die übrige Sensorfunktion unbrauchbar macht. Über Reset kann jederzeit auf den deaktivierten PASS-Modus zurückgeschaltet werden. Die Einstellungen für Aufnahme und Upload bleiben davon unberührt.

Auch die DSP-Funktionen und die FFT wurden mit Unit-Tests ergänzt. Für die FFT gibt es unter anderem einen eingebetteten Test zur Frequenz- und Pegelerkennung. Gerade bei Signalverarbeitung ist das wertvoll: Eine Kurve kann im Browser plausibel aussehen und mathematisch trotzdem falsch sein.

Zwischenfazit

Mit der Audio Calibration hat der BirchEar Sensor einen wichtigen Entwicklungsschritt gemacht. Die Firmware zeichnet jetzt nicht nur Audiodaten auf, sondern kann den individuellen Frequenzgang eines Sensors gezielt korrigieren und die Wirkung während des Betriebs sichtbar machen.

Besonders wichtig ist für mich dabei die klare Aufgabenteilung:

  • Der Browser oder ein externer Server erstellt die Filterkoeffizienten.
  • Der Pico prüft und speichert die Konfiguration.
  • Der Aufnahme-Core führt den Filter mit fester Laufzeit aus.
  • Der Web-Core berechnet die Live-FFT und stellt die Daten für die Oberfläche bereit.

So bleibt der zeitkritische Aufnahmepfad schlank, während Bedienung und Auswertung komfortabler werden.

Der nächste Schritt ist nun eine reproduzierbare Messanordnung mit einem Referenzmikrofon. Erst damit kann aus der technischen Filterfunktion eine belastbare Kalibrierung für jeden einzelnen Sensor werden. Die Grundlage dafür ist mit den Firmware-Versionen 3.3.0 bis 3.5.0 geschaffen.