Как получить правильные средние значения после применения преобразования Фурье к данным акселерометра iOS?

Я использую Accelerate framework для применения БПФ к данным акселерометра, код ниже:

         //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. Я не могу найти, что именно не так в коде или настройке БПФ. Пожалуйста, помогите, заранее спасибо.


person Rohit Kashyap    schedule 29.09.2015    source источник


Ответы (1)


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

person Rohit Kashyap    schedule 29.09.2015