Akustische Echokompensation in Java

8

Ich implementiere eine VOIP-Anwendung, die reines Java verwendet. Es gibt ein Echo-Problem, das auftritt, wenn Benutzer keine Headsets verwenden (hauptsächlich bei Laptops mit integrierten Mikrofonen).

Was passiert derzeit?

Das Wichtigste in der VOIP-Anwendung sind nur die einfachen Datalines des Java-Media-Frameworks. Im Wesentlichen möchte ich eine digitale Signalverarbeitung an Audiodaten durchführen, bevor ich sie zur Ausgabe an den Lautsprecher schreibe.

%Vor%

Wie Sie sehen können, kommen die Audiodaten an und werden in einen Puffer eingereiht. Dies dient dazu, dubiose Verbindungen zu berücksichtigen und unterschiedliche Paketgrößen zu ermöglichen. Es bedeutet auch, dass ich auf so viele Audiodaten zugreifen kann, wie ich für irgendwelche ausgefallenen DSP-Operationen benötige, bevor ich die Audiodaten an die Lautsprecherlinie abspiele.

Ich habe einen Echokompensator gemanagt, der funktioniert, aber es erfordert eine Menge interaktiver Benutzereingaben und ich hätte gerne einen automatischen Echokompensator.

Manueller Echokompensator

%Vor%

Adaptive Filter

Ich habe das adaptive Filter gelesen sind der Weg zu gehen. Insbesondere ein Least-Mean-Squares-Filter. Ich stecke jedoch fest. Die meisten Beispiele für die oben genannten sind in C und C ++ und sie nicht gut in Java übersetzen.

Hat jemand Tipps, wie man sie in Java implementiert? Alle anderen Ideen würden auch sehr geschätzt werden. Danke im Voraus.

    
Garg Unzola 04.08.2010, 06:37
quelle

4 Antworten

4

Es ist schon ewig her! Hoffe das ist sogar die richtige Klasse, aber da gehts los:

%Vor%     
Garg Unzola 13.04.2011 06:12
quelle
4

Falls jemand interessiert ist, habe ich es geschafft, einen fairen, funktionierenden Echokompensator zu bauen, indem ich im Grunde die Akustik umwandelt Echo Cancellation Methode von Paul R erwähnt , die ein verwendet Normalized Least Means Square Algorithmus und einige Filter von C in Java. Die JNI-Route ist wahrscheinlich immer noch ein besserer Weg, aber ich bleibe lieber bei reinem Java, wenn irgend möglich. Indem ich gesehen habe, wie ihre Filter funktionieren und viel über Filter auf DSP-Tutor lesen, habe ich es geschafft, etwas Kontrolle darüber zu bekommen, wie viel Geräusche werden entfernt und wie man hohe Frequenzen usw. entfernt.

Einige Tipps:

  1. Denken Sie daran, was Sie von wo entfernen. Ich musste das ein paar Mal umschalten.
  2. Die wichtigste Variable dieser Methode ist die Konvergenzrate. Dies ist die Variable namens Stepsize im obigen Link-Code.
  3. Ich habe die einzelnen Komponenten nacheinander genommen, herausgefunden, was sie gemacht haben, sie gebaut und sie getrennt getestet. Zum Beispiel habe ich den Double Talk Detector genommen und getestet, um sicherzustellen, dass er funktioniert. Dann nahm ich die Filter nacheinander und testete sie auf Audiodateien, um sicherzustellen, dass sie funktionierten, dann nahm ich das normalisierte Quadrat und prüfte es, bevor ich alles zusammenstellte.

Hoffe das hilft jemand anderem!

    
Garg Unzola 23.09.2010 08:48
quelle
4

Verwenden Sie die Speex AEC . Es ist Open Source, es ist in C geschrieben (benutze es mit JNI), und es funktioniert. Ich habe es erfolgreich in 2 verschiedenen VoIP-Anwendungen verwendet und es wird das meiste Echo abgebrochen.

    
SirKnigget 09.03.2011 14:21
quelle
1

Dies ist ein sehr komplexer Bereich und um eine brauchbare AEC-Lösung zum Laufen zu bringen, müssen Sie ziemlich viel R & amp; D machen. Alle guten AECs sind proprietär, und es gibt eine Menge mehr zur Echokompensation als nur die Implementierung eines adaptiven Filters wie LMS. Ich schlage vor, dass Sie Ihren Echokompensationsalgorithmus zuerst mit MATLAB (oder Octave) entwickeln - wenn Sie etwas haben, das mit "echten" Telecomms recht gut zu funktionieren scheint, dann können Sie den Algorithmus in C implementieren und in Echtzeit testen / evaluieren. Sobald dies funktioniert, können Sie JNI verwenden, um die C-Implementierung von Java aus aufzurufen.

    
Paul R 04.08.2010 06:45
quelle