在加速度计数据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上应用傅里叶变换后如何获得正确的平均值?的主要内容,如果未能解决你的问题,请参考以下文章

对时间序列数据应用傅里叶变换并避免混叠

Delphi如何在三轴加速器的频谱分析中使用FFT(快速傅里叶变换)算法

真实感海洋的绘制:使用快速傅里叶变换加速波形计算

傅里叶变换简介

离散傅里叶变换 C++ - 下一步做啥?

傅里叶变换及其应用