Ich implementiere eine VOIP-Anwendung, die reines Java verwendet. Es gibt ein Echo-Problem, das auftritt, wenn Benutzer keine Headsets verwenden (hauptsächlich bei Laptops mit integrierten Mikrofonen).Akustische Echokompensation in Java
Was zur Zeit geschieht
die Schrauben und Muttern der VoIP-Anwendung ist nur die einfachen Datenleitungen von Java Media Framework. Im Wesentlichen möchte ich eine digitale Signalverarbeitung an Audiodaten vornehmen, bevor ich sie zur Ausgabe an den Lautsprecher schreibe.
public synchronized void addAudioData(byte[] ayAudioData)
{
m_oBuffer.enqueue(ayAudioData);
this.notify();
}
Wie Sie sehen können, kommen die Audiodaten an und werden in einen Puffer eingereiht. Dies dient dazu, dubiose Verbindungen zu berücksichtigen und unterschiedliche Paketgrößen zu ermöglichen. Es bedeutet auch, dass ich auf so viele Audiodaten zugreifen kann, wie ich für irgendwelche ausgefallenen DSP-Operationen benötige, bevor ich die Audiodaten an die Lautsprecherlinie abspiele.
Ich habe einen Echokompensator, der funktioniert, aber es erfordert eine Menge interaktiver Benutzereingaben und ich möchte einen automatischen Echokompensator haben.
Manuelles Echokompensators
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;
}
Adaptive Filter
ich gelesen habe, dass adaptive filters der Weg zu gehen. Insbesondere ein Least-Mean-Squares-Filter. Ich stecke jedoch fest. Die meisten Beispiele für die obigen Beispiele sind in C und C++ und sie lassen sich nicht gut in Java übersetzen.
Hat jemand Tipps, wie man sie in Java implementiert? Alle anderen Ideen würden auch sehr geschätzt werden. Danke im Voraus.
ich dieses Acoustic Echo Cancellation sehr Führer finden, der sehr hilfreich bisher: http://www.andreadrian.de/echo_cancel/index.html –