我正在实现一个使用纯Java的VOIP应用程序.当用户不使用耳机时(主要是带有内置麦克风的笔记本电脑),会出现回声问题.
目前发生了什么
VOIP应用程序的细节只是Java媒体框架的简单数据.基本上,我想在将音频数据写入扬声器输出之前对音频数据执行一些数字信号处理.
public synchronized void addAudioData(byte[] ayAudioData)
{
m_oBuffer.enqueue(ayAudioData);
this.notify();
}
Run Code Online (Sandbox Code Playgroud)
如您所见,音频数据到达并在缓冲区中排队.这是为了迎合狡猾的连接并允许不同的数据包大小.这也意味着在我将音频数据播放到扬声器线路之前,我可以访问任何花哨的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]); …Run Code Online (Sandbox Code Playgroud)