У меня есть два вектора пространственных данных (каждый около 2000 элементов в длину). Один - это свернутая версия другого. Я пытаюсь определить ядро, которое произвело бы такую свертку. Я знаю, что могу сделать это путем нахождения обратного преобразования Фурье отношения преобразований Фурье выходного и входного векторов. Действительно, когда я делаю это, я получаю более или менее ту форму, которую я ожидал. Тем не менее, мой вектор ядра имеет ту же размерность, что и два входных вектора, когда на самом деле свертка использовала только одну пятую (~ 300-400) точек. Тот факт, что я получаю правильную форму, но неверное количество очков, заставляет меня думать, что я не совсем правильно использую функции ifft и fft. Кажется, если бы я действительно поступал правильно, это должно было произойти естественно. На данный момент я просто делаю;
FTInput = fft(in);
FtOutput = fft(out);
kernel = ifft(FtOutput./FTInput).
Это правильно, и я должен правильно интерпретировать выходной вектор, или я упростил задачу? Я уверен, что это последнее, я просто не уверен, где.
источник
Ответы:
Если в вашем сигнале присутствует шум, простое деление области Фурье вызовет множество ошибок в вашем результате. Некоторые способы избежать этого - использование так называемого двухканального БПФ ( часть 1 и часть 2 ). Я также могу предложить деконволюцию с помощью адаптивных фильтров, в частности, фильтры LMS или NLMS ([наименьшие] наименьшие средние квадраты), которые легко понять, не слишком дороги с точки зрения циклов ЦП в случае длинных сигналов. Адаптивные фильтры LMS очень устойчивы к шуму.
источник