Une fonction qui ne fonctionne qu'une fois !!

Une fonction qui ne fonctionne qu'une fois !! - C++ - Programmation

Marsh Posté le 25-05-2009 à 08:05:50    

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 !

Reply

Marsh Posté le 25-05-2009 à 08:05:50   

Reply

Marsh Posté le 25-05-2009 à 08:13:40    

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

Reply

Marsh Posté le 25-05-2009 à 08:17:18    

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 !

Reply

Marsh Posté le 25-05-2009 à 08:24:19    

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

Reply

Marsh Posté le 25-05-2009 à 08:55:15    

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

Reply

Marsh Posté le 25-05-2009 à 09:58:49    

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 !

Reply

Marsh Posté le 25-05-2009 à 11:13:58    

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

Reply

Sujets relatifs:

Leave a Replay

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