Bonjour,
Je suis en train de faire un logiciel d'analyse spectrale, le logiciel en lui même n'a aucun intérêt c'est juste un prétexte pour apprendre et pratiquer le C++ et la transformée de Fourier discrète.
Tout allais bien dans le meilleur des modes, je tapais du code, chassais les bugs et j'améliorais mon programme, pour voir si tout marchais bien j'utilisais comme signal une simple sinusoïde et une fonction de transfert unité (pièce jointe 1), ensuite j'ai implémenté le signal carré, je fais un test un peut plus complexe avec un signal de 0 a 5v on peut voir le magnifique résultat en pièce jointe 2, puis j'ai ajouté le signal triangle : pas de problèmes et pour finir le signal dent de scie et là c'est le drame ! (pièce jointe 3) la phase du signal de sortie est inversé, si j'applique la fonction de transfert qui inverse la phase je retrouve les signaux d'entrée de de sortie en phase.
Quel est le problème avec le signal en dent de scie ? bien sur si je colle un signe moins là ou il faut le signal dent de scie ce trouve en phase, mais tout les autre signaux sont inversés.
Le code de la transformée :
Code:void View::FT() { int k,n,N=i_npoint; double a,b; for(k=N;k>N/2;k--) { a=0; for(n=0;n<N;n++) { a=a+(complex_time[n].rho * cos((-2*PI*k*n/N)+complex_time[n].phi) ); } b=0; for(n=0;n<N;n++) { b=b+(complex_time[n].rho * sin((-2*PI*k*n/N)+complex_time[n].phi) ); } complex_freq[N-k].rho=sqrt((a*a)+(b*b)); complex_freq[N-k].phi=acos(a/complex_freq[N-k].rho); complex_freq[N-k].rho=(1/sqrt(N))*complex_freq[N-k].rho; if(k!=N){complex_freq[N-k].rho=complex_freq[N-k].rho*2;} } }
Si quelqu'un peut m'aider, merci d'avance.
-----