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