2017-08-28 3 views
0

J'ai un tableau 3D de données réelles que je voudrais transformer avec soit un DST ou DCT le long d'un axe et DFT normale le long des deux autres axes. Le résultat devrait être un tableau complexe 3D contenant les coefficients de cette transformation. Savez-vous si le boîtier FFTW3 offre une telle routine - éventuellement en parallèle - prête à l'emploi? FFTW3 fournit une telle routine pour une 3D DFT simple dans les trois directions.Transformation FFTW 3D personnalisée (parallèle) possible?

Et si non, pourriez-vous avoir un indice sur la façon de le réaliser de la meilleure façon en C/C++?

Mon idée naïve: Assemblage de DST/DCT suivi d'une transformation 2D-complexe sur le premier axe à l'intérieur d'une routine d'encapsulation. Ensuite, on pourrait penser à une décomposition 1D pour atteindre le parallélisme. Un 2D serait plus agréable mais beaucoup plus de travail.

PS: Cette transformation est utilisée dans une méthode spectrale pour résoudre l'équation de Navier-Stokes.

+0

Avez-vous regardé [FFTPACK] (http://www.netlib.org/fftpack/) (notez qu'il s'agit d'une ancienne bibliothèque Fortran, assez ancienne pour que je pense que c'était encore FORTRAN ....) –

+0

Merci Pour votre aide. Oui, je l'ai fait. Cependant, FFTPACK est un peu plus lent que FFTW. En outre, FFTW offre déjà tous les blocs de construction pour la transformation nécessaire, il s'agit donc simplement de la manière de l'assembler. – mrdy

+0

@DavidBowling Que voulez-vous dire par assez vieux? http://www.2decomp.org/, https://github.com/sdsc/p3dfft, ... –

Répondre

0

Votre idée naïve est la voie à suivre. Les dimensions individuelles peuvent être transformées indépendamment.

+0

Oui, vous avez raison et ce fait est utilisé par des implémentations parallèles de FFT. Mais je ne vois pas comment cela aide mon problème. – mrdy

+0

J'ai construit tout cela pour le complexe 3D en C++. J'avais besoin de flotteurs et de doubles précisions. https://github.com/kvahed/codeare/blob/master/src/matrix/ft/FFTWTraits.hpp https://github.com/kvahed/codeare/blob/master/src/matrix/ft/DFT. hpp Mais c'est différent de ce qui t'intéresse car les 3 dimensions pour moi sont complexes. Avez-vous à passer par de nombreux volumes 3D? Dans ce cas, vous pouvez faire les 1D ffts après l'autre et les ffts 2D en utilisant openmp. ou vous utilisez des ffts à un seul thread dans la boucle openmp. Attention: fftw_plan_init n'est pas thread-safe. –