Quais métodos podem ser usados ​​para identificar e remover eco de um sistema de áudio?


14

fundo

Estou projetando um sistema que terá um único microfone e alto-falantes pequenos para uso em uma configuração de tipo de telefone. O exemplo mais fácil que posso dar é uma conversa do Skype em que você usa os alto-falantes do computador e um microfone de mesa.

Estou preocupado com o áudio dos alto-falantes sendo captado pelo microfone e enviado de volta para a pessoa original. Eu costumava ouvir isso acontecer o tempo todo nos primeiros dias das conversas em VoIP, mas quase não ouvia mais.

Minha suposição é que os grupos criaram maneiras de cancelar o eco, mas como eles fazem isso?

Abordagens

Meu primeiro pensamento foi simplesmente subtrair o sinal que está sendo enviado para os alto-falantes do sinal do microfone, exceto com esse método que você precisa se preocupar com o atraso. Não tenho certeza de como determinar qual é o atraso sem algum tipo de pré-calibração, o que eu gostaria de evitar. Há também a questão de quanto dimensionar o sinal antes de subtraí-lo.

Em seguida, pensei em fazer algum tipo de correlação entre o sinal do alto-falante e o sinal do microfone, a fim de determinar a probabilidade de o sinal do microfone ser um eco, além de poder determinar o atraso real. Esse método foi capaz de funcionar bem quando eu estava tocando com alguns sinais gravados, mas parecia haver latência muito grande para calcular a correlação para ser útil no sistema em tempo real. Além disso, o volume ajustável nos alto-falantes dificultava determinar se algo estava realmente correlacionado ou não.

Meu próximo pensamento é que deve haver alguém na internet que fez isso antes com sucesso, mas não encontrou grandes exemplos. Então, eu venho aqui para ver quais métodos podem ser usados ​​para resolver esse tipo de problema.


1
O cancelamento de eco acústico é uma grande área de assunto com muitos livros e décadas de trabalhos de pesquisa sobre o tema. Aqui está um SO Q & A sobre o tema: stackoverflow.com/questions/3403152/acoustic-echo-cancellation-in-java
hotpaw2

1
@ hotpaw2 Não sei por que o cancelamento do eco acústico no link Java não foi clicável.
Mark Booth

por favor me sugira, estou tentando cancelar o eco que é presença em um discurso, entrada para um único microfone em um auditório. Eu estou tentando isso como você mencionou filtro adaptativo, por isso você está dando sinal de referência como conversa final. mas eu não tenho aqui sinal de referência. meu sinal é eco do sinal original que está recebendo, digamos 500ms com o sinal do alto-falante para um microfone.

Respostas:


15

Você está certo. Existem muitos métodos de cancelamento de eco, mas nenhum deles é exatamente trivial. O método mais genérico e popular é o cancelamento de eco por meio de um filtro adaptável. Em uma frase, o trabalho do filtro adaptativo é alterar o sinal que está sendo reproduzido, minimizando a quantidade de informações provenientes da entrada.

Filtros adaptativos

Um filtro adaptável (digital) é um filtro que altera seus coeficientes e, eventualmente, converge para uma configuração ideal. O mecanismo para essa adaptação funciona comparando a saída do filtro com a saída desejada. Abaixo está um diagrama de um filtro adaptativo genérico:

insira a descrição da imagem aqui

Como você pode ver no diagrama, o sinal é filtrado por (convolvido com) para produzir o sinal de saída . Subtraímos do sinal desejado para produzir o sinal de erro . Observe que é um vetor de coeficientes, não um número (portanto, não escrevemos ). Como ele altera todas as iterações (todas as amostras), subscrevemos a coleção atual desses coeficientes com . Depois que é obtido, usamos-o para atualizarw n d [ n ] d [ n ] d [ n ] e [ n ] w n w [ n ] n e [ n ] w n w n d [ n ] d [ n ]x[n]wnd^[n]d^[n]d[n]e[n]wnw[n]ne[n]wnpor um algoritmo de atualização de escolha (mais sobre isso posteriormente). Se entrada e saída satisfizerem um relacionamento linear que não muda ao longo do tempo e com um algoritmo de atualização bem projetado, acabará convergindo para o filtro ideal e seguirá de perto .wnd^[n]d[n]

Cancelamento de eco

O problema do cancelamento de eco pode ser apresentado em termos de um problema de filtro adaptativo, no qual estamos tentando produzir alguma saída ideal conhecida dada uma entrada, encontrando o filtro ideal que satisfaça a relação entrada-saída. Em particular, quando você pega o fone de ouvido e diz "olá", ele é recebido do outro lado da rede, alterado pela resposta acústica de uma sala (se estiver sendo reproduzida em voz alta) e retornado à rede para voltar. para você como um eco. No entanto, como o sistema sabe como era o "hello" inicial e agora sabe como é o "hello" reverberado e atrasado, podemos tentar adivinhar qual é a resposta da sala usando um filtro adaptável. Então podemos usar essa estimativa, envolva todos os sinais recebidos com essa resposta de impulso (o que nos daria a estimativa do sinal de eco) e subtraia-o do que entra no microfone da pessoa que você chamou. O diagrama abaixo mostra um cancelador de eco adaptável.

insira a descrição da imagem aqui

Neste diagrama, seu sinal de "olá" é . Depois de ser tocado por um alto-falante, ricochetear nas paredes e ser pego pelo microfone do dispositivo, ele se torna um sinal de eco . O filtro adaptativo recebe e produz a saída que após a convergência deve rastrear idealmente o sinal eco . Portanto, deve eventualmente chegar a zero, dado que ninguém está falando do outro lado da linha, o que geralmente acontece quando você acabou de pegar o fone de ouvido e disse: "Olá". Isso nem sempre é verdade, e algumas considerações de casos não ideais serão discutidas mais adiante.x[n]d[n]wnx[n]y[n]d[n]e[n]=d[n]y[n]

Matematicamente, o filtro adaptativo NLMS (quadrado mínimo médio normalizado) é implementado da seguinte maneira. Atualizamos todas as etapas usando o sinal de erro da etapa anterior. Ou seja, vamoswn

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

onde é o número de toques (amostras) em . Observe quais amostras de estão na ordem inversa. E deixarNwnx

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

Então calculamos via (por convolução) localizando o produto interno (produto escalar se ambos os sinais são reais) de e :y[n]=xn=wn

y[n]=xnTwn=xnwn

Agora que podemos calcular o erro, estamos usando um método de descida de gradiente normalizado para minimizá-lo. Obtemos a seguinte regra de atualização para :w

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

onde é o tamanho da etapa de adaptação tal que .0 μ 2μ0μ2

Aplicações e desafios da vida real

Várias coisas podem apresentar dificuldades com esse método de cancelamento de eco. Antes de tudo, como mencionado anteriormente, nem sempre é verdade que a outra pessoa fica em silêncio enquanto recebe seu sinal de "olá". Pode ser mostrado (mas está além do escopo desta resposta) que, em alguns casos, ainda pode ser útil estimar a resposta ao impulso enquanto houver uma quantidade significativa de entrada presente na outra extremidade da linha, porque o sinal e o eco de entrada são assumiu ser estatisticamente independente; portanto, minimizar o erro ainda será um procedimento válido. Em geral, é necessário um sistema mais sofisticado para detectar bons intervalos de tempo para a estimativa do eco.

Por outro lado, pense no que acontece quando você está tentando estimar o eco quando o sinal recebido é aproximadamente silencioso (ruído, na verdade). Na ausência de um sinal de entrada significativo, o algoritmo adaptativo diverge e rapidamente começa a produzir resultados sem sentido, culminando eventualmente em um padrão aleatório de eco. Isso significa que também precisamos levar em consideração a detecção de fala . Os canceladores de eco modernos se parecem mais com a figura abaixo, mas a descrição acima é o ponto principal.

insira a descrição da imagem aqui

Há muita literatura sobre filtros adaptativos e cancelamento de eco por aí, além de algumas bibliotecas de código aberto nas quais você pode acessar.


2
"o trabalho do filtro adaptativo é com o sinal"? Você acidentalmente uma palavra.
endolith

@ endolith Obrigado. Eu não conseguia pensar em uma maneira agradável de consertá-lo, então usei alter . Você pode editá-lo com algo mais interessante. =)
Phonon

3

Não sei como determinar qual é o atraso sem algum tipo de pré-calibração

Eu começaria modificando um algoritmo de impressão digital acústica como o usado pelo Shazam .

Seus requisitos são semelhantes aos do Shazam de várias maneiras (os recursos devem sobreviver a um algoritmo de compactação projetado para telefonia, eles também passam por microfones de baixa qualidade); portanto, você provavelmente poderia usar os mesmos recursos (máximos locais de energia no espaço de tempo / frequência) convém aumentar a resolução do tempo às custas da resolução da frequência.

Há também a questão de quanto dimensionar o sinal antes de subtraí-lo.

A escala uniforme quase certamente não será precisa o suficiente. Você precisaria fazer algo como aproximar a resposta de frequência com um filtro FIR e passar o sinal do microfone (atrasado) pelo filtro invertido antes de subtraí-lo do sinal recebido.


A impressão digital do Shazam não pode produzir uma aproximação precisa do atraso. Ele usa muitos processos complexos de extração de recursos para comparar amostras de áudio, nem todas baseadas no tempo.
Phonon

@Phonon, o Shazam pode estar usando algoritmos adicionais agora, mas o do artigo vinculado é baseado em tempo e fornece uma boa estimativa do atraso.
finnw

Talvez algo como correlação cruzada dos espectrogramas enviados e recebidos lhe indique o atraso. Deve ser resistente a efeitos de filtragem e ruído adicionado
endolith 6/14
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.