我想知道是否有人知道如何在 iOS 上的两个音频信号之间执行互相关。
我想将我在接收器处获得的FFT窗口(我从麦克风接收信号)与发射器(正在播放音频轨道)的那些对齐,即确保第一个样本发射机上的每个窗口(除了“同步”时段)也将是接收机的第一个窗口。
我在传输的音频的每个块中注入一个已知波形(在频域中)。我想通过已知波形和接收信号之间的互相关来估计延迟(通过几个连续的块),但我不知道该怎么做。
看起来有方法vDSP_convD
来做,但我不知道如何使用它以及我是否首先必须执行样本的真实FFT(可能是的,因为我必须通过双[])。
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
)
答案 0 :(得分:1)
vDSP_convD()
函数计算两个输入向量的卷积以产生结果向量。您不太可能想要在频域中进行卷积,因为您正在寻找时域结果 - 尽管如果您已经因某些其他原因已经有FFT,可以选择将它们相乘而不是对时域序列进行卷积(但在这种情况下,要获得结果,您需要执行逆DFT以再次返回时域。)
当然,假设我理解正确。
然后,一旦得到vDSP_convD()
的结果,您就会想要找到最高值,这将告诉您信号最强相关的位置。您可能还需要处理输入信号中没有足够的参考信号的情况,在这种情况下,您可能希望(例如)忽略某个级别以下的结果向量中的值。
答案 1 :(得分:1)
互相关是解决方案,是的。但是你需要处理许多障碍。如果从音频文件中获取样本,则它们包含填充,其中互相关函数不喜欢。与所有这些样本进行相关性也非常低效 - 这需要花费大量时间。我制作了一个示例代码,演示了两个音频文件的时移。如果您对该示例感兴趣,请查看我的Github Project。