Ich arbeite an einem etwas ehrgeizigen Projekt, um eine aktive Lärmreduzierung auf Android mit Ohrhörern oder Kopfhörern zu erreichen.
Mein Ziel ist es, Umgebungsgeräusche mit dem Android-Phone-Mikrofon aufzunehmen, die Phase zu invertieren (eine einfache * -1 auf dem Short-Value aus der Audioaufnahme?) und die invertierte Wellenform über die Kopfhörer wiederzugeben. Wenn die Latenz und die Amplitude nahe beieinander liegen, sollte es eine gute Menge an mechanisch strukturiertem Rauschen in der Umgebung aufheben.
Folgendes habe ich bis jetzt:
%Vor%Ich war momentan aufgeregt, als ich feststellte, dass die Android-API bereits einen NoiseSuppression-Algorithmus hat (Sie werden sehen, dass er oben kommentiert wurde). Ich habe es getestet und festgestellt, dass NoiseSuppressor nicht viel getan hat, um konstante Töne zu eliminieren, was mich zu der Annahme verleitet, dass es nur einen Bandpassfilter bei nicht-vokalen Frequenzen durchführt.
Also, meine Fragen:
1) Der obige Code benötigt etwa 250-500ms von der Mikrofonaufnahme durch die Wiedergabe in Kopfhörern. Diese Latenz ist schlecht und es wäre großartig, sie zu reduzieren. Irgendwelche Vorschläge würden geschätzt.
2) Ungeachtet dessen, wie eng die Latenz ist, ist mein Verständnis, dass die Wiedergabesignalform einen Phasenoffset von der tatsächlichen Umgebungsrauschwellenform aufweist. Dies deutet darauf hin, dass ich eine Art Wellenformvergleich durchführen muss, um diesen Offset zu berechnen und zu kompensieren. Gedanken darüber, wie das berechnet wird?
3) Wie sieht das aus, wenn es um die Latenzkompensation geht? Ich habe eine Reihe von Shorts in jedem Zyklus, also wie würde eine 30ms oder 250ms Latency aussehen?
Ich bin mir der grundsätzlichen Probleme bei diesem Ansatz bewusst, dass der Ort, an dem das Telefon nicht neben dem Kopf ist, wahrscheinlich einen Fehler verursacht, aber ich bin hoffnungsvoll mit einer dynamischen oder festen Latenzkorrektur, die vielleicht möglich ist um es zu überwinden.
Danke für Anregungen.
Auch wenn Sie etwas gegen die Latenz unternehmen konnten, ist das ein schwieriges Problem, da Sie nicht wissen, wie weit das Telefon vom Ohr entfernt ist. Außerdem gibt es die Tatsache, dass die Entfernung nicht festgelegt ist (da der Benutzer die Maus bewegt) Telefon), plus die Tatsache, dass Sie kein Mikrofon für jedes Ohr haben (so können Sie nicht wissen, was die Welle an einem Ohr sein wird, bis es da ist, selbst wenn Sie keine Latenz haben)
Nachdem Sie das gesagt haben, können Sie möglicherweise etwas tun, das stark periodische Wellenformen abbrechen könnte. Alles was Sie tun können, ist es dem Benutzer zu ermöglichen, die Zeitverzögerung für jedes Ohr manuell einzustellen. Da Sie keine Mikrofone in der Nähe der Ohren haben, können Sie in Ihrem Code nicht wissen, ob Sie es sind das Problem besser oder schlechter machen.
Bevor Sie einen NoiseSuppressor hinzufügen, müssen Sie prüfen, ob einer verfügbar ist:
%Vor%Ein weiterer interessanter Punkt ist AcousticEchoCanceler
Die Audiolatenz sollte seit KitKat behoben sein. Sehen Sie sich dieses und dies .
Tags und Links android audio signal-processing audiorecord noise-reduction