2011-04-03 3 views
0

J'étudie le code derrière l'exemple convolutionFFT2D de la Nvidia CUDA sdk, mais je ne suis pas le point de cette ligne:CUDA cufftPlan2d taille plan question

cufftPlan2d(&fftPlan, fftH, fftW/2, CUFFT_C2C); 

Apparemment, ce plan complexe initialise un pour la FFT à être en cours d'exécution, mais je ne vois pas le point de diviser la largeur du plan par 2.

Juste pour être précis: les fftH et fftW sont des valeurs arrondies pour imageX + kernelX + 1 et imageY + kernelY + 1 dimensions (juste pour des raisons de vitesse). Je sais que dans le domaine fréquentiel, vous avez généralement une composante positive et une composante négative symétrique de la même fréquence .. mais cela ressemble à couper la moitié de mes données image ..

Quelqu'un peut-il m'expliquer un peu mieux ? Je n'ai jamais utilisé de FFT (je connais juste la théorie derrière une transformation de Fourier)

Répondre

1

Lorsque vous réalisez une FFT réelle à complexe, la moitié des données du domaine fréquentiel est redondante en raison de la symétrie. C'est seulement le cas dans un axe d'une FFT 2D cependant. Vous pouvez considérer une FFT 2D comme deux opérations 1D FFT, la première fonctionne sur toutes les lignes, et pour une image réelle, cela vous donnera des valeurs de lignes complexes. Dans la deuxième étape, vous appliquez une FFT 1D à chaque colonne, mais comme les valeurs de ligne sont maintenant complexes, il s'agira d'une FFT complexe à complexe sans redondance dans la sortie. Vous n'avez donc besoin que de la largeur/2 points sur l'axe horizontal, mais vous avez toujours besoin d'une pointe de hauteur dans l'axe vertical.