2012-01-06 4 views
5

나는 가속도계 데이터를 처리하기 위해 FFT를 사용하는 안드로이드 프로젝트에서 wokring하고 있는데, 실제로 어떻게 작동하는지 이해하는 데 문제가 있습니다. 나는 다음과 같은 방법으로 표트르 Wendykier에 의해 jTransform 라이브러리를 사용하고 있습니다 :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); 
     } 

결과는 다음과 같은 데이터 output data visualization와 배열입니다.

출력 데이터를 해석하는 데 문제가 있습니다. 데이터 길이가 10 초이고 샘플링 빈도가 50Hz입니다. 캡처하는 동안 휴대 전화를 3/4 초마다 내 손으로 움직였습니다. , 따라서 x 값이 16 인 극단이 신호의 가장 강한 구성 요소의 기간이 될 수 있습니까? 신호에서 가장 강한 구성 요소의 주파수를 알아야합니다.

답변

7

각 fft 결과 bin으로 표시되는 빈도는 샘플링 속도를 fft의 길이로 나눈 빈 수입니다 (Sinc 함수로 주어짐). 비 - 제로 너비, 조금 기술적 인 얻을). 샘플 속도가 50Hz이고 fft 길이가 fft 길이가 512이면 fft 결과의 bin 16은 약 1.6Hz를 나타내며 0.7 초의주기에 가깝습니다.

빈 0 (DC)의 스파이크는 가속도계에서 0이 아닌 힘을 나타낼 수 있습니다.

+0

중력은 가속도계에 아무런 영향을 미치지 않습니다 ... DC에서의 스파이크는 단순히 센서의 출력 바이어스 일 가능성이 높습니다. 또는 단순히 측정 윈도우에 대한 장치 가속도의 적분이 0이 아닐 수도 있습니다 (즉, , 속도의 순수한 변화가 있었다). –

+0

@Oli : 흥미 롭습니다. 책상에 누워있는 iPhone의 가속도계는 Z 축에 일정한 -1을보고합니다. -1의 방향은 장치 방향이 결정되는 방법입니다. Android가 다른가요? – hotpaw2

+0

흠, 전화기에 사용되는 센서에 대해 아무것도 모릅니다. 따라서 이전의 진술을 철회합니다! 그러나 장치가 정지했을 때 0이 아니라고보고하도록 설계된 경우 "가속도계"라는 이름을 약간 오도 할 수 있습니다. –

1

실제 데이터가 있으니 here처럼 realForward 함수 (complexForward 아님)에이 값을 전달해야합니다.