2012-01-06 3 views
5

Sto lavorando a un progetto Android in cui sto utilizzando FFT per elaborare i dati dell'accelerometro e ho problemi a capire come funzionano effettivamente queste cose. Sto usando biblioteca jTransform di Piotr Wendykier nel seguente modo:Interpretazione FFT

 int length = vectors.length; 
     float[] input = new float[length*2]; 
     for(int i=0;i<length;i++){ 
      input[i]=vectors[i]; 
     } 

     FloatFFT_1D fftlib = new FloatFFT_1D(length); 
     fftlib.complexForward(input); 

     float outputData[] = new float[(input.length+1)/2]; 
     if(input.length%2==0){ 
      for(int i = 0; i < length/2; i++){ 

       outputData[i]= (float) Math.sqrt((Math.pow(input[2*i],2))+(Math.pow(input[2*(i)+1], 2))); 
      } 
     }else{ 
      for(int i = 0; i < length/2+1; i++){ 

       outputData[i]= (float) Math.sqrt((Math.pow(input[2*i],2))+(Math.pow(input[2*i+1], 2))); 
      } 
     } 

     List<Float> output = new ArrayList<Float>(); 
     for (float f : outputData) { 
      output.add(f); 
     } 

il risultato è una matrice con i seguenti dati output data visualization.

Ho problemi con l'interpretazione dei dati di uscita ... I dati sono da 10 secondi di intervallo e la frequenza di campionamento è 50 Hz. Mentre catturavo stavo muovendo il telefono su e giù cca ogni 3/4 secondi nella mia mano , quindi è possibile che l'estremo che è circa x il valore 16 potrebbe essere il periodo del componente più forte del segnale? devo avere la frequenza della componente più forte del segnale ..

risposta

7

La frequenza rappresentata da ciascun bin risultato FFT è il numero di volte bin la frequenza di campionamento diviso per la lunghezza della FFT (convoluta con una funzione Sinc dare larghezza non nulla, per essere un po 'tecnico). Se la tua frequenza di campionamento è di 50 Hz e la lunghezza del tuo fft è di 512 piedi, allora il bin 16 del risultato fft rappresenterebbe circa 1,6 Hz che è vicino ad avere un periodo di 0,7 secondi.

Il picco nel bidone 0 (CC) potrebbe rappresentare la forza di gravità diversa da zero sull'accelerometro.

+0

La gravità non ha alcun effetto su un accelerometro ... Il picco a CC è probabile che sia semplicemente un errore di uscita sul sensore o anche semplicemente che l'integrale dell'accelerazione del dispositivo sulla finestra di misurazione non sia zero (in altre parole , ci fu un netto cambio di velocità). –

+0

@Oli: interessante. L'accelerometro sul mio iPhone steso sulla scrivania riporta un costante -1 sull'asse Z. La direzione del -1 è il modo in cui viene determinato l'orientamento del dispositivo. Android è diverso? – hotpaw2

+0

Hmm, non so nulla dei sensori usati nei telefoni, quindi ritiro la mia precedente affermazione! Tuttavia, troverei il nome "accelerometro" un po 'fuorviante se fosse stato progettato per riportare valori diversi da zero quando il dispositivo era fermo. –

1

Poiché si dispone dei dati reali, è necessario passare questi valori alla funzione realForward (non complexForward) come indicato here.