在加速度计数据iOS上应用傅里叶变换后如何获得正确的平均值?
Posted
技术标签:
【中文标题】在加速度计数据iOS上应用傅里叶变换后如何获得正确的平均值?【英文标题】:How to get correct mean values after applying Fourier Transform on Accelerometer data iOS? 【发布时间】:2015-09-29 09:18:50 【问题描述】:我正在使用Accelerate framework
对加速度计数据应用 FFT,代码如下:
//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'。我计算了两次平方,因此结果值很大。
【讨论】:
以上是关于在加速度计数据iOS上应用傅里叶变换后如何获得正确的平均值?的主要内容,如果未能解决你的问题,请参考以下文章