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

Algorithm 两个音频信号之间的时延估计,algorithm,signal-processing,delay,timedelay,Algorithm,Signal Processing,Delay,Timedelay,我用两个不同的麦克风对同一信号进行了两次录音(例如,WAV格式),但其中一次录音有延迟,例如,几秒钟 在某种波形查看器中查看这些信号时,很容易从视觉上识别出这种延迟,即只需在每个信号中发现第一个可见峰值,并确保它们的形状相同: (来源:) 但是我如何通过编程来实现它——找出这个延迟(t)是什么?两个数字化信号略有不同(因为话筒不同,由于ADC设置等原因,处于不同位置) 我仔细研究了一下,发现这个问题通常被称为“时延估计”,有很多方法可以解决它——例如 但有没有简单现成的解决方案,比如命令行实用

我用两个不同的麦克风对同一信号进行了两次录音(例如,WAV格式),但其中一次录音有延迟,例如,几秒钟

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


(来源:)

但是我如何通过编程来实现它——找出这个延迟(t)是什么?两个数字化信号略有不同(因为话筒不同,由于ADC设置等原因,处于不同位置)

我仔细研究了一下,发现这个问题通常被称为“时延估计”,有很多方法可以解决它——例如

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


结论:我没有发现简单的实现,我自己做了一个简单的命令行实用程序-可在(GPLv3许可)上获得。它实现了一个非常简单的最大值搜索算法,如所述。

一个非常简单的任务就是检查峰值是否超过某个阈值,a行的峰值和B行的峰值之间的时间可能是您的延迟。只要试着修改一下阈值,如果图形通常与您发布的图片一样清晰,那么您应该会很好。

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


如果您对滞后值(或者至少是预期的滞后值范围)有一个合理的想法,那么您可以大大减少计算总量。如果您可以对所需的准确度设定一个明确的限制,也可以这样做。

遇到同样的问题,但没有成功找到自动同步视频/音频录制开始的工具, 我决定做某事

它是一个命令行工具。其背后的基本代码如下:

将numpy导入为np
从scipy导入fft
从scipy.io导入wavfile
r1,s1=wavfile.read(in1)
r2,s2=wavfile.read(in2)
断言r1==r2,“syncstart使用ffmpeg进行规范化”
fs=r1
ls1=len(s1)
ls2=len(s2)
焊盘尺寸=ls1+ls2+1
焊盘大小=2**(int(np.log(焊盘大小)/np.log(2))+1)
s1pad=np.零(焊盘尺寸)
s1pad[:ls1]=s1
s2pad=np.零(焊盘尺寸)
s2pad[:ls2]=s2
corr=fft.ifft(fft.fft(s1pad)*np.conj(fft.fft(s2pad)))
ca=np.绝对值(corr)
xmax=np.argmax(ca)
如果xmax>padsize//2:
文件,偏移量=in2,(焊盘尺寸xmax)/fs
其他:
文件,偏移量=in1,xmax/fs

是的,就是互相关。值得一提的是,如果可以猜测一个好的起点,计算量可以减少。我仔细研究了一下,发现这个算法没有简单的实现,所以我自己做了一个,并发表了它。如果使用FFT,互相关速度会快得多。罗兰,我目前正在测试你的代码,但有一个错误。在最后一个if语句中,您调用的变量是“in1或in2”,但它们没有被定义为文件名。看。