Цель C - взаимная корреляция для оценки задержки звука - PullRequest
7 голосов
/ 20 июня 2011

Я хотел бы знать, если кто-нибудь знает, как выполнить взаимную корреляцию между двумя звуковыми сигналами на iOS .

Я хотел бы выровнять FFTокна, которые я получаю в приемнике (я получаю сигнал от микрофона) с окнами в передатчике (который воспроизводит звуковую дорожку), т.е. убедитесь, что первая выборка каждого окна (кроме периода "синхронизации")на передатчике также будет первое окно на приемнике.

Я вводил в каждый кусок передаваемого аудио известную форму волны (в частотной области).Я хочу оценить задержку через взаимную корреляцию между известной осциллограммой и полученным сигналом (через несколько последовательных фрагментов), но я не знаю, как это сделать.

Похоже, есть метод vDSP_convD чтобы сделать это, но я понятия не имею, как его использовать и нужно ли мне сначала выполнять реальное БПФ сэмплов (вероятно, да, потому что я должен передать double []).

void vDSP_convD (
   const double __vDSP_signal[],
   vDSP_Stride __vDSP_signalStride,
   const double __vDSP_filter[],
   vDSP_Stride __vDSP_strideFilter,
   double __vDSP_result[],
   vDSP_Stride __vDSP_strideResult,
   vDSP_Length __vDSP_lenResult,
   vDSP_Length __vDSP_lenFilter
)

Ответы [ 2 ]

1 голос
/ 02 июня 2015

Кросс-корреляция - это решение, да.Но есть много препятствий, которые вы должны преодолеть.Если вы получаете сэмплы из аудиофайлов, они содержат отступы, которые не нравятся функции взаимной корреляции.Также очень неэффективно выполнять корреляцию со всеми этими выборками - это занимает огромное количество времени.Я сделал пример кода, который демонстрирует сдвиг во времени двух аудио файлов.Если вам интересен образец, посмотрите на мой Github Project .

1 голос
/ 26 апреля 2012

Функция vDSP_convD() вычисляет свертку двух входных векторов для получения вектора результата. Маловероятно, что вы хотите свернуть в частотной области, так как вы ищете результат во временной области - хотя вы можете, если у вас есть БПФ уже по какой-то другой причине, решить умножить их вместе, а не свертывать последовательности временной области (но в этом случае, чтобы получить результат, вам нужно будет выполнить обратный DFT, чтобы снова вернуться во временную область).

Если, конечно, я вас правильно понимаю.

Тогда, как только вы получите результат из vDSP_convD(), вы захотите найти самое высокое значение, которое скажет вам, где сигналы наиболее сильно коррелированы. Кроме того, возможно, потребуется, чтобы справиться со случаем, когда входной сигнал не содержит достаточно ваш опорный сигнал, и в этом случае вы можете (например) игнорировать значения в векторе результата ниже определенного уровня.

...