Subtrahieren eines Audiostreams von einem anderen Audiostream

8

Ich bin ein langjähriger Softwareentwickler, habe aber praktisch keine Erfahrung mit Signal- / Audioverarbeitung. Ich bin daran interessiert, etwas über die Signalverarbeitung anhand eines Anwendungsfalls zu lernen, den wir für eine unserer Audiokomponenten haben. HINWEIS: Dies ist nur eine Lernübung für mich. Es ist keine Priorität, dass das Endergebnis nützlich ist.

Wir haben eine Komponente (A), die Audio erzeugt (über einen Lautsprecher). Wir haben eine weitere Komponente (B), die dieses Audio aufzeichnet (über ein einfaches Mikrofon).

Was ich tun möchte, ist A zu verwenden, um B's Audio aufzunehmen. Dann möchte ich, wenn möglich, die beiden Streams vergleichen. Das Ziel wäre es, das in Stream A vorhandene Audio zu entfernen - die Umgebungsbedingungen, die während der Aufnahme herrschten, zu belassen - ich verstehe, dass eine vollständige Entfernung nicht möglich ist.

Mir ist klar, dass es Phasen- und Größenprobleme gibt. Mir ist auch klar, dass es nicht nur darum geht, B von A zu "subtrahieren". Ich gehe jedoch davon aus, dass Sie A von A subtrahieren können .

Ich würde gerne verstehen, wie man das Problem angeht. Auch dies ist eine Lernerfahrung für mich (es gibt keine Fristen); Ich bin mehr als bereit, von vorne zu beginnen.

Jeder Rat / Vorschläge wäre sehr dankbar.

CaymanEss
quelle

Antworten:

5

Dieses Setup weist einige Ähnlichkeiten mit Systemidentifikationsproblemen auf A wäre die Eingabe des LTI-Systems, dessen Übertragungsfunktion Sie schätzen möchten, Bdie Ausgabe sein; und der "Umgebungsschall" ist das additive Geräusch. Die LTI-Annahme ist angemessen, vorausgesetzt, Ihre Wandler / Verstärker / Wandler sind von anständiger Qualität.

Die Schritte wären also:

  • Verwenden Sie eine Systemidentifikationstechnik, um den FIR-Filter zu finden h^ das minimiert den mittleren quadratischen Fehler zwischen h^A und B. Eine einfache Methode, die hier möglicherweise nicht am besten geeignet ist, besteht darin, die Kreuzkorrelation von zu teilenA und B durch die Autokorrelation von A. Erklärung hier . Die Einschränkung besteht darin, dass es bei langen Aufnahmen nicht gut funktioniert (Sie können Ihre Schätzungen besser für kürzere Segmente berechnen und diese mitteln) - und dass Musik nicht das beste "Sonden" -Signal ist, das an ein System gesendet werden kann, um dessen Reaktion abzuschätzen.
  • Sie können jetzt verwenden h^A als Schätzung des ursprünglichen Signals A als vom Mikrofon "gehört" und subtrahieren Sie es von B Umgebungsgeräusche abzurufen.

Ich habe dies mit einem Musikclip (A) versucht, ein Hall- und ein leichtes Verstärkermodell angewendet, um einen Lautsprecher in einem Raum zu simulieren, dann ein Cat-Audio-Sample gemischt, um (B) zu erhalten, und dann eine Impulsantwort aus dem ( A, B) Paar, dann Subtrahieren des gefilterten A von B. Dies zeigt einige Ergebnisse, aber eine bessere FIR-Schätztechnik könnte hier helfen! (Beachten Sie, dass ich die geschätzte IR auf die ersten 5000 Abtastwerte gekürzt habe, um die Berechnungen zu beschleunigen).

Beachten Sie, dass es dafür Algorithmen gibt (z. B. LMS ). Dies ist möglicherweise besser für Ihr Problem geeignet, wennA und Bwerden in Echtzeit und nicht offline verarbeitet. Solche Algorithmen bilden die Grundlage für in der Telekommunikation verwendete Echokompensationssysteme.

Pichenettes
quelle
Vielen Dank @pinchenettes! Ihre c_cat_estimated.wav ist genau die Art von Ergebnis, die ich erreichen möchte . Gibt es eine Möglichkeit, mich wissen zu lassen, wie Sie es gemacht haben (verwendete Software usw.)? Bitte zögern Sie nicht, mich direkt zu kontaktieren: [email protected]
CaymanEss
Ich habe Audacity und Apples Standard-Audioeinheiten verwendet, um das Original-Audio zu verarbeiten und den "Raum" -Effekt zu erzielen. Die Katzenprobe war auch in Kühnheit gemischt. Der Rest des Codes befindet sich in Python + Numpy: gist.github.com/pichenettes/5434412 . Dies ist die "einfachste Sache, die möglicherweise funktionieren könnte" - der Kern des Algorithmus besteht nur aus 6 Codezeilen.
Pichenettes
Nochmals vielen Dank sehr viel @pinchenettes. Das wird mich zum Laufen bringen. Ich werde dies irgendwann in Echtzeit tun wollen - glauben Sie, dass die Verwendung von LMS noch machbar wäre?
CaymanEss
Wenn Sie wissen, dass sich Ihre Impulsantwort nicht ändern wird, können Sie sie in den ersten Sekunden mithilfe eines langsamen Algorithmus berechnen und dann weiter verwenden. Andernfalls (Lautsprecher bewegen sich, Umgebung ändert sich ...) benötigen Sie einen adaptiven Algorithmus. Beachten Sie, dass Sie sich wahrscheinlich mit Faltung mit langen Impulsantworten auseinandersetzen müssen, wenn Sie Räume modellieren möchten -> Überprüfen Sie dies auf Techniken dsp.stackexchange.com/questions/8771/… . Mir sind jedoch keine adaptiven Filtermethoden bekannt, die für sehr lange FIR-Antworten optimiert sind.
Pichenettes
Die Signale müssen dieselbe Länge, Anzahl von Kanälen und Abtastrate haben.
Pichenettes
1

Das Problem, bei dem kein exakter Umgebungsklang ausgegeben werden kann, ist:

(a) die Lautheitsdifferenz (b) die Phasendifferenz aufgrund der Zeitverzögerung.

Insgesamt ist das von B aufgezeichnete Signal also (vorausgesetzt, der Raum verhält sich wie ein LTI-System). yB[n]=k=0pαkxA[nk]+xamb[n])=(xh)[n]+xamb[n], wo h[n]=αnoder so die Raumimpulsantwort. Hierxamb[n]ist das Umgebungssignal an der Position von B. Jetzt,z[n]=xA[n]yB[n] Sie können sehen, dass Sie haben werden z[n]xamb[n], es sei denn, Sie kennen die Raumimpulsantwort oder ihre Schätzung. Um einen Einblick zu erhalten, können Sie fortfahren, indem Sie die Subtraktion durchführen und das Spektrogramm des resultierenden Signals sehen und mit dem Signalspektrogramm des Umgebungssignals und nur des A vergleichen.

Der umgekehrte Weg besteht darin, das Mikrofon in der Nähe von A zu platzieren, um den Effekt der Raumimpulsantwort zu minimieren. Eine solche Technik wird bei Kopfhörern mit Geräuschunterdrückung verwendet, bei denen Umgebungsgeräusche entfernt werden sollen. http://en.wikipedia.org/wiki/Noise-cancelling_headphonese .

Neeks
quelle
Vielen Dank @Neeks. Gibt es einen Namen für die yB [n] -Gleichung (Algorithmus)? Auch hier bin ich für dsp völlig neu, daher wäre es für mich von Vorteil, wenn ich mich über bestimmte Algorithmen / Konzepte informieren könnte.
CaymanEss
1
Es wird Sprach- und Audio-Nachhall genannt. Es ist analog zu einem Entfaltungsproblem, wenn Sie annehmen, dass der Nachhallvorgang auf ein LTI-System zurückzuführen isth(t)ist ein LTI-System.
Neeks
1

Das klingt nach einem Standardfall für "akustische Echokompensation". Zu diesem Thema gibt es viele Patente, Forschungsarbeiten und wissenschaftliche Arbeiten (ab 1967 glaube ich mit MM Sondhis Arbeit "Ein adaptiver akustischer Echokanzler").

Eine einfache Übersicht finden Sie hier http://supportdocs.polycom.com/PolycomService/support/global/documents/support/technical/products/voice/vortex_choose_acoustic_echo_canceller.pdf .

Dies ist ein anständiges Buch zum Thema http://www.amazon.com/Advances-Network-Acoustic-Cancellation-Processing/dp/3540417214

Hilmar
quelle
Vielen Dank, dass Sie @Hilmar. Auf Ihre Empfehlung hin habe ich die Übersicht über die Echokompensation und mehrere Artikel zur Rauschunterdrückung gelesen. Bin ich falsch zu denken, dass Stornierung das Gegenteil von dem ist, was ich will? Wieder ist mein Ziel, das Umgebungsgeräusch zu erhalten, nicht eine bereinigte Version des ursprünglichen Signals.
CaymanEss