Я реализую приложение VOIP, которое использует чистую Java. Существует проблема эха, которая возникает, когда пользователи не используют гарнитуры (в основном на ноутбуках со встроенными микрофонами).
Что сейчас происходит
Основные черты приложения VOIP - это простые данные медиа-инфраструктуры Java. По сути, я хотел бы выполнить некоторую цифровую обработку сигнала для аудиоданных, прежде чем записать их в динамик для вывода.
public synchronized void addAudioData(byte[] ayAudioData)
{
m_oBuffer.enqueue(ayAudioData);
this.notify();
}
Как видите, аудиоданные поступают и помещаются в буфер. Это должно обслуживать хитрые соединения и учитывать разные размеры пакетов. Это также означает, что у меня есть доступ к столько аудиоданных, сколько мне нужно для любых необычных операций DSP, прежде чем я воспроизведу аудиоданные на линию динамика.
Я управлял одним эхоподавителем, который работает, однако он требует много интерактивного ввода данных пользователем, и я хотел бы иметь автоматический эхоподавитель.
Ручной эхоподавитель
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;
}
Адаптивные фильтры
Я читал, что адаптивные фильтры - это путь. В частности, фильтр наименьших средних квадратов. Тем не менее, я застрял. Большинство примеров кода для вышеперечисленного написаны на C и C ++, и они плохо переводятся на Java.
У кого-нибудь есть советы, как реализовать их на Java? Любые другие идеи также будут высоко оценены. Заранее спасибо.