Акустическое эхоподавление в Java

Я реализовываю приложение 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? Любые другие идеи также значительно ценились бы.Заранее спасибо.

8
задан Garg Unzola 4 August 2010 в 09:16
поделиться

1 ответ

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

1
ответ дан 5 December 2019 в 12:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: