计算FFT Swift幅度的正确方法

问题描述

我正在尝试计算来自加速度计的信号的FFT。但是,缩放的幅度远未达到。我尝试将其按比例缩小2(如某些人建议的那样)不起作用,并且也按采样率按比例缩小。

下面有两个图,第一个是时域,第二个是频域。 Signal timeDom high amplitudeCorrect peak Freq.,wrong amplitude

如果时域中的振幅较低(有办法将其从图形中删除)并用峰值打印频率,则初始值也会有问题。 Signal timeDom low amplitudeHigh amplitude 0Hz,hides real freq..

我的FFT代码

  func fft(signal: [Float]) -> [Float]{
    // The length of the input
    let length = vDSP_Length(signal.count)

    let log2n = vDSP_Length(floor(log2(Float(length*2))))
    
    let fftSetup = vDSP_create_fftsetup(log2n,FFTradix(kFFTradix2))!


    var forwardInputReal = [Float](signal)
    var forwardInputImag = [Float](repeating: 0,count: Int(length))
    var forwardOutput = DSPSplitComplex(realp: &forwardInputReal,imagp: &forwardInputImag)

    /// --- Compute FFT @available only after iOS13
    /*
    forwardInputReal.withUnsafeMutableBufferPointer { forwardInputRealPtr in
        forwardInputImag.withUnsafeMutableBufferPointer { forwardInputImagPtr in
            forwardOutputReal.withUnsafeMutableBufferPointer { forwardOutputRealPtr in
                forwardOutputImag.withUnsafeMutableBufferPointer { forwardOutputImagPtr in
                // Input
                    let forwardInput = DSPSplitComplex(realp: forwardInputRealPtr.baseAddress!,imagp: forwardInputImagPtr.baseAddress!)
                // Output
                    var forwardOutput = DSPSplitComplex(realp: forwardOutputRealPtr.baseAddress!,imagp: forwardOutputImagPtr.baseAddress!)
           
                    fftSetup.forward(input: forwardInput,output: &forwardOutput)
                    vDSP.absolute(forwardOutput,result: &magnitudesX)
                //for i in magnitudesX{
                //    magnituteXVariable.append(i/Float(length/2))
                //}
                magnituteXVariable = magnitudesX
              }
            }
          }
        }
        */
        
        vDSP_fft_zrip(fftSetup,&forwardOutput,1,log2n,Int32(FFT_FORWARD))
        var fftMag = [Float](repeating: 0.0,count: Int(length/2))
        vDSP_zvmags(&forwardOutput,&fftMag,vDSP_Length(length/2))
    
        vDSP_destroy_fftsetup(fftSetup)
        return fftMag
    }

预先感谢!

P.S我需要使用zip或zrip,因为该应用程序应可用于iOS13之前的版本。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...