Pregunta

Como restar una onda de audio de otro? En general y en C # (o si no podemos hacerlo en C # en C / C ++)

Tengo la onda A de sonido y de la onda B de sonido (BTW: están en PCM) Quiero restar B de A

¿Qué necesito? Liberaciones de código abierto (NO GPL, LGPL, pero será bien) Tutoriales sobre cómo hacer tal operación (con o sin el uso de bibliotecas) Artículos sobre este tema

PS: se trata de AEC ...

¿Fue útil?

Solución

Si las muestras se normalizan al mismo nivel, y se almacenan en un formato firmado tal que el "nivel cero" es 0 o 0.0, la respuesta es bastante simple:

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

para cada S_A muestra y S_B en A y B.

Si está utilizando valores sin signo de las muestras, entonces tendrá que hacer más trabajo: en primer lugar, es necesario convertirlos a un valor firmado con un centro de cero (por ejemplo, si usted tiene 16 muestras sin firmar bits, restar 32768 de cada uno), a continuación, aplicar la fórmula, a continuación, convertirlos de nuevo al formato sin signo. Tenga cuidado de desbordamiento - aquí está un ejemplo de cómo hacer las conversiones para las mencionadas muestras de 16 bits:

#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;
}

Otros consejos

https://stackoverflow.com/questions/1723563/acoustic -echo-cancelación-AEC-en-WPF-con-c hace una pregunta similar y tiene una respuesta aceptada. La biblioteca sugerido tiene algún tipo de cancelación de eco que pienso.

Por desgracia no tengo no se utiliza ninguna biblioteca de audio de código abierto. He utilizado Fmod para procesar audio antes, no recuerdo que hubiera ninguna AEC en ella, pero puede obtener acceso al audio en bruto, ya que lo procesa y ejecuta su propio código en él.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top