numpy.correlate 和自相关;音频信号

信息处理 声音的 Python 相关性
2022-02-12 01:14:16

我想计算我的音频处理系统的输入和输出音频信号之间的延迟。输入和输出信号以带符号的 16 位整数形式提供。为了尝试,我使用以下 numpy 命令尝试了输入信号的自相关:

import numpy as np
import wave
wfp = wave.open('test.wav', 'rb')
samples = wfp.readframes(wfp.getnframes())
signal = np.frombuffer(samples, np.int16)
corr = np.correlate(signal, signal, "full")

我假设自相关的峰值始终位于滞后 0 处,即 corr 数组中的索引 corr.size / 2 处。但是,当我计算 np.argmax(corr) 时,我得到了不同的索引值。

当我首先对信号进行归一化以获得 -1.0 和 +1.0 之间的值时,峰值总是如预期的那样在 corr.size / 2 处,至少在我使用不同信号的测试中是这样。

对于标准化,我使用了以下步骤:

signal = signal / float(0xFFFF)

有人可以向我解释一下,为什么我必须对信号进行标准化。

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