Автокорреляции с использованием функций vDSP - PullRequest
5 голосов
/ 05 апреля 2011

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

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

Аналогично, vDSP_conv () иФункции vDSP_convD () упоминают о способности выполнять корреляции и свертки между двумя векторами, но не предоставляют достаточно объяснений или примеров кода, чтобы я мог их успешно использовать.Например, если ядро ​​фильтра используется для свертки двухмерной матрицы, я бы предположил, что потребуются два вызова 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 Ответ

9 голосов
/ 05 апреля 2011

Документация для 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))

, а затем используйте БПФподпрограммы от vDSP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...