FFTW输出与Matlab的输入数据集

时间:2018-01-12 17:17:13

标签: c linux matlab fftw

我正在开发一种应用程序,它应分析来自A / D级的数据,并在定义的频率范围(0-10kHz)内找到频率峰值。 我们正在使用运行在64位Slackware Linux(GCC版本5.3.0)上的FFTW3库3.3.6版。正如您在所包含的代码中看到的那样,我们运行FFTW计划,得到复杂向量result[]的结果。我们已经使用MATLAB验证了操作。我们在MATLAB上运行FFT(声称使用相同的库)具有完全相同的输入数据集(复杂signal[],如源代码中所示)。我们观察到FFTW(Linux ANSI C)和MATLAB运行之间存在一些差异。每个绘图都使用MATLAB完成。特别是,我们想了解(mag[]数组):

  1. 为什么本底噪声如此不同?

  2. 在主峰(或多或少3kHz)之后,我们在Linux结果中观察到负峰值,而MATLAB从输入信号中正确显示了次峰值。

  3. 在这些示例中,我们不会在Linux和MATLAB中执行任何输出规范化。这两个图显示了FFT结果的幅度(​​未转换为dB)。

    正确的结果是MATLAB的结果。有人对这种差异有任何建议吗?我们如何利用FFTW库生成更接近MATLAB的结果?

    在C源代码和两个图下面。

    //
    // Part of source code:
    //
    //  rup[] is filled with unsigned char data coming from an A/D conversion stage (8 bit depth)
    //  Sampling Frequency is 45.454 KHz
    //  Frequency Range: 0 - 10.0 KHz
    //  
    
    
    #define CONVCOST 0.00787401574803149606
    
    double mag[4096];
    unsigned char rup[4096];
    int i;
    
    fftw_complex signal[1024];
    fftw_complex result[1024];
    
        ...
    
    fftw_plan plan = fftw_plan_dft_1d(1024,signal,result,FFTW_FORWARD,FFTW_ESTIMATE);
    
    for(i=0;i<1024;i++)
    {
      signal[i][REAL] = (double)rup[i] * CONVCOST;
      signal[i][IMAG] = 0.0;  
    }                                   
    
    fftw_execute(plan);
    
    for (i = 0; i < 512; ++i) 
    {   
      mag[i] = sqrt(result[i][REAL] * result[i][REAL] + result[i][IMAG] * result[i][IMAG]);
    }
    
    fftw_destroy_plan(plan);
    

    Linux fft result matlab fft result

0 个答案:

没有答案