Автокорреляции с использованием функций vDSP

Учитывая, что одномерный вектор чисел с плавающей или двойной величиной, как можно рассчитать автокорреляции для этого вектора, используя функции из библиотеки vDSP в Accelerate Framework?

Можно было бы предположить, что функции vDSP_acor() и vDSP_acorD() будут выполнять эти вычисления, но документация vDSP_Library.pdf (доступная здесь) не очень хорошо объясняет, как используются аргументы функции.

Точно так же функции vDSP_conv() и vDSP_convD() упоминают о способности выполнять корреляции и свертки между двумя векторами, но не предоставляют достаточно объяснений или примеров кода для меня, чтобы я мог их успешно использовать. Например, если ядро ​​фильтра используется для свертки 2D-матрицы, я бы предположил, что потребуются два вызова vDSP_convD() с разными значениями signalStride, но это не указано в документации. Другое упущение - как данные в фильтре должны быть упакованы. Если заполнены нулями, имеет ли значение, если нули идут первыми, последними или они должны быть равномерно распределены по обе стороны от ненулевых записей? Существуют ли требования к длине фильтра, длине результата и длине ввода?

Предложения для полезных примеров: Реализация автокорреляции вектора с самим собой с использованием как vDSP_acor(), так и vDSP_conv(). Двоичное умножение двух массивов в частотной области, которые упакованы как реальные данные, которые были перенаправлены FFT с использованием vDSP_fft2d_zrip(), которые будут использоваться при вычислении функции автокорреляции, прежде чем IFT вернет ненормализованный ответ. Реализация гауссовой свертки ядра на одномерном и двумерном массиве. В общем, это фантастическая библиотека (вы можете сказать БЫСТРО?!), но я обнаружил, что эти конкретные функции немного сложны для понимания, и вышеупомянутые примеры, вероятно, будут широко использоваться, потому что они очень распространены в обработке сигналов и анализе изображений.

Предложения для сопровождающих справочного документа vDSP_Library: я предполагаю, что "пространственный домен" и "временной домен" эквивалентны по всему документу. Если нет, пожалуйста, сделайте это различие. Также, пожалуйста, убедитесь, что любые формулы имеют четко определенные параметры, которые соответствуют объявленным именам аргументов в обсуждаемых функциях.

Сноска: здесь автокорреляция, на которую я ссылаюсь, определяется как: A[T] = <(X [t] -m) (X [tT] -m)>/ v, где A[T] - автокорреляция при лаге T, t является индексом сигнала X, m является средним значением X по всем t, v является дисперсией X по всем t, а угловые скобки <> указывают среднее по всем доступным парам X, которые находятся на расстоянии T.

1 ответ

Документация для vDSP_acorD мне кажется достаточно ясным, если немного разреженным, и в описаниях параметров действительно есть опечатка.

void vDSP_acorD (double * A,
    double * C, int N, int M);

A является входным сигналом, C автокорреляционный выход, N количество образцов в A, а также M количество выходных значений, которое вам требуется в C (т.е. C будет содержать значения запаздывания от 0 в M - 1).

Если vDSP_acorD недоступен, то вы можете использовать vDSP_conv поскольку свертка - это та же операция, что и корреляция с одним из обращенных входных сигналов.

В качестве альтернативы вы можете выполнить свою собственную быструю автокорреляцию, используя тот факт, что автокорреляция эквивалентна обратному БПФ спектра мощности, поэтому:

auto_correlation = IFFT(MAG(FFT(x)))

где

FFT = forward FFT
IFFT = inverse FFT
MAG = magnitude of complex spectrum (sqrt(re * re + im * im))

а затем использовать процедуры FFT из vDSP.

Другие вопросы по тегам