2015-09-29 4 views
1

Я использую Accelerate framework применять FFT на данных акселерометра, код ниже:Как получить правильные средние значения после применения преобразования Фурье на данных акселерометра iOS?

  //Set up 
       FFTSetup fft_weights; 
       DSPSplitComplex inputDataSplitComplex; 
       Float32 *outMagnitudes; 
       UInt32 mAccelFFTLength; 
       UInt32 log2n; 
       UInt32 fftFrameSize; 

       Step 1: 
        -(void)initializeFFtSetUP 
        { 
         fftFrameSize = fftsize; //256 
         mAccelFFTLength = fftFrameSize/2; //128 
         log2n = log2f(fftFrameSize/2)+1; 

        inputDataSplitComplex.realp = (Float32 *)calloc(mAccelFFTLength,sizeof(Float32)); 

         inputDataSplitComplex.imagp = (Float32 *)calloc(mAccelFFTLength,sizeof(Float32)); 

         fft_weights = vDSP_create_fftsetup(log2n, kFFTRadix2); 
         outMagnitudes = (Float32 *)calloc(mAccelFFTLength,sizeof(Float32)); 

        } 


      Step 2: 

      - (Float32)calculateFastFourierTransform 
      { 
       //accelDataArray is an NSMutableArray of accelerometer data values 'userAcceleration.x' from CMDeviceMotionManager 
       for (NSUInteger currenIndex = 0; currenIndex < mAccelFFTLength; currenIndex++) 
       { 
        inputDataSplitComplex.realp[currenIndex] = (Float32)[[accelDataArray objectAtIndex:currenIndex]floatValue]; 
        inputDataSplitComplex.imagp[currenIndex] = 0.0f; 
       } 
       vDSP_fft_zrip(fft_weights, &inputDataSplitComplex, 1, log2n, kFFTDirection_Forward); 

       inputDataSplitComplex.realp[0] = 0.0; 
       inputDataSplitComplex.imagp[0] = 0.0; 

       Float32 meanVal = 0.0; 
       Float32 fftMax = 0.0; 

       // Get magnitudes 
       vDSP_zvmags(&inputDataSplitComplex, 1, outMagnitudes, 1, mAccelFFTLength); 
       vDSP_vsq(outMagnitudes, 1, outMagnitudes, 1, mAccelFFTLength);//square 
       vDSP_meanv(outMagnitudes, 1, &meanVal, mAccelFFTLength); 

       return sqrtf(meanVal); 
      } 

Проблема: Когда устройство стабильных значений в порядке, однако, когда я помещал устройство для ускорения, значение (meanVal) идет в тысячах например: 5248, 64000. Я не могу найти то, что именно неправильно в настройке кода или FFT. Пожалуйста, помогите, спасибо заранее.

ответ

1

Решил проблему: 'vDSP_zvmags' вырабатывает квадрат величин комплексного вектора, поэтому следующая строка 'vDSP_vsq' не требуется. Я дважды вычислял квадрат, поэтому результаты были большими.

+1

Вы можете принять этот ответ? –