Я использую 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. Пожалуйста, помогите, спасибо заранее.
Вы можете принять этот ответ? –