Я реализую алгоритм, в котором мне нужно вычислить линейную свертку и взаимную корреляцию между двумя одномерными векторами a
и b
с помощью БПФ. Если длина a
равна m
, а длина b
равна n
, то общая длина результирующей свертки будет m + n - 1
.
Однако алгоритм требует, чтобы выходные данные свертки были той же длины, что и входные данные. Начиная с m = n
, входные векторы имеют одинаковую длину.
В Matlab, учитывая, что оба вектора были дополнены нулями до длины m + n - 1
, свертка вычисляется как:
ifft(fft(a).*fft(b))
Альтернативно, взаимная корреляция между двумя векторами вычисляется как:
fftshift(ifft(fft(a).*conj(fft(b))))
Выход имеет длину m + n - 1
. Мне нужно обнулить векторы, чтобы гарантировать, что круговая свертка не произойдет при использовании БПФ.
Однако я хотел бы, чтобы длина вывода была такой же, как длина входов. Связанный вопрос (также в stackoverflow) показывает, как корреляция двух изображений может быть обрезана.
Как обрезать выходной одномерный вектор, чтобы он был такой же длины, как и входные векторы?