Линейная свертка и взаимная корреляция двух векторов в Matlab с использованием БПФ и вывода одинаковой длины

Я реализую алгоритм, в котором мне нужно вычислить линейную свертку и взаимную корреляцию между двумя одномерными векторами 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) показывает, как корреляция двух изображений может быть обрезана.

Как обрезать выходной одномерный вектор, чтобы он был такой же длины, как и входные векторы?


person Nicholas Kinar    schedule 05.09.2012    source источник
comment
(Может быть полезно) conv2" title="элегантный способ получить вывод normxcorr2 аналогично conv2">stackoverflow.com/questions/9145107/   -  person Andrey Rubshtein    schedule 05.09.2012
comment
@Andrey: Это был интересный вопрос, Андрей; спасибо, что указали на это.   -  person Nicholas Kinar    schedule 06.09.2012


Ответы (2)


В MATLAB conv(a, b, 'same') возвращает центральную часть свертки того же размера, что и a. Для взаимной корреляции вы можете использовать xcorr, что даст вам результат взаимной корреляции. Я думаю, вам нужно обрезать результат самостоятельно, чтобы получить тот же размер, что и ввод.

person chaohuang    schedule 05.09.2012
comment
Спасибо, чаохуан. Как conv(a, b, 'same') возвращает центральную часть свертки? Какие индексы используются? Кроме того, используя xcorr, как мне правильно обрезать результат? Будет ли это той же центральной частью ответа? - person Nicholas Kinar; 05.09.2012
comment
Вы можете использовать справку, чтобы узнать, как использовать conv, или выполнить несколько простых тестов. Поскольку не существует правила обрезки результатов свертки/корреляции, выбор центральных частей — это только один из способов сделать это. Вы можете выбрать то, что наиболее подходит для вас. - person chaohuang; 05.09.2012
comment
Вместо использования функции conv я хотел бы выполнить свертку с помощью БПФ. Как conv внутренне обрезает результат? Может быть, есть справочник / документ, показывающий, как выполняется кадрирование, даже если нет установленного правила? - person Nicholas Kinar; 05.09.2012
comment
Вероятно, в этой ситуации лучше всего использовать conv(a, b, 'same') - person Nicholas Kinar; 09.09.2012

есть формулы:

c = a conv b;

где a, b и c находятся во временной области; После преобразования в частотную область формула меняется на

C = A * B;

где A, B и C являются fft результатом a, b и c соответственно, и все они находятся в частотной области; так что c = ifft (C);

person xychen    schedule 08.11.2012
comment
Спасибо за дополнительное разъяснение - person Nicholas Kinar; 08.11.2012