Quelles méthodes peuvent être utilisées pour identifier et supprimer l'écho d'un système audio?

14

Contexte

Je conçois un système qui aura un seul petit microphone et des haut-parleurs pour une utilisation dans un cadre de type téléphone. L'exemple le plus simple que je puisse donner est une conversation Skype où vous utilisez les haut-parleurs de votre ordinateur et un microphone de bureau.

Je crains que le son des haut-parleurs ne soit capté par le microphone et renvoyé à la personne d'origine. J'avais l'habitude d'entendre cela se produire tout le temps dans les premiers jours des conversations VoIP, mais je ne l'entends presque plus.

Mon hypothèse est que les groupes ont trouvé des moyens d'annuler l'écho, mais comment le font-ils?

Approches

Ma première pensée a été de simplement soustraire le signal envoyé aux haut-parleurs du signal du microphone, sauf qu'avec cette méthode, vous devez vous préoccuper du retard. Je ne sais pas comment déterminer le retard sans une sorte de pré-étalonnage, que j'aimerais éviter. Il y a aussi la question de savoir dans quelle mesure mettre le signal à l'échelle avant de le soustraire.

J'ai ensuite pensé à faire une sorte de corrélation entre le signal du haut-parleur et le signal du micro afin de déterminer la probabilité que le signal du micro soit un écho et de pouvoir déterminer le retard réel. Cette méthode a pu fonctionner correctement lorsque je jouais avec des signaux enregistrés, mais il semblait y avoir une latence trop grande dans le calcul de la corrélation pour être utile dans un système en temps réel. De plus, le volume réglable des haut-parleurs rendait difficile de déterminer si quelque chose était réellement corrélé ou non.

Ma prochaine pensée est qu'il doit y avoir quelqu'un sur Internet qui l'a déjà fait avec succès, mais n'a pas trouvé de bons exemples. Je viens donc ici pour voir quelles méthodes peuvent être utilisées pour résoudre ce type de problème.

Kellenjb
la source
1
L'annulation de l'écho acoustique est un vaste sujet avec de nombreux livres et des décennies de documents de recherche sur le sujet. Voici un SO Q&A sur le sujet: stackoverflow.com/questions/3403152/acoustic-echo-cancellation-in-java
hotpaw2
1
@ hotpaw2 Vous ne savez pas pourquoi votre annulation d'écho acoustique dans le lien Java n'était pas cliquable.
Mark Booth
veuillez me suggérer, j'essaye d'annuler l'écho qui est la présence dans un discours, entrée à un seul microphone dans un auditorium. je l'essaye car vous avez mentionné le filtre adaptatif, pour cela vous donnez le signal de référence comme conversation de fin. mais je n'ai pas ici de signal de référence. mon signal est l'écho du signal d'origine qui reçoit disons 500 ms avec le signal du haut-parleur à un microphone.

Réponses:

15

Vous avez raison. Il existe de nombreuses méthodes d'annulation d'écho, mais aucune d'entre elles n'est exactement triviale. La méthode la plus générique et la plus populaire est l'annulation d'écho via un filtre adaptatif. En une phrase, le travail du filtre adaptatif consiste à modifier le signal en cours de lecture en minimisant la quantité d'informations provenant de l'entrée.

Filtres adaptatifs

Un filtre adaptatif (numérique) est un filtre qui change ses coefficients et converge finalement vers une configuration optimale. Le mécanisme de cette adaptation fonctionne en comparant la sortie du filtre à une sortie souhaitée. Voici un schéma d'un filtre adaptatif générique:

entrez la description de l'image ici

Comme vous pouvez le voir sur le diagramme, le signal est filtré par (convoluée avec) w n pour produire le signal de sortie d [ n ] . Nous avons ensuite soustraction d [ n ] du désiré le signal d [ n ] pour produire l' erreur le signal e [ n ] . Notez que w n est un vecteur de coefficients, pas un nombre (donc nous n'écrivons pas w [ n ]x[n]wnd^[n]d^[n]d[n]e[n]wnw[n]). Parce qu'il change à chaque itération (chaque échantillon), nous indexons la collection actuelle de ces coefficients avec . Une fois e [ n ] obtenu, nous l'utilisons pour mettre à jour w n par un algorithme de mise à jour de choix (plus de détails plus loin). Si l' entrée et la sortie satisfont à une relation linéaire qui ne change pas au fil du temps et donné un algorithme de mise à jour bien conçu, w n finira par converger vers le filtre optimal et d [ n ] sera suivi de près d [ n ] .ne[n]wnwnd^[n]d[n]

Annulation d'écho

Le problème de l'annulation d'écho peut être présenté en termes de problème de filtre adaptatif où nous essayons de produire une sortie idéale connue à partir d'une entrée en trouvant le filtre optimal satisfaisant la relation entrée-sortie. En particulier, lorsque vous saisissez votre casque et dites «bonjour», il est reçu à l'autre bout du réseau, modifié par la réponse acoustique d'une pièce (s'il est lu à haute voix), et réinjecté dans le réseau pour revenir en arrière. à vous comme un écho. Cependant, parce que le système sait à quoi ressemblait le "bonjour" initial et qu'il sait maintenant à quoi ressemble le "bonjour" réverbéré et retardé, nous pouvons essayer de deviner à quoi ressemble la réponse de cette pièce en utilisant un filtre adaptatif. Ensuite, nous pouvons utiliser cette estimation, convoluez tous les signaux entrants avec cette réponse impulsionnelle (qui nous donnerait l'estimation du signal d'écho) et soustrayez-le de ce qui entre dans le microphone de la personne que vous avez appelée. Le diagramme ci-dessous montre un annuleur d'écho adaptatif.

entrez la description de l'image ici

x[n]d[n]wnx[n]y[n]d[n]e[n]=d[n]y[n]

wn

xn=(x[n],x[n1],,x[nN+1])T

Nwnx

wn=(w[0],w[1],,x[N1])T

y[n]=xn=wn

y[n]=xnTwn=xnwn

w

wn+1=wn+μxne[n]xnTxn=wn+μxnxnTwnd[n]xnTxn

μ0μ2

Applications et défis réels

Plusieurs choses peuvent présenter des difficultés avec cette méthode d'annulation d'écho. Tout d'abord, comme mentionné précédemment, il n'est pas toujours vrai que l'autre personne se taise pendant qu'elle reçoit votre signal «bonjour». Il peut être montré (mais dépasse le cadre de cette réponse) que dans certains cas, il peut être utile d'estimer la réponse impulsionnelle alors qu'une quantité importante d'entrée est présente à l'autre extrémité de la ligne car le signal d'entrée et l'écho sont supposé être statistiquement indépendant; par conséquent, minimiser l'erreur sera toujours une procédure valide. En général, un système plus sophistiqué est nécessaire pour détecter de bons intervalles de temps pour l'estimation de l'écho.

D'un autre côté, pensez à ce qui se passe lorsque vous essayez d'estimer l'écho lorsque le signal reçu est approximativement silencieux (bruit, en fait). En l'absence d'un signal d'entrée significatif, l'algorithme adaptatif divergera et commencera rapidement à produire des résultats sans signification, aboutissant éventuellement à un écho aléatoire. Cela signifie que nous devons également prendre en considération la détection de la parole . Les annuleurs d'écho modernes ressemblent plus à la figure ci-dessous, mais la description ci-dessus en est l'essentiel.

entrez la description de l'image ici

Il existe de nombreuses publications sur les filtres adaptatifs et l'annulation d'écho, ainsi que sur certaines bibliothèques open source dans lesquelles vous pouvez puiser.

Phonon
la source
2
"le travail du filtre adaptatif est au signal"? Vous accidentellement un mot.
endolith
@endolith Merci. Je ne pouvais pas penser à une bonne façon de le réparer, alors j'ai utilisé alter . Vous êtes invités à le modifier avec quelque chose de plus intéressant. =)
Phonon
3

Je ne sais pas comment déterminer le retard sans une sorte de pré-calibrage

Je commencerais par modifier un algorithme d'empreinte digitale acoustique tel que celui utilisé par Shazam .

Vos exigences sont similaires à celles de Shazam à bien des égards (les fonctionnalités doivent survivre à un algorithme de compression conçu pour la téléphonie, elles passent également par des microphones de faible qualité), vous pouvez donc probablement utiliser les mêmes fonctionnalités (maxima locaux de puissance dans l'espace temps / fréquence). vous souhaiterez peut-être augmenter la résolution temporelle au détriment de la résolution en fréquence.

Il y a aussi la question de savoir dans quelle mesure mettre le signal à l'échelle avant de le soustraire.

Une mise à l'échelle uniforme ne sera certainement pas assez précise. Vous devriez faire quelque chose comme approximer la réponse en fréquence avec un filtre FIR puis passer votre signal micro (retardé) à travers le filtre inversé avant de le soustraire du signal reçu.

finnw
la source
Les empreintes digitales Shazam ne peuvent pas produire une approximation précise du retard. Il utilise de nombreux processus d'extraction de fonctionnalités complexes pour comparer des échantillons audio, qui ne sont pas tous basés sur le temps.
Phonon
@Phonon, Shazam utilise peut-être des algorithmes supplémentaires maintenant, mais celui du document lié est basé sur le temps et donne une bonne estimation du retard.
finnw
Peut-être que quelque chose comme la corrélation croisée des spectrogrammes envoyés et reçus vous indiquerait le retard. Devrait être résistant aux effets du filtrage et au bruit ajouté
endolith