®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 |
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
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 nessuno il 01/04/2010 alle 18:53
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
®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
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
Dicci con certezza, quali sono i valori assunti dalle variabili
number_of_complex_samples e pad
prima della for.
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
®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.
|
|
nessuno (Normal User)
Guru^2
Messaggi: 6402
Iscritto: 03/01/2010
|
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
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità. |
|
®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 :/
|
|