Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicitÓ e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - FFT
Forum - C/C++ - FFT

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
«Useless (Normal User)
Rookie


Messaggi: 26
Iscritto: 06/04/2009

Segnala al moderatore
Postato alle 18:02
Giovedý, 01/04/2010
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???


c++
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1787
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 18:11
Giovedý, 01/04/2010
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


Software Failure: Guru Meditation
Forum su Informatica, Elettronica, Robotica e Tecnologia: http://www.nonsoloamiga.com
PM Quote
Avatar
«Useless (Normal User)
Rookie


Messaggi: 26
Iscritto: 06/04/2009

Segnala al moderatore
Postato alle 18:32
Giovedý, 01/04/2010
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

  1. void FFT (double data[], int number_of_complex_samples, int isign)
  2. {       //data -> array float che rappresenta la matrice di campioni complessi
  3.         //number_of_complex_samples -> numero di campioni (di ordine N ^ 2)
  4.         //isign -> 1 per il calcolo FFT e -1 per il calcolo FFT inversa
  5.        
  6.         //variabili per ricorrenze trigonometriche
  7.         int pad=128;
  8.         unsigned long n,mmax,m,j,istep,i;
  9.     double wtemp,wr,wpr,wpi,wi,theta,tempr,tempi;
  10.  
  11.         //Zero-Padding a una potenza di 2 se necessario
  12.         while(number_of_complex_samples!=pad){
  13.  
  14.                 if(number_of_complex_samples<pad){
  15.  
  16.                         for(int q=number_of_complex_samples;q<pad;q++)
  17.  
  18.                                 data[q]=0.0;  <==== qui non mi si azzera del tutto
  19.  
  20.                         number_of_complex_samples=pad;
  21.                         break;
  22.  
  23.                 }
  24.                
  25.                 else pad*=2;
  26.  
  27.         }
  28.  
  29.         //l'array Ŕ composto da una parte reale (data[index]) + una immaginaria (data[index+1])
  30.  
  31.         n=number_of_complex_samples * 2;        
  32.     j=0;
  33.         //for(int l=0;l<number_of_complex_samples;l++)cout<<data[l]<<endl;
  34.     for (i=0;i<n/2;i+=2) {
  35.  
  36.         if (j > i) {
  37.  
  38.             //swap parte reale
  39.             SWAP(data[j],data[i]);
  40.  
  41.             //swap parte immaginaria
  42.             SWAP(data[j+1],data[i+1]);
  43.  
  44.             //controlla se i cambiamenti si sono verificati sulla prima metÓ
  45.                         //e utilizza l'effetto speculare sulla seconda metÓ
  46.             if((j/2)<(n/4)){
  47.                
  48.                                 //swap parte reale
  49.                 SWAP(data[(n-(i+2))],data[(n-(j+2))]);
  50.  
  51.                                 //swap parte immaginaria
  52.                 SWAP(data[(n-(i+2))+1],data[(n-(j+2))+1]);
  53.             }
  54.         }
  55.  
  56.         m=n/2;
  57.         while (m >= 2 && j >= m) {
  58.             j -= m;
  59.             m = m/2;
  60.         }
  61.  
  62.         j += m;
  63.     }
  64.  
  65.     //routine di Danielson-Lanzcos
  66.  
  67.     mmax=2;
  68.  
  69.     //ciclo esterno
  70.     while (n > mmax)
  71.     {
  72.         istep = mmax<<  1;
  73.         theta=isign*(2*pi/mmax);
  74.         wtemp=sin(0.5*theta);
  75.         wpr = -2.0*wtemp*wtemp;
  76.         wpi=sin(theta);
  77.         wr=1.0;
  78.         wi=0.0;
  79.  
  80.         //ciclo interno
  81.         for (m=1;m<mmax;m+=2) {
  82.             for (i= m;i<=n;i+=istep) {
  83.                 j=i+mmax;
  84.                 tempr=wr*data[j-1]-wi*data[j];
  85.                 tempi=wr*data[j]+wi*data[j-1];
  86.                 data[j-1]=data[i-1]-tempr;
  87.                 data[j]=data[i]-tempi;
  88.                 data[i-1] += tempr;
  89.                 data[i] += tempi;
  90.             }
  91.             wr=(wtemp=wr)*wpr-wi*wpi+wr;
  92.             wi=wi*wpr+wtemp*wpi+wi;
  93.         }
  94.         mmax=istep;
  95.     }
  96.        
  97. }



ok fatto,scusatemi

Ultima modifica effettuata da «Useless il 01/04/2010 alle 18:51


c++
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5460
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 18:49
Giovedý, 01/04/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 ...
PM Quote
Avatar
«Useless (Normal User)
Rookie


Messaggi: 26
Iscritto: 06/04/2009

Segnala al moderatore
Postato alle 18:57
Giovedý, 01/04/2010
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


c++
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5460
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:01
Giovedý, 01/04/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 ...
PM Quote
Avatar
«Useless (Normal User)
Rookie


Messaggi: 26
Iscritto: 06/04/2009

Segnala al moderatore
Postato alle 19:11
Giovedý, 01/04/2010
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.


c++
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 5460
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 19:17
Giovedý, 01/04/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 ...
PM Quote
Avatar
«Useless (Normal User)
Rookie


Messaggi: 26
Iscritto: 06/04/2009

Segnala al moderatore
Postato alle 19:20
Giovedý, 01/04/2010
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 :/


c++
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo