2012-01-06 23 views
5

Estoy trabajando en un proyecto de Android en el que estoy usando FFT para procesar datos de acelerómetro y tengo problemas para entender cómo funcionan realmente estas cosas. estoy usando la biblioteca jTransform de Piotr Wendykier de la siguiente manera:Interpretación 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); 
     } 

el resultado es una matriz con los datos siguientes output data visualization.

Tengo un problema con la interpretación de los datos de salida ... Los datos son de 10 segundos de intervalo largo, y la frecuencia de muestreo es 50Hz..Mientras capturaba movía el teléfono hacia arriba y hacia abajo cada 3/4 segundos en mi mano , entonces, ¿es posible que el extremo que tiene aproximadamente x valor 16 sea el período del componente más fuerte de la señal? Necesito obtener la frecuencia del componente más fuerte en la señal ..

Respuesta

7

La frecuencia representada por cada contenedor de resultado fft es el número de intervalo multiplicado por la velocidad de muestreo dividido por la longitud de la función fft (convolucionado con una función Sinc ancho no nulo, para ser un poco técnico). Si su frecuencia de muestreo es de 50 Hz y la longitud de su fft es de 5 pies fft, entonces el contenedor 16 del resultado fft representaría alrededor de 1.6 Hz, que está cerca de tener un período de 0.7 segundos.

El pico en el contenedor 0 (DC) puede representar la fuerza de gravedad no nula en el acelerómetro.

+0

Gravity no tiene efecto sobre un acelerómetro ... El pico en CC es simplemente un sesgo de salida en el sensor, o simplemente que la integral de la aceleración del dispositivo sobre la ventana de medición no era cero (en otras palabras , hubo un cambio neto en la velocidad). –

+0

@Oli: Interesante. El acelerómetro de mi iPhone que está sobre el escritorio informa una constante -1 en el eje Z. La dirección del -1 es cómo se determina la orientación del dispositivo. ¿Android es diferente? – hotpaw2

+0

Hmm, no sé nada sobre los sensores utilizados en los teléfonos, ¡así que me retracto de mi declaración anterior! Sin embargo, el nombre "acelerómetro" me resultaría un poco engañoso si se diseñó para informar un valor distinto de cero cuando el dispositivo estaba parado. –

1

Como tiene los datos reales, debe pasar estos valores a la función realForward (no complexForward) como se indica here.