Pergunta

Como subtrair uma onda de áudio de outra? Em geral e em C# (ou se não podemos fazê -lo em C# em C/C ++)

Eu tenho onda sonora A e onda sonora B (btw: eles estão no PCM), quero subtrair B de um

O que eu preciso? LIBs de código aberto (não GPL, mas LGPL estará OK) Tutoriais sobre como fazer essa operação (com ou sem usar LIBS) Artigos sobre este tópico

PS: É tudo sobre AEC…

Foi útil?

Solução

Se as amostras forem normalizadas para o mesmo nível e forem armazenadas em um formato assinado, de modo que o "nível zero" seja 0 ou 0.0, A resposta é bastante simples:

S_C = (S_A / 2) - (S_B / 2);

para cada amostra S_A e S_B em A e B.

Se você estiver usando valores não assinados para as amostras, precisará fazer mais trabalho: primeiro, precisará convertê -los em um valor assinado com um centro zero (por exemplo, se você tiver amostras não assinadas de 16 bits, subtraia 32768 de cada), Em seguida, aplique a fórmula e converta -os novamente no formato não assinado. Tenha cuidado com o transbordamento - aqui está um exemplo de como fazer as conversões para as amostras de 16 bits acima mencionadas:

#define PCM_16U_ZERO 32768

short pcm_16u_to_16s(unsigned short u)
{
    /* Ensure that we never overflow a signed integer value */
    return (u < PCM_16U_ZERO) ? (short)u - PCM_16U_ZERO : (short)(u - PCM_16U_ZERO);
}

unsigned short pcm_16s_to_16u(short s)
{
    /* As long as we convert to unsigned before the addition, unsigned arithmetic
       does the right thing */
    return (unsigned short)s + PCM_16U_ZERO;
}

Outras dicas

https://stackoverflow.com/questions/1723563/acoustic-echo-cancellation-aec-in-wpf-with-c Faz uma pergunta semelhante e tem uma resposta aceita. A biblioteca sugerida tem algum tipo de cancelamento de eco, eu acho.

Infelizmente, não não usei nenhuma biblioteca de áudio de código aberto. Eu tenho usado Fmod Para processar áudio antes, não me lembro de haver nenhum AEC, mas você pode ter acesso ao áudio bruto à medida que o processa e executar seu próprio código nele.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top