Estoy implementando una aplicación VOIP que usa Java puro. Hay un problema de eco que ocurre cuando los usuarios no usan auriculares (principalmente en computadoras portátiles con micrófonos incorporados).Cancelación de eco acústico en Java
Lo que sucede actualmente
Los aspectos prácticos de la aplicación VoIP es sólo las líneas de datos claros del marco de medios de Java. Esencialmente, me gustaría realizar un procesamiento de señal digital en datos de audio antes de escribirlo en el altavoz para su salida.
public synchronized void addAudioData(byte[] ayAudioData)
{
m_oBuffer.enqueue(ayAudioData);
this.notify();
}
Como puede ver, los datos de audio llegan y se colocan en un búfer. Esto es para abastecer conexiones poco confiables y para permitir diferentes tamaños de paquetes. También significa que tengo acceso a la mayor cantidad de datos de audio que necesito para cualquier operación elegante de DSP antes de reproducir los datos de audio en la línea de altavoces.
He conseguido un cancelador de eco que hace el trabajo, sin embargo, requiere una gran cantidad de entrada de usuario interactiva y me gustaría tener un cancelador de eco automática.
Manual cancelador de eco
public static byte[] removeEcho(int iDelaySamples, float fDecay, byte[] aySamples)
{
m_awDelayBuffer = new short[iDelaySamples];
m_aySamples = new byte[aySamples.length];
m_fDecay = (float) fDecay;
System.out.println("Removing echo");
m_iDelayIndex = 0;
System.out.println("Sample length:\t" + aySamples.length);
for (int i = 0; i < aySamples.length; i += 2)
{
// update the sample
short wOldSample = getSample(aySamples, i);
// remove the echo
short wNewSample = (short) (wOldSample - fDecay * m_awDelayBuffer[m_iDelayIndex]);
setSample(m_aySamples, i, wNewSample);
// update the delay buffer
m_awDelayBuffer[m_iDelayIndex] = wNewSample;
m_iDelayIndex++;
if (m_iDelayIndex == m_awDelayBuffer.length)
{
m_iDelayIndex = 0;
}
}
return m_aySamples;
}
filtros adaptativos
He leído que adaptive filters son el camino a seguir. Específicamente, un filtro de Mínimos Cuadrados Medios. Sin embargo, estoy atascado. La mayoría del código de muestra para lo anterior está en C y C++ y no se traducen bien en Java.
¿Alguien tiene consejos sobre cómo implementarlos en Java? Cualquier otra idea también sería muy apreciada. Gracias por adelantado.
yo encontramos este cancelación de eco acústico guía muy, muy útiles hasta el momento: http://www.andreadrian.de/echo_cancel/index.html –