自动关联倒谱

我试图检测来自麦克风的声音中的一些回声。 回声将是周期性的,并有两种可能的偏移之一。 我听说我需要自动关联信号的倒频谱来检测这些回波的存在。 你能否使用Accelerate框架提供代码,显示如何检测audio数据中的回声?

我不完全确定你为什么会自动关联倒谱。 但是,自动关联可以为您提供一个与倒频谱相关的表示,所以我假设您只想自动关联信号。

最简单的forms如下:

int sample = 0; int sampleMax = inSize; while( sample < sampleMax ) { vDSP_vsmul( pInput, 1, pInputSample, tempBuffer, 1, sampleMax ); const size_t kAutoCorrWritePos = outSize - sampleMax - sample; vDSP_vsadd( &pOutput[kAutoCorrWritePos], 1, tempBuffer, 1, &pOutput[kAutoCorrWritePos], 1, sampleMax ) sample++; } 

然而,这是一个非常缓慢的操作。 值得庆幸的是,关联可以用几种不同的方式进行。 最快的方法是执行FFT,将复数值乘以它们自己的共轭,然后反转fft。

或者在iOS中,你有很好的优化的vDSP_convfunction:

 std::vector< float > paddedBuffer( (inSize + inSize) - 1 ); memcpy( &paddedBuffer.front(), pInput, sizeof( float ) * inSize ); vDSP_conv( &paddedBuffer.front(), 1, (float*)pInput, 1, (float*)pOutput + (inSize - 1), 1, inSize, inSize ); // Reflect the auto correlation for the true output. int posWrite = (inSize - 1); int posRead = (inSize - 1); while( posWrite > 0 ) { posWrite--; posRead++; pOutput[posWrite] = pOutput[posRead]; } 

所以现在你有自动关联,你用它做什么?

那么首先在中间你会有最高的峰值。 这是零滞后点。 然后你想要做的是扫描到这个中央峰的右侧,以确定二级峰。 如果你正在寻找一个特定的偏移量的特定峰值,你可以简单地检查中心峰值的样本数量,并检查是否有峰值。 如果没有,那么你正在寻找的信号不在那里。 如果在那里,信号就在那里。

编辑 :值得注意的是,如果您观察的滞后时间超过了128,那么在512个样本宽的窗口内,可能无法获得足够的相关信号。 通过在样本数据中的重复信号的点处提供峰值,相关性起作用。 在128的滞后你有足够的数据,该点重复4次。 在256你只能看到两个点重复。 这会影响相关峰的高度。 在256之后,您可能不会发现峰值与随机可重复性因素。 这就是说,虽然,尝试不同的窗口大小,看看什么为您提供最可靠的结果。

自相关基本上是一个信号与自身的互相关,它基本上是通过一定的时间延迟来检测信号本身的相似性。 在信号中寻找回波实际上是一个好主意。 虽然我不能给你最准确和最正确的解决scheme,你应该可以使用下面的链接find你自己的信息。

已经有一些答案了:

有源代码可用于由Kunal Kandekar在Github上的vDSP(加速框架)。 这可能是一个很好的起点。

https://github.com/kunalkandekar/vDSPxcorr

如果你知道回声延迟长度,你可以构build一个更有效的滤波器:

https://dsp.stackexchange.com/questions/14951/trivial-echo-separation

你在哪里阅读使用倒谱?