我想检测的声音有些回声来自麦克风。 回声将是周期性的,并在两个可能偏移的一个。 我听说,我需要以检测这些回波的存在自动关联的信号的频谱。 使用加速框架,展示了如何检测的音频数据相呼应你能提供的代码?
Answer 1:
我不完全知道为什么你最好的自动关联倒谱。 自相关性,虽然给你,所以我想你想只汽车相关的信号是关系到倒谱表示。
在其最简单的形式,它被执行如下:
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_conv功能:
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];
}
所以,现在你有你的自相关,你怎么用它做什么?
那么在中间首先对你会有最高峰。 这就是零延迟点。 那么,什么你想要做的就是扫描到这个中央峰的识别次级峰值的权利。 如果哟是在一个特定的寻找一个特定峰值偏移就可以了,简单地说,从中央峰检查的样本数量,并检查是否有一个峰值出现。 如果没有,那么你正在寻找的信号是不存在的。 如果它的存在,该信号是存在的。
编辑 :它值得注意的是,有512样本宽的窗口,如果你正在寻找的滞后超出约128它可能无法获得足够的相关信号是spottable。 的相关性的工作原理是在采样数据的重复信号的分提供峰值。 在128滞后你有那点足够的数据来重复4次。 在256,你只能看到点重复两次。 这将影响相关峰的高度。 256之后,你可能不反对只是随机的可重复性因素,在所有发现的高峰期。 这就是说,虽然,尝试不同的窗口大小,看看有什么可以为您提供最可靠的结果。
Answer 2:
自相关是基本上与其自身的信号,它基本上在信号本身检测相似性的一个互相关,通过在一定的时间延迟。 这实际上是搜索的信号回波的好主意。 虽然我不能给你最准确和正确的解决方案,你将能够使用下面的链接中找到的信息来编写你自己的。
有对这个已经有一些答案:
- 目标C -音频延迟估计互相关
- https://dsp.stackexchange.com/questions/736/how-do-i-implement-cross-correlation-to-prove-two-audio-files-are-similar
- 与vDSP_conv从苹果执行自相关框架加速
存在用于VDSP(加速框架)在Github通过注:Kunal Kandekar可用的源代码。 这可能是一个很好的起点。
https://github.com/kunalkandekar/vDSPxcorr
Answer 3:
如果您知道回声延迟长度您可以构建一个更为高效过滤器:
https://dsp.stackexchange.com/questions/14951/trivial-echo-separation
你在哪里读书用倒?