gpt4 book ai didi

ios - 自动关联倒谱

转载 作者:行者123 更新时间:2023-11-29 12:51:40 25 4
gpt4 key购买 nike

我正在尝试检测来自麦克风的声音中的一些回声。回波将是周期性的,并且处于两个可能的偏移量之一。我听说我需要自动关联信号的倒谱以检测这些回声的存在。您能否提供使用 Accelerate 框架的代码来展示如何检测音频数据中的回声?

最佳答案

我不完全确定为什么要自动关联倒谱。不过,自动相关为您提供了与倒谱相关的表示,因此我假设您只想自动关联您的信号。

最简单的形式如下:

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,则可能无法获得足够的相关信号来是显眼的。相关性通过在样本数据中的重复信号点提供峰值来起作用。在 128 的延迟时,您有足够的数据让该点重复 4 次。在 256 处,您只能看到该点重复两次。这将影响相关峰的高度。在 256 之后,您可能根本无法根据随机重复性因素发现峰值。尽管如此,还是要尝试不同的窗口大小,看看什么能为您提供最可靠的结果。

关于ios - 自动关联倒谱,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22305359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com