Sto implementando un'applicazione VOIP che utilizza puro Java. C'è un problema di eco che si verifica quando gli utenti non usano cuffie (principalmente su laptop con microfoni incorporati).Cancellazione dell'eco acustico in Java
Cosa succede attualmente
I dadi e bulloni di l'applicazione VoIP è solo il datalines pianura di media framework di Java. In sostanza, mi piacerebbe eseguire alcune elaborazioni del segnale digitale sui dati audio prima di scriverlo all'altoparlante per l'output.
public synchronized void addAudioData(byte[] ayAudioData)
{
m_oBuffer.enqueue(ayAudioData);
this.notify();
}
Come si può vedere i dati audio arrivano e vengono inseriti in un buffer. Questo è per soddisfare le connessioni di dubbia e per consentire diverse dimensioni del pacchetto. Significa anche che ho accesso a tutti i dati audio di cui ho bisogno per le fantasiose operazioni DSP prima di riprodurre i dati audio sulla linea degli altoparlanti.
Ho gestito un cancellatore di eco che funziona, tuttavia richiede un sacco di input dell'utente interattivo e mi piacerebbe avere un cancellatore di eco automatico.
Manuale cancellazione 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;
}
filtri adattivi
Ho letto che adaptive filters sono la strada da percorrere. In particolare, un filtro dei minimi quadrati medi. Tuttavia, sono bloccato. La maggior parte dei codici di esempio per quanto sopra sono in C e C++ e non si traducono bene in Java.
Qualcuno ha consigli su come implementarli in Java? Altre idee sarebbero molto apprezzate. Grazie in anticipo.
ho trovato guidare questo Acoustic Echo Cancellation molto, molto disponibile finora: http://www.andreadrian.de/echo_cancel/index.html –