J'ai deux vecteurs de données spatiales (chacune d'environ 2000 éléments de longueur). L'un est une version convolutive de l'autre. J'essaie de déterminer le noyau qui produirait une telle convolution. Je sais que je peux le faire en trouvant la transformée de Fourier inverse du rapport des transformées de Fourier des vecteurs de sortie et d'entrée. En effet, lorsque je fais cela, j'obtiens plus ou moins la forme que j'attendais. Cependant, mon vecteur noyau a la même dimensionnalité que les deux vecteurs d'entrée alors qu'en réalité la convolution n'utilisait qu'environ un cinquième (~ 300-400) des points. Le fait que j'obtienne la bonne forme mais le mauvais nombre de points me fait penser que je n'utilise pas correctement les fonctions ifft et fft. Il semble que si je faisais vraiment ce qu'il fallait, cela devrait se produire naturellement. Pour le moment je fais simplement;
FTInput = fft(in);
FtOutput = fft(out);
kernel = ifft(FtOutput./FTInput).
Est-ce correct et c'est à moi d'interpréter correctement le vecteur de sortie ou ai-je trop simplifié la tâche? Je suis sûr que c'est ce dernier, je ne sais pas où.
la source
Réponses:
Si vous avez du bruit présent dans votre signal, la simple division de domaine de Fourier provoquera de nombreuses erreurs dans votre résultat. Certaines façons de l'éviter sont d'utiliser la soi-disant FFT double canal ( partie 1 et partie 2 ). Je peux également suggérer que la déconvolution via des filtres adaptatifs, des filtres LMS ou NLMS ([Normalized] Least Mean Squares) en particulier, sont faciles à comprendre et ne coûtent pas très cher en termes de cycles CPU au cas où vos signaux seraient longs. Les filtres adaptatifs LMS sont très robustes au bruit.
la source