Нахождение ядра свертки в Matlab - PullRequest
1 голос
/ 12 декабря 2011

У меня есть два вектора пространственных данных (каждый около 2000 элементов в длину). Один - это свернутая версия другого. Я пытаюсь определить ядро, которое произвело бы такую ​​свертку. Я знаю, что могу сделать это, найдя обратное преобразование Фурье отношения преобразований Фурье выходного и входного векторов. Действительно, когда я делаю это, я получаю более или менее ту форму, которую я ожидал. Тем не менее, мой вектор ядра имеет ту же размерность, что и два входных вектора, когда в действительности свертка использовала только одну пятую (~ 300-400) точек. Тот факт, что я получаю правильную форму, но неверное количество точек, заставляет меня думать, что я не совсем правильно использую функции ifft и fft. Кажется, если бы я действительно поступал правильно, это должно было произойти естественно. На данный момент я просто делаю;

FTInput = fft(in);
FtOutput = fft(out);
kernel = ifft(FtOutput./FTInput).

Правильно ли это, и мне решать правильно интерпретировать выходной вектор или я упростил задачу? Я уверен, что это последнее, я просто не уверен, где.

Спасибо

Ответы [ 2 ]

2 голосов
/ 17 октября 2012

Я думаю, что ваша «проблема» возникает из-за присущего ей заполнения, необходимого для дискретной свертки, которую вы игнорируетечто ваша свертка была получена путем умножения на Фурье, оба эквивалентны), но если ваша свертка была вычислена в пространственной области, вероятнее всего использовалось заполнение нулями.

s=[1 2 3 4 5] //signal

f=[0 1 2 1 0] //filter

s0=s *conv0* f=[4 8 12 16 14] //convolution with zero padding in spatial domain, truncated to signal length
sc=s *convc* f=[9 8 12 16 15] //convolution with cyclic padding in spatial domain, truncated to signal length

S,S0,Sc, the ffts of s,s0,sc

approx0=ifft(S0./S)=[-0.08 1.12 2.72 -0.08 -0.08]

approxc=ifft(Sc./S)=[0 1 2 1 0] 
2 голосов
/ 12 декабря 2011

Вы все делаете правильно, это не ошибка.

Проблема оценки фильтра свертки по чистым и свернутым данным ОЧЕНЬ СЛОЖНА.Имея «хорошие» данные, вы можете получить правильную форму, но получение истинной поддержки фильтра свертки (т.е. получение нулей там, где они должны быть) НЕ произойдет естественным образом.

...