®Useless (Normal User)
Rookie
Messaggi: 26
Iscritto: 06/04/2009
|
ciao a tutti,ho qualche domanda da fare:
la prima un po' scema,ma nn capisco proprio perchè non vada,ho un array di double e faccio un for per azzerarli ma nn me li azzera,una roba del tipo
double array[n]
for(i=0;i<n;i++)array=0;
vannno quasi tutte a zero ma alcune no :O
devo fare un programma che mi trovi i picchi di risonanza di un segnale,ho gia portato i campioni nel dominio della frequenza,ma non ho la minima idea di come trovare i picchi,qualcuno puo darmi qualche idea???
|
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
una volta convertito il segnale nel dominio della frequenza, devi calcolare le derivate prima e seconda della funzione, ed estrarre i punti dove f' = 0 e f'' < 0
PS: per il primo problema, devi postare tutto il codice, non solo quel frammento, altrimenti non si capisce dove stia l'errore :-)
Ultima modifica effettuata da TheKaneB il 01/04/2010 alle 18:16 |
|
®Useless (Normal User)
Rookie
Messaggi: 26
Iscritto: 06/04/2009
|
grazie mille della risposta,ora cerco come si fanno le derivate.il codice è questo,dovevo azzerare l array per lo zero padding(non son nemmeno sicuro di averlo messo al punto giusto :-))
Codice sorgente - presumibilmente C |
void FFT (double data[], int number_of_complex_samples, int isign) { //data -> array float che rappresenta la matrice di campioni complessi //number_of_complex_samples -> numero di campioni (di ordine N ^ 2) //isign -> 1 per il calcolo FFT e -1 per il calcolo FFT inversa //variabili per ricorrenze trigonometriche int pad=128; unsigned long n,mmax,m,j,istep,i; double wtemp,wr,wpr,wpi,wi,theta,tempr,tempi; //Zero-Padding a una potenza di 2 se necessario while(number_of_complex_samples!=pad){ if(number_of_complex_samples<pad){ for(int q=number_of_complex_samples;q<pad;q++) data[q]=0.0; <==== qui non mi si azzera del tutto number_of_complex_samples=pad; break; } else pad*=2; } //l'array è composto da una parte reale (data[index]) + una immaginaria (data[index+1]) n=number_of_complex_samples * 2; j=0; //for(int l=0;l<number_of_complex_samples;l++)cout<<data[l]<<endl; for (i=0;i<n/2;i+=2) { if (j > i) { //swap parte reale SWAP(data[j],data[i]); //swap parte immaginaria SWAP(data[j+1],data[i+1]); //controlla se i cambiamenti si sono verificati sulla prima metà //e utilizza l'effetto speculare sulla seconda metà if((j/2)<(n/4)){ //swap parte reale SWAP(data[(n-(i+2))],data[(n-(j+2))]); //swap parte immaginaria SWAP(data[(n-(i+2))+1],data[(n-(j+2))+1]); } } m=n/2; while (m >= 2 && j >= m) { j -= m; m = m/2; } j += m; } //routine di Danielson-Lanzcos mmax=2; //ciclo esterno while (n > mmax) { istep = mmax<< 1; theta=isign*(2*pi/mmax); wtemp=sin(0.5*theta); wpr = -2.0*wtemp*wtemp; wpi=sin(theta); wr=1.0; wi=0.0; //ciclo interno for (m=1;m<mmax;m+=2) { for (i= m;i<=n;i+=istep) { j=i+mmax; tempr=wr*data[j-1]-wi*data[j]; tempi=wr*data[j]+wi*data[j-1]; data[j-1]=data[i-1]-tempr; data[j]=data[i]-tempi; data[i-1] += tempr; data[i] += tempi; } wr=(wtemp=wr)*wpr-wi*wpi+wr; wi=wi*wpr+wtemp*wpi+wi; } mmax=istep; } }
|
ok fatto,scusatemi
Ultima modifica effettuata da ®Useless il 01/04/2010 alle 18:51 |
|
()
Newbie
Messaggi:
Iscritto:
|
Devi racchiudere il codice che hai postato tra i tag CODE (c'è un tasto apposito nel forum), altrimenti parti del codice sono interpretate diversamente e visualizzate in modo che non si capisce nulla.
In ogni caso, il ciclo che avevi indicato all'inizio iniziava da 0, ma quello del tuo programma, come hai scritto in
for(int q=number_of_complex_samples;q<pad;q++)
inizia dal valore number_of_complex_samples e, ovviamente, non è la stessa cosa.
Ultima modifica effettuata da il 01/04/2010 alle 18:53 |
|
®Useless (Normal User)
Rookie
Messaggi: 26
Iscritto: 06/04/2009
|
sisi vero,ma lo avevo postato per fare un esempio,tutto quello prima di quel valore non me lo deve toccare,poi mi deve buttare a zero il resto....su 128 locazioni me ne azzera tipo 120.
le altre 8 sparse mi ci lascia un valore assurdo
|
|
()
Newbie
Messaggi:
Iscritto:
|
Dicci con certezza, quali sono i valori assunti dalle variabili
number_of_complex_samples e pad
prima della for.
|
|
®Useless (Normal User)
Rookie
Messaggi: 26
Iscritto: 06/04/2009
|
pad 256
number_of_complex_samples 129
dopo il for entrambi sono 256
nel for che cè piu in basso che ho messo sotto commento nel codice che ho postato,controllavo i valori del vettore.
|
|
()
Newbie
Messaggi:
Iscritto:
|
Sei sicuro? Quei valori come li hai ottenuti? Hai inserito una
printf
prima del ciclo for?
Se hai fatto così, allora sono stati azzerati gli elementi dal 129 al 255
|
|
®Useless (Normal User)
Rookie
Messaggi: 26
Iscritto: 06/04/2009
|
si,ho fatto come hai detto te e mi da 129 e 256.ma non me li azzera tutti quelli da 129 a 255,mi sembra impossibile anche a me :/
|
|