problème FFT sous codeblocks

problème FFT sous codeblocks - C - Programmation

Marsh Posté le 27-05-2013 à 10:32:30    

Bonjour à tous,
 
Je suis actuellement en stage dans une petite start-up, et j'essaie actuellement de réaliser la FFT d'un ensemble de valeurs avec les librairies fftw3 prises sur fftw.org
Ceci dit je suis sur windows 8 64 bits, j'ai récupéré la version fftw3 en 64 bits sur le site.
 
J'ai repris plusieurs topics de ce meme forum afin de tester ce programme sur un tableau de valeurs, mais le compilateur m'annonce une erreur qui est "error : incompatible types when assigning to type 'fftw_complex' from type 'double *'.
 
Avant de vous mettre le code associé, je précise qu'avec ce que j'ai lu sur ces topics il faut apparemment avec les .dll et .def créer un .a qu'on insère dans 'project->build options->linker settings et je n'arrive pas a faire cela.
...Par contre j'ai bien mis le dossier dans lequel on retrouve tous mes fichiers via 'search directories'.
 
 
Donc voici ci-dessous le code :
 
 
 
 
#include <stdio.h>
#include <stdlib.h>
#include <fftw3.h>
 
 
int main()
{
    int k;
    fftw_complex *in, *out;
    fftw_plan p;
    int N=11;
    in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
    out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);
    p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
 
    fftw_complex inO[11]={0.058239, 0.05822, 0.058966, 0.05928, 0.061801, 0.062823, 0.064514, 0.065286, 0.066999, 0.064993, 0.069892};
 
    for ( k = 0 ; k < 11 ; k++ )
    {
        in[k] = inO[k]; // car allocation dynamique ?
    }
 
    fftw_execute(p); /* repeat as needed */
    for(k=0;k<11;k++)
    {
        printf("%lf", out[k]);
    }
    fftw_destroy_plan(p);
    fftw_free(in); fftw_free(out);
 
    return 0;
}
 
 

Reply

Marsh Posté le 27-05-2013 à 10:32:30   

Reply

Marsh Posté le 27-05-2013 à 11:40:05    

:hello: !
 
L'erreur que tu as apparaît à quelle ligne de code ? :??:
 
Voici un petit tuto d'utilisation de la bibliothèque FFTW :jap:
 
Pour initialiser une variable de type fftw_complex, le site utilise le code suivant :
 

Code :
  1. spatial_repr= fftw_malloc(sizeof(fftw_complex)*largeur*hauteur);
  2. for(i=0;i<largeur*hauteur;i++)
  3. {
  4.     spatial_repr[i][0] = in[i];
  5.     spatial_repr[i][1] =  0.0f; /*rempli de 0 la partie imaginaire de l'image*/
  6. }


---------------
And in the end, the love you take is equal to the love you make
Reply

Marsh Posté le 27-05-2013 à 11:50:42    

c'est a la ligne "in[k] = inO[k]; // car allocation dynamique ?" qu'il m'affiche cette erreur...

Reply

Marsh Posté le 27-05-2013 à 12:34:27    

j'ai rajouté :
 fftw_complex *inO;
inO = fftw_malloc(sizeof(fftw_complex)*largeur*hauteur);
in[11]={0.058239, 0.05822, 0.058966, 0.05928, 0.061801, 0.062823, 0.064514, 0.065286, 0.066999, 0.064993, 0.069892};
 
for(i=0;i<11;i++)
    {
 
        inO[i][0] = in[i];
        inO[i][1] =  0.0f; /*rempli de 0 la partie imaginaire de l'image*/
    }
 
mais ça m'affiche maintenant 2 erreurs :  
 
1. a la ligne "in[11]={0.058239, 0.05822, 0.058966, 0.05928, 0.061801, 0.062823, 0.064514, 0.065286, 0.066999, 0.064993, 0.069892};"  il m'affiche "error : expected expression before '{' token"
 
2. a la ligne "inO[i][0] = in[i];" il m'affiche "error : incompatible types when assigning to type 'double' from type 'double *' ( ce qui je trouve reste étrange car j'ai au départ initialisé les 2 tableaux comme fftw_complex ).
 
merci beaucoup de votre aide.

Reply

Marsh Posté le 27-05-2013 à 13:49:17    

auriez vous une idée à me présenter pour que j'arrive à mes fins ?

Reply

Marsh Posté le 27-05-2013 à 15:10:47    

Bonjour !

Code :
  1. in[11]={0.058239, 0.05822, 0.058966, 0.05928, 0.061801, 0.062823, 0.064514, 0.065286, 0.066999, 0.064993, 0.069892};


Vous ne typez pas votre tableau in, il faudrait écrire double in[]={...}; (si vous ne précisez pas la taille, elle est calculée automatiquement).
 
Pour la deuxième erreur, peut-être est-elle due à la première, on ne vois pas la déclaration de in ... Si vous avez laissé la déclaration "fftw_complex* in", cela peut s'expliquer !

Reply

Marsh Posté le 27-05-2013 à 16:44:59    

J'ai essayé comme tu m'as dit Farian mais en faite dans les prototypes de fonctions de fftw les tableaux de données d'entrée et sortie du programme, in[] et out[] sont définis comme fftw_complex.
...donc ça donne bien une incompatibilité entre les valeurs que j'entre qui sont de type double et in[] de type fftw_complex.
 
Je sents qu'il me manque un truc très con, mais je ne le trouve pas...
 
Voilà, vous en pensez quoi ?

Reply

Marsh Posté le 27-05-2013 à 18:08:54    

à ce moment là, vous déclarez en effet in en tant que tableau de fftw_complex et vous l'initialisez tel quel :  
 

Code :
  1. fftw_complex in [] = {{0.058239, 0}, {0.05822, 0}, {0.058966, 0}, {0.05928, 0}, {0.061801, 0}, {0.062823, 0}, {0.064514, 0}, {0.065286, 0}, {0.066999, 0}, {0.064993, 0}, {0.0698920, 0}};


Message édité par Farian le 27-05-2013 à 18:09:14
Reply

Marsh Posté le 28-05-2013 à 09:10:35    

Bonjour,
Désolé du retard de ma réponse...

 

J'ai effectué le changement comme tu m'as dit et j'obtiens toujours la meme erreur à la ligne 'inO[i][0] = in[i];'
...et à la ligne "in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);" j'obtiens une erreur qui est "error : incompatible types when assigning to type 'double[11][2]' from type 'double (*)'.

 

auriez vous une idée à ce sujet ? ( ou tout autre personne bien sur ? )
peut etre après que mes linkers ou autre que j'ai inséré ne sont pas bons aussi : si vous avez une suite d'étapes précise à établir, car sur les divers forums que j'ai vu à ce suje à chaque fois j'ai une solution différente...


Message édité par sebastien_begue le 28-05-2013 à 09:11:39
Reply

Marsh Posté le 28-05-2013 à 12:40:48    

Tu pourrais mettre les balises [cpp ] et [ /cpp] histoire que l'on s'y repère mieux ?
 

Code :
  1. in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);


Il est inutile de caster un malloc puisque sa valeur de retour est un (void *) : sa particularité c'est qu'un void* peut prendre l'zdresse de n'importe quel type.
 
Là en l'occurence, il peut très bien prendre comme type un (fftw_complex*).

Reply

Marsh Posté le 28-05-2013 à 12:40:48   

Reply

Marsh Posté le 28-05-2013 à 18:15:20    

Voici ma vision des choses :o :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <fftw3.h>
  4. int main()
  5. {
  6.     int k;
  7.     fftw_complex *in, *out;
  8.     fftw_plan p;
  9.     int N=11;
  10.     in = fftw_malloc(sizeof(fftw_complex) * N);
  11.     out = fftw_malloc(sizeof(fftw_complex) * N);
  12.     p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
  13.     double inO[11]={0.058239, 0.05822, 0.058966, 0.05928, 0.061801, 0.062823, 0.064514, 0.065286, 0.066999, 0.064993, 0.069892};
  14.     for ( k = 0 ; k < 11 ; k++ )
  15.     {
  16.         in[k][0] = inO[k];
  17.         in[k][1] = 0.0f;
  18.     }
  19.     fftw_execute(p);
  20.     for(k=0;k<11;k++)
  21.     {
  22.         printf("%lf", out[k]);
  23.     }
  24.     fftw_destroy_plan(p);
  25.     fftw_free(in); fftw_free(out);
  26.     return 0;
  27. }


---------------
And in the end, the love you take is equal to the love you make
Reply

Marsh Posté le 29-05-2013 à 09:59:57    

Bonjour à tous,
D'abord merci pour toutes vos réponses fructifiantes !
 
Bon mon problème vient maintenant du linker ; je vous explique alors ce que j'ai fait :
 
J'ai telechargé le fichier 'libfftw3.lib' qui venait avec 'libfftw3.exp'.
 
J'ai ensuite associé ces fichiers au dossier 'fftw3-3' que j'ai récupéré sur 'fftw.org' où il y a les fichiers .dll utiles,.
 
 
De là je suis allé :
 
1. dans 'project'->'build options'->'linker settings' où j'ai mis le .lib
 
2. dans 'project'->'build options'->'search directories'->'compiler' où  j'ai mis la direction de mon dossier où j'ai établi mon code .c
 
2. dans 'project'->'build options'->'search directories'->'linker' où j'ai mis la direction de mon dossier où j'ai établi mon code .c
 
 
Je précise aussi que j'ai mis tous les fichiers .dll, .lib et .exp dans ce dossier où j'ai établi mon code .c
 
 
 
...et codeblocks me met : "cannot find -lfftw3-3.lib"  
 
Qu'est ce qui n'est pas bon dans mes étapes ? ou que manque-t-il vous pensez ?  

Reply

Marsh Posté le 29-05-2013 à 11:17:22    

Dans 'project'->'build options'->'search directories'->'compiler' tu dois mettre le dossier de la lib. Ou même carrément a lib si je me souviens biens.

Reply

Marsh Posté le 29-05-2013 à 12:05:37    

le dossier de la lib est dans mon code .c, j'ai tout mis dedans donc...
ce n'est pas possible il me semble de mettre le .lib directement dans 'compiler', en tout cas j'y arrive pas...
 
sinon j'ai téléchargé un autre dossier appelé 'fftw3-3.3.3' ( en sachant que pour l'instant j'avais le dossier nommé 'fftw-3.3.3-dll64' de 'fftw.org') qui contient des dossiers comme 'api', 'libbench2', 'genfft' où il y a tout plein de code .c et .h  
 
toi comment tu as réussi à le faire fonctionner ce code ?  

Reply

Marsh Posté le 29-05-2013 à 12:51:42    

Tu es sous windows ?
Si il y a "api" "genfft" etc.. ca veut dire que tu as téléchargé la source de la lib. Dans ce cas tu peux la créer si tu es sous linux (sur windows je sais pas comment faire) et tapant "make" ou "make install" dans un dossier où il y a un Makefile.
Télécharge la librairie simple, sans la source, c'est une .dll normalement..

Reply

Marsh Posté le 29-05-2013 à 13:58:45    

oui je suis sous windows.  
 
les librairies acceptables sur codeblocks sont de format .a, .so, .lib, .dylib ou .bundle, mais pas de .dll a moins que je dois créer la librairie recherchée avec les 3 .dll que j'ai en ayant téléchargé 'fftw-3.3.3-dll64' ? si oui, avec un logiciel ?  
 
si non, ne sais tu pas si elle existe déjà faite ?  
 

Reply

Marsh Posté le 29-05-2013 à 14:08:10    

Pour windows, c'est un .lib. Les .dylib sont des bibliothèques dynamiques, qui se chargent au début de ton programme et non pas à la compilation de celui ci.
 
Apparemment les .def ont une utilité, je n'ai pas pris le temps de regarder exactement mais il y a des informations ici : http://fftw.org/install/windows.html

Reply

Marsh Posté le 29-05-2013 à 16:40:23    

sebastien_begue a écrit :

oui je suis sous windows.  
les librairies acceptables sur codeblocks sont de format .a, .so, .lib, .dylib ou .bundle, mais pas de .dll a moins que je dois créer la librairie recherchée avec les 3 .dll que j'ai en ayant téléchargé 'fftw-3.3.3-dll64' ? si oui, avec un logiciel ?  
 
si non, ne sais tu pas si elle existe déjà faite ?  


 
Avec MinGW, il est possible d'effectuer l'édition des liens directement avec un fichier .dll (edit: ça marche pas avec Visual Studio).
 
Pour générer un exe à partir du code de djswiti, récupère donc les dll précompilées pour windows sur le site de fftw.org, dans Code::Blocks, paramètres Project => Build options => <nom du projet> => Linker settings => ajoute le chemin complet de la DLL, par exemple :

Code :
  1. E:\Projects\Utilities\fft\libfftw3-3.dll


Message édité par tpierron le 29-05-2013 à 16:41:27
Reply

Marsh Posté le 29-05-2013 à 18:43:40    

les .dll que tu me parles ce sont ceux que j'ai obtenu quand j'ai téléchargé le dossier 'fftw-3.3.3-dll64' non ?  
Si ce sont bien ces fichiers, j'ai mis comme tu m'as indiqué le chemin jusqu'à un des .dll, et on me donne cette "erreur" :
 

Code :
  1. -------------- Build: Debug in FFT_CORRIGE (compiler: GNU GCC Compiler)---------------
  2. mingw32-g++.exe -LC:\Users\sebastien_begue\Desktop\FFT_CORRIGE\  -o bin\Debug\FFT_CORRIGE.exe obj\Debug\main.o    C:\Users\sebastien_begue\Downloads\fftw-3.3.3-dll64\libfftw3-3.dll
  3. C:\Users\sebastien_begue\Downloads\fftw-3.3.3-dll64\libfftw3-3.dll: file not recognized: File format not recognized
  4. collect2.exe: error: ld returned 1 exit status
  5. Process terminated with status 1 (0 minutes, 0 seconds)
  6. 0 errors, 0 warnings (0 minutes, 0 seconds)


 
J'ai essayé aussi sans mettre le chemin "complet" mais en m'arrêtant au nom du dossier considéré, mais il me met "permission denied"
 
Voilà, sinon si cela ne marche pas il y aurait une autre solution ?
 
 
Tu m'as parlé de MinGW, je l'ai vu que j'ai installé la suite entiere codeblocks+MinGW au travers le 'siteduzero'.
...Mais comment le lancer, l'utiliser et réaliser comme tu me dis l'édition de liens ?  
 
 
 
Si tu veux je te mets des copies des écrans étape par étape qui justifieraient peut etre mon erreur ?  
 
 
 
 
ps : desolé si les cpp ne marchent pas c'est la 1ere fois que je les utilise...

Reply

Marsh Posté le 29-05-2013 à 20:21:29    

Pas bon: tu utilises bien MinGW, mais la version 32bits (mingw32-g++.exe) pour lier une DLL 64bits: pas étonnant qu'il ne reconnait pas le format. Je ne te cacherais pas que je n'ai jamais fait joujou avec MinGW 64bits, mais intuitivement, je pense qu'il doit s'agir d'un compilateur à part (à choisir dans Projects => Build options => selected compiler).

Reply

Marsh Posté le 30-05-2013 à 09:36:20    

Bonjour à tous,
 
Est ce que le fait que j'ai MinGW en 32 bits est contraignant si je veux rester sur l'environnement windows ? parce que après je vais devoir utiliser ce code sur une suite CCS pour travailler sur un processeur, donc je pense qu'il faudrait rester sur le meme environnement et ne pas utiliser un autre logiciel comme MinGW, non ?
 
Si tu es d'accord avec ce que je dis, et que la solution de mettre le chemin en entier jusqu'à un des .dll ne marche pas, il y aurait t il une autre solution ?
Il n'y a pas un logiciel qui crée ce .lib que codeblocks a besoin ?  
 
Toujours concernant cette solution de mettre le chemin en entier jusqu'à un des .dll, peut etre qu'il faut nécessairement mettre tous les fichiers du dossier 'fftw-3.3.3-dll64' dans le dossier de mon programme principal ?  Ou dans codeblocks, il y a sur la gauche une colonne ou tu peux choisir entre <nom du programme>, 'debug' ou encore 'release' qui ont chacun leur onglet 'search directories' etc... donc peut etre qu'il faut placer les chemins dans chacun de ces onglets ?  
 
 
Si pas de solution à ce que je viens de dire, et que je me dois de passer par MinGW 64bits, je peux remplacer directement le MinGW du 'C:\program files'  qui es en 32 bits par celui de 64 bits ? ou je dois tout re télécharger ? ou juste télécharger MinGW avec son environnement propre et tout et tout ?

Reply

Marsh Posté le 30-05-2013 à 15:12:11    

Bon, j'ai vite fait regardé, et je suis quasiment sûr qu'il te faudra un autre compilateur. mingw32 ne peut que créer et faire l'édition de lien de programmes/DLL 32bits. Tu peux télécharger MinGW 64bits ici :
 
http://mingw-w64.sourceforge.net/
 
Aussi, si tu comptes recompiler ce programme pour un autre processeur, pourquoi est-ce que tu te casse la tête avec des DLL 64bits? As-tu vraiment besoin de plus de 4G de RAM pour ton programme? Utilises-tu d'autres DLL qui sont uniquement en 64bits? Si ton système est 64bits, tu peux parfaitement te contenter de DLL 32bits.
 
Aussi MinGW-64 ne remplace pas MinGW-32, il s'installe à coté. Code::Blocks pourra utiliser l'un ou l'autre ensuite.
 

sebastien_begue a écrit :

Toujours concernant cette solution de mettre le chemin en entier jusqu'à un des .dll, peut etre qu'il faut nécessairement mettre tous les fichiers du dossier 'fftw-3.3.3-dll64' dans le dossier de mon programme principal ?  Ou dans codeblocks, il y a sur la gauche une colonne ou tu peux choisir entre <nom du programme>, 'debug' ou encore 'release' qui ont chacun leur onglet 'search directories' etc... donc peut etre qu'il faut placer les chemins dans chacun de ces onglets ?


 [:klm:3] Purée, on t'as laché dans la piscine sans savoir si tu sais nager, on dirait. Réponses courtes:

  • L'édition de DLL fonctionne, je le fais tous les jours.
  • Il ne faut qu'une seule DLL fftw*
  • La "colonne de gauche" liste les cibles de compilations. L'entrée <nom du programme> contient les paramètres de compilation communs à toutes les cibles. Les DLLs à lier sont en général listées là dedans. Les autres entrées contiennent des options spécifiques. À la compilation, les options communes + celle de la cible seront combinées pour compiler/lier le programme. Donc déclarer une DLL à la fois dans l'entrée commune et dans une cible spécifique ne sert à rien.

Reply

Marsh Posté le 26-06-2013 à 00:25:01    

Bonjour à tous !  
 
Désolé de ma réponse tardive, mais les priorités dans mon entreprise ayant changé, d'autres priorités quant à mon projet devaient être prises en compte.
 
Donc en tout cas merci beaucoup tpierron, je m'y suis remis hier et j'ai réussi à faire fonctionner ma FFT correctement.
 
Merci aussi pour la patience que tu as eu avec moi ^^
 
Bonne continuation à tous !

Reply

Marsh Posté le 28-06-2013 à 15:11:46    

Bonjour !  
 
Juste pour ceux qui auraient le même problème, il faudrait se référencer au code de 'Soileh', sauf qu'au niveau de son printf c'est "*out[k]" et pas "out[k]" .
 
Voilà !  
 
Sébastien.

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed