Я пытаюсь вычислить автокорреляцию на платформе, где единственный доступный ускоренный примитив - это (I) FFT. У меня проблема, хотя.
Я прототипировал его в MATLAB . Я, однако, немного смущен. Я предположил, что это работает просто следующим образом (это из памяти, поэтому извиняюсь, если я немного ошибся).
autocorr = ifft( complex( abs( fft( inputData ) ), 0 ) )
Однако я получаю другой результат, чем при использовании xcorr
функции. Теперь я полностью ожидаю, что не получу левую сторону автокорреляции (так как это отражение правой стороны и, следовательно, в любом случае не нужно). Однако проблема в том, что моя правая сторона, как представляется, сама отражается на полпути. Что фактически означает, что я получаю примерно половину ожидаемого объема данных.
Так что я уверен, что, должно быть, я делаю что-то очень простое, но я просто не могу понять, что.
Ответы:
Пикенетты, конечно, правы. БПФ реализует круговую свертку, в то время как xcorr () основана на линейной свертке. Кроме того, вам необходимо также возвести в квадрат абсолютное значение в частотной области. Вот фрагмент кода, который обрабатывает все заполнение нулями, сдвиг и усечение.
источник
источник
Вкратце: вы должны были сделать это (чтобы адаптироваться к вашему языку программирования):
Или в MATLAB:
источник
Основная причина того, что требуемый выходной сигнал функции xcorr не похож на применение функции FFT и IFFT, заключается в том, что при применении этих функций к сигналам конечный результат получается циклически извилистым .
Основное различие между линейной и круговой сверткой можно найти в линейной и круговой свертке .
Проблема может быть решена путем начального заполнения нуля сигнала и усечения конечного вывода IFFT .
источник