14

我通过 2 个不同的麦克风(例如,以 WAV 格式)对同一信号进行了两次录音,但其中一个是延迟录制的,例如几秒钟。

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


(来源:greycat.ru

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

我已经挖掘了一下,发现这个问题通常被称为“时间延迟估计”,它有无数种方法——例如,其中之一

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

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

4

3 回答 3

14

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

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

于 2011-02-11T09:46:48.290 回答
1

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

于 2011-02-11T09:37:45.190 回答
1

遇到同样的问题并且没有成功找到自动同步视频/音频录制开始的工具,我决定制作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
于 2021-02-19T22:36:11.990 回答