我正在开发一种应用程序,它应分析来自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[]
数组):
为什么本底噪声如此不同?
在主峰(或多或少3kHz)之后,我们在Linux结果中观察到负峰值,而MATLAB从输入信号中正确显示了次峰值。
在这些示例中,我们不会在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);