我不完全确定您为什么要自动关联倒谱。但是,自动相关为您提供了与倒谱相关的表示,因此我假设您只想自动关联您的信号。
最简单的形式如下:
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];
}
所以现在你有了自动关联,你会用它做什么?
首先在中间,您将拥有最高峰。这是零滞后点。然后您要做的是扫描该中心峰的右侧以识别次峰。如果您正在寻找特定偏移处的特定峰,您可以简单地检查中心峰上的样本数并检查那里是否有峰。如果没有,那么您正在寻找的信号不存在。如果它在那里,信号就在那里。
编辑:值得注意的是,如果您正在查看的延迟超过约 128,则使用 512 样本宽的窗口可能无法获得足够的相关信号以可以发现。相关性通过在样本数据中的重复信号点处提供峰值来起作用。在 128 的延迟时,您有足够的数据来重复该点 4 次。在 256 处,您只能看到该点重复两次。这将影响相关峰的高度。在 256 之后,您可能根本无法仅针对随机重复性因素发现峰值。尽管如此,您可以尝试不同的窗口大小,看看什么可以为您提供最可靠的结果。