Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1836 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Une fonction qui ne fonctionne qu'une fois !!

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Une fonction qui ne fonctionne qu'une fois !!

n°1887461
pierrot777​7
Posté le 25-05-2009 à 08:05:50  profilanswer
 

Bonjour,
Je suis en train d'ecrire un programme qui effectue entre autre du traitement de donnees.
Je dois calculer la magnitude de deux vecteurs, j'ai pour cela ecrit une fonction Magnitude, que j'utilise de la maniere suivante :  
 

Code :
  1. MagnitudeBgT= Magnitude(BgTLp,BgT_size,RedFactor,Nfft);
  2. MagnitudeTemplate = Magnitude(TemplateLp,Template_size,RedFactor,Nfft);


 
Je ne pense pas que cela soit tres important mais ci-dessous vous trouverez l'implementation de la fonction.
 
Peu importe les parametres, toujours est-il que la fonction renvoit des resultats corrects la premiere fois (ici donc le tableau MagnitudeBgT sera rempli correctement), tandis que le second tableau ne le sera pas (premiere case du tableau non nulle puis que des zeros).
 
Si j'ordonne mes lignes dans ce sens:  
 

Code :
  1. MagnitudeTemplate = Magnitude(TemplateLp,Template_size,RedFactor,Nfft);
  2. MagnitudeBgT= Magnitude(BgTLp,BgT_size,RedFactor,Nfft);


 
C'est exactement l'inverse ! MagnitudeTemplate est correctement rempli mais pas MagnitudeBgT...
Est ce que l'appel d'une fonction peut la modifier ???  
 
Voici le code de la fonction  

Code :
  1. double* Magnitude(double* input,int len_input,float fact_red,int nfft)
  2. {
  3. complex_t * datafft = new complex_t[nfft];
  4. complex_t * resfft = new complex_t[nfft];
  5. double* magnitude = new double[nfft/2]; //we keep only half of the spectrum since it is symetric
  6. double E=1; //total energy
  7.  datafft[0].im = 0;
  8.  datafft[0].re = input[0]/nfft;
  9. if(nfft > len_input)
  10. {
  11.  for(int n = 1;n<len_input;n++) //filter to increase high frequencies. fact_red must be between 0 and 1. 0.7 gives good results.
  12.  {
  13.   datafft[n].im = 0;
  14.   datafft[n].re = (input[n] - fact_red*input[n-1])/nfft;
  15.  }
  16.  for(int n = len_input;n<nfft;n++) //filter to increase high frequencies. fact_red must be between 0 and 1. 0.7 gives good results.
  17.  {
  18.   datafft[n].im = 0;
  19.   datafft[n].re = 0;
  20.  }
  21. }
  22. else
  23. {
  24.  for(int n = 1;n<nfft;n++) //filter to increase high frequencies. fact_red must be between 0 and 1. 0.7 gives good results.
  25.  {
  26.   datafft[n].im = 0;
  27.   datafft[n].re = (input[n] - fact_red*input[n-1])/nfft;
  28.  }
  29. }
  30. resfft = FFT_simple(datafft,nfft);
  31. for(int n = 0;n<nfft/2;n++)
  32. {
  33.  magnitude[n] = module(resfft[n]);
  34. }
  35. E = sum(magnitude,0,nfft/2);
  36. for(int n = 1;n<nfft/2;n++)
  37. {
  38.  magnitude[n] = magnitude[n]/E;
  39. }
  40. return magnitude;
  41. }


 
 
Merci pour votre aide !

mood
Publicité
Posté le 25-05-2009 à 08:05:50  profilanswer
 

n°1887462
Taz
bisounours-codeur
Posté le 25-05-2009 à 08:13:40  profilanswer
 

Vu qu'en C++ les indices de tableaux vont de 0 à n-1, t'as du chemin à faire ...

n°1887463
pierrot777​7
Posté le 25-05-2009 à 08:17:18  profilanswer
 

Bingo,
en effet dans la derniere ligne je vais de 1 a nfft/2, au lieu de 0 a nfft/2-1 ... l'habitude de matlab !
Merci Taz, ca n'explique qu'a moitie le probleme mais au moins maintenant ca marche !

n°1887464
Joel F
Real men use unique_ptr
Posté le 25-05-2009 à 08:24:19  profilanswer
 

ca l'expique totalement. En sortant du tableau, tu niaque les données de celui d'aprés qui a de forte change d'etre allouées de manières contigues.
 
Apres t'as aussi le droit d'utiliser des libs de FFT plutot que de reinventer mal la roue : goto FFTW

n°1887473
Taz
bisounours-codeur
Posté le 25-05-2009 à 08:55:15  profilanswer
 

C'est pas qu'à la dernière ligne, c'est partout ...

n°1887489
pierrot777​7
Posté le 25-05-2009 à 09:58:49  profilanswer
 

Non non c'est juste la derniere ligne parce que j'ai implemente une fonction sum qui fait que je me suis plante dans les indices. Pour les boucles, je fais i<nfft/2 (et pas i<=nfft/2 )
 
Joel, j'aimerais bien utiliser FFTW mais lorsque je suis alle sur leur site, impossible de telecharger une version pour windows (je travaille avec msvc), le lien est mort, et j'ai jamais reussi a trouver un autre miroir ... si l'un de vous a une version qui fonctionne avec windows et s'il pouvait m'envoyer ca par mail je suis plus que preneur !

n°1887519
Taz
bisounours-codeur
Posté le 25-05-2009 à 11:13:58  profilanswer
 

OK, autant pour moi, en C++ les indices de tableaux ne vont de 0 à n-1 que sur la dernière ligne.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Une fonction qui ne fonctionne qu'une fois !!

 

Sujets relatifs
AJAX fonction globale?inline et pointeur sur fonction
fonction exit et CSSScheme : fonction intersection
[Besoin d'aide]: php dans requête SQL qui ne fonctionne paserreur dans ma fonction
[GTK+] Ajouter un boutton a une fenetre grace à une fonctionFonction substring dans un swf
pointeur vs reference en retour de fonctionApelle de la fonction Click de composant crée ou cour de l'execution
Plus de sujets relatifs à : Une fonction qui ne fonctionne qu'une fois !!


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR