Автокорреляции с использованием функций 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.