目标C – audio延迟估计的互相关

我想知道是否有人知道如何在iOS上执行两个audio信号之间的互相关

我想将我在接收器(我接收来自麦克风的信号)上获得的FFT窗口与发射器(它正在播放音轨)中的FFT窗口alignment,即确保每个窗口的第一个样本除了“同步”期间)发射机也将是接收机的第一个窗口。

我在每个传输的audio块中注入一个已知的波形(在频域中)。 我想通过已知波形和接收信号之间的互相关(通过几个连续的块)来估计延迟,但我不知道该怎么做。

看起来好像有vDSP_convD的方法来做,但我不知道如何使用它,以及我是否首先必须执行样本的真正的FFT(可能是的,因为我必须通过double [])。

 void vDSP_convD ( const double __vDSP_signal[], vDSP_Stride __vDSP_signalStride, const double __vDSP_filter[], vDSP_Stride __vDSP_strideFilter, double __vDSP_result[], vDSP_Stride __vDSP_strideResult, vDSP_Length __vDSP_lenResult, vDSP_Length __vDSP_lenFilter ) 

vDSP_convD()函数计算两个input向量的卷积以产生结果向量。 因为您正在寻找时域结果,所以您不太可能想要在频域中进行卷积,因为您正在寻找时域结果 – 但是,如果您因为其他原因而已经有了FFT,则select将它们相乘而不是卷积时域序列(但在这种情况下,为了得到你的结果,你将需要执行一个逆DFT以重新回到时域)。

当然,假设我正确地理解你。

然后,一旦你从vDSP_convD()得到结果,你会想要寻找最高的值,这将告诉你信号最强关联的地方。 您可能还需要处理input信号中没有足够的参考信号的情况,在这种情况下,您可能希望(例如)忽略低于某个特定水平的结果向量中的值。

互相关是解决办法,是的。 但是你需要处理很多障碍。 如果从audio文件中获取样本,则它们包含互相关函数不喜欢的填充。 与所有这些样本进行关联也是非常低效的 – 这需要花费大量的时间。 我已经做了一个示例代码,演示了两个audio文件的时移。 如果你对样本感兴趣,看看我的Github项目 。