Точное выравнивание двух файлов wav

У меня есть инструмент, который сравнивает два аудиофайла wav кадр за кадром и возвращает оценку, которая дает уровень сходства между двумя файлами.

У меня есть исходный wav-файл и запись wav-файла, так как эти два файла почти похожи, я должен получить высокий балл сходства, но я получаю плохой балл, в основном из-за очень небольшой задержки в записанном файле. несоответствие кадров

Мой вопрос: как мне точно выровнять два аудиофайла с помощью MATLAB, чтобы можно было выполнить действительное сравнение кадров с кадрами.


person Community    schedule 22.11.2011    source источник


Ответы (2)


Вы должны провести серию сравнений, сдвигая один из кадров во времени и вычисляя корреляцию между двумя. Наибольшее значение корреляции даст вам временной сдвиг между волнами.

Я думаю, вы можете использовать xcorr для достижения этой цели.

person anticyclope    schedule 22.11.2011
comment
я прочитал оба файла, используя x=wavread(firstfile) и y=wavread(secondfile). xcorr(x,y) выдал ошибку нехватки памяти. как мне это исправить? - person ; 22.11.2011
comment
Попробуйте wavread(firstfile, N) и то же самое для второго файла. N — количество выборок с начала волны. Это уменьшит объем необходимой памяти. Выберите N в соответствии с длиной волнового файла. - person anticyclope; 22.11.2011
comment
Если это слишком медленно, вы можете использовать метод БПФ для вычисления взаимной корреляции. - person endolith; 23.11.2011

Столкнувшись с той же проблемой и безуспешно найдя простой инструмент для автоматической синхронизации начала видео/аудиозаписи, я решил сделать syncstart (github).

Это инструмент командной строки на основе Python, который вычисляет разрез, необходимый для синхронизации записей.

Он использует основанную на БПФ корреляцию начала.

Базовый код должен быть легко преобразован в Matlab:

corr = fft.ifft(fft.fft(s1pad)*np.conj(fft.fft(s2pad)))
ca = np.absolute(corr)
xmax = np.argmax(ca)
if xmax > padsize // 2:
    offset = (padsize-xmax)/fs
    #second signal (s2) to cut
else:
    offset = xmax/fs
    #first signal (s1) to cut
person Roland Puntaier    schedule 19.02.2021