两个音频信号之间的时间延迟估计

时间:2011-02-11 09:33:40

标签: algorithm signal-processing delay timedelay

我有2个不同麦克风的同一信号的两个录音(例如,WAV格式),但其中一个录音有延迟,例如几秒钟。

在某种波形观察器中查看这些信号时,很容易直观地识别出这种延迟 - 即只是发现每个信号中的第一个可见峰值,并确保它们的形状相同:

http://www.greycat.ru/temp/time-delay-peaks.png

但是我如何以编程方式进行 - 找出这个延迟(t)是什么?两个数字化信号略有不同(因为麦克风不同,由于ADC设置等原因位于不同位置)。

我已经挖了一下,发现这个问题通常被称为“时间延迟估计”,它有无数的方法 - 例如,one of them

但是有没有简单的现成解决方案,例如命令行实用程序,库或直接算法?

结论:我发现没有简单的实现,并且自己完成了一个简单的命令行实用程序 - 可在https://bitbucket.org/GreyCat/calc-sound-delay获得(GPLv3许可)。它实现了Wikipedia中描述的非常简单的最大搜索算法。

3 个答案:

答案 0 :(得分:14)

您正在寻找的技术称为cross correlation。这是一种非常简单的,如果有点计算密集型技术,可用于解决各种问题,包括测量两个相似信号之间的时间差(又名 lag )(信号不需要相同)。

如果您对滞后值(或至少是预期的滞后值范围)有一个合理的概念,那么您可以大大减少计算总量。同上,如果你能对你需要的准确度有明确的限制。

答案 1 :(得分:1)

非常直接的事情就是检查峰值是否超过某个阈值,A线上的高峰值和B线上的高峰值之间的时间可能是您的延迟。只是尝试修改一下阈值,如果图表通常和你发布的图片一样清晰,那么你应该没问题。

答案 2 :(得分:0)

遇到了同样的问题并且没有成功找到一个工具来自动同步视频/音频录制的开始, 我决定制作syncstart (github)。

它是一个命令行工具。它背后的基本代码是这样的:

import numpy as np
from scipy import fft
from scipy.io import wavfile
r1,s1 = wavfile.read(in1)
r2,s2 = wavfile.read(in2)
assert r1==r2, "syncstart normalizes using ffmpeg"
fs = r1
ls1 = len(s1)
ls2 = len(s2)
padsize = ls1+ls2+1
padsize = 2**(int(np.log(padsize)/np.log(2))+1)
s1pad = np.zeros(padsize)
s1pad[:ls1] = s1
s2pad = np.zeros(padsize)
s2pad[:ls2] = s2
corr = fft.ifft(fft.fft(s1pad)*np.conj(fft.fft(s2pad)))
ca = np.absolute(corr)
xmax = np.argmax(ca)
if xmax > padsize // 2:
    file,offset = in2,(padsize-xmax)/fs
else:
    file,offset = in1,xmax/fs