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.
Respostas:
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:
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 atualizar→ w 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 ] W⃗ n d^[ n ] d^[ n ] d[ n ] e [ n ] W⃗ n w [ n ] n e [ n ] W⃗ n por 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 .W⃗ n d^[ 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.
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 ] W⃗ n x [ 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, vamosW⃗ n
onde é o número de toques (amostras) em . Observe quais amostras de estão na ordem inversa. E deixarN W⃗ n x
Então calculamos via (por convolução) localizando o produto interno (produto escalar se ambos os sinais são reais) de e :y[ n ] = x⃗ n = w⃗ n
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⃗
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.
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.
fonte
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.
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.
fonte