2011-12-12 3 views
1

J'ai deux vecteurs de données spatiales (chacun d'environ 2000 éléments de longueur). L'un est une version convolution 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, quand je fais cela, je reçois plus ou moins la forme que je m'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 la bonne chose, cela devrait se produire naturellement. En ce moment je fais simplement;Trouver le noyau de convolution dans matlab

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 le dernier, je ne suis pas sûr où.

Merci

+0

Vous pouvez demander sur dsp.stackexchange.com. C'est un problème d'identification du système. Il y a deux problèmes: l'approche que vous prenez ici modélise le système par un filtre FIR de la même longueur que les données, ce qui peut être ou ne pas être un bon modèle. Et si vos signaux d'entrée et de sortie sont corrompus par le bruit, disons en étant numérisés à partir de transducteurs analogiques, le bruit aura tendance à biaiser votre réponse. – mtrw

Répondre

2

Vous faites les choses correctement, ce n'est pas un bug.

Le problème de l'estimation d'un filtre de convolution avec des données propres et convolées est TRÈS DIFFICILE. Étant donné de "bonnes" données, vous pouvez obtenir la bonne forme mais récupérer le vrai support du filtre de convolution (c'est-à-dire obtenir des zéros là où elles devraient être) ne se produira PAS naturellement.

+0

Merci pour ce que c'est en fait un peu tangentiel à ce que je fais, plus d'une vérification croisée. Il semble que c'est probablement le cas que ça ne va jamais être aussi bon que la mesure que j'essaie de vérifier. – Bowler

2

Je pense que votre « » problème « » vient du rembourrage intrinsèque nécessaire à convolution discrète que votre négligent

En divisant en fourier, vous assumez votre convolution a été faite avec un rembourrage cyclique dans l'espace (ou que votre convolution a été faite par multiplication dans Fourier, les deux sont équivalents) mais si votre convolution a été calculée dans le domaine spatial, un remplissage de zéro a été probablement utilisé.

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] 
Questions connexes