项目场景:在QT中对某段信号计算FFT,并采用QcustomPlot画出频谱图
问题描述:QT中画出的频谱图一直显示在-744Hz至744Hz的频段内,而MATLAB中FFT的结果在0-10KHz都有频率分量,出现不一致情况。
1、QT输出FFT频谱图
2、MATLAB输出FFT频谱图
原因分析:第一反应是QT中引用FFTW函数计算FFT出现错误,开始详细排查。
解决方案:通过参考一些网上的demo,发现代码本身没有问题。
1、排除FFTW计算的问题。与MATLAB计算的结果进行了比较,发现二者输出的结果是一致的。
//FFTW计算FFT
void FFT(double *y,int N,double *FFT){
fftw_complex *in = NULL;
fftw_complex *out = NULL;
fftw_plan p;
//分配内存空间
in = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * N);
out = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * N);
// 创建句柄
p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
// 输入
for (int i=0; i<N; i++)
{
in[i][0] = y[i];
in[i][1] = 0;
}
//执行
fftw_execute(p);
fftw_destroy_plan(p);
// 输出
for (int i=0; i<N; i++)
{
FFT[i]= sqrt((out[i][0])*(out[i][0])+(out[i][1])*(out[i][1]));
}
fftw_free(in);
fftw_free(out);
}
2、进一步判断是否为QT绘制频谱图的问题。需要将下列横轴的计算公式做一定的调整,结果输出才是正常的,不知道为啥会有这么一个bug的出现,终归是解决了。
//修改前的代码
QVector<double> x(N/2), y(N/2);
for (int i=0; i< N/2; i++)
{
x[i]=i*handlex2.fs/N;
y[i]=FFT[i]; //y
}
//修改后的代码
QVector<double> x(N/2), y(N/2);
for (int i=0; i< N/2; i++)
{
x[i]=i;
x[i]=x[i]*handlex2.fs/N;
y[i]=FFT[i]; //y
}
3、正常输出,且与MATLAB结果一致,问题得到解决。