Я реализовываю приложение 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? Любые другие идеи также значительно ценились бы.Заранее спасибо.
Это очень сложная область, и для того, чтобы получить пригодное для использования решение AEC, вам потребуется провести немало исследований и разработок. Все хорошие AEC являются проприетарными, и есть намного больше для подавления эха, чем просто реализация адаптивного фильтра, такого как LMS. Я предлагаю вам сначала разработать свой алгоритм подавления эха с использованием MATLAB (или Octave) - когда у вас есть что-то, что достаточно хорошо работает с «реальными» телекоммуникациями, вы можете реализовать алгоритм на C и протестировать / оценить его в реальном времени. Как только это сработает, вы можете использовать JNI для вызова реализации C из Java.