Qt Creator中的FFTW

问题描述 投票:0回答:1

我尝试制作一个从IQ数据计算FFTW的程序。Windows 10 64位。基于Qt 5.12.2的Qt Creator 4.8.2(MSVC 2015,32位)我使用

时程序崩溃
fftw_plan_dft_1d(N, in, out, FFT_FORWARD, FFTW_ESTIMATE);

我下载fftw-3.3.5-dll64和dll32,结果相同。

。pro

INCLUDEPATH += $$PWD/fftw-3.3.5-dll32
QMAKE_LIBDIR += $$PWD/fftw-3.3.5-dll32
LIBS += $$PWD/fftw-3.3.5-dll32/ -llibfftw3-3
LIBS += $$PWD/fftw-3.3.5-dll32/ -llibfftw3f-3
LIBS += $$PWD/fftw-3.3.5-dll32/ -llibfftw3l-3

。cpp

include "fftw3.h"

int main()
{
    int N;
    fftw_complex *in, *out;
    fftw_plan myPlan;

    in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)* N);
    out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex)* N);


    fftw_plan_dft_1d(N, in, out, FFT_FORWARD, FFTW_ESTIMATE);  //this line crashed the program.

    fftw_execute(myPlan);

    fftw_destroy_plan(myPlan);
    fftw_free(in);
    fftw_free(out);
}

我希望有人能帮助我。谢谢。

windows qt fftw
1个回答
0
投票

这与Windows或QtCreator均无关。您必须正确编写程序。

fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE); //this line crashed the program.

这不是崩溃的行。这条线很好。下一个将完全崩溃,因为您从未分配过myPlan

myPlan = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);

将解决您的问题。前提是您将N设置为合理的值。我确定您也应该至少设置in。当然,除了您想对Fourier进行转换外,RAM中的in也是如此。这是一件很酷的事情。 :)


0
投票

谢谢大家的回应。他们是正确的,变量N没有正确初始化它。我已经纠正了这些错误,并且对我有用。现在,我对获得的频谱表示还有另一个问题。我处于900 MHz的中心频率,并且配置为具有40 MS / s的采样率(IQ对/ s),最大带宽为27 MHz。但是当表示时,它仅显示900-913.5 MHz,只有大约13.5 MHz带宽。初始光谱未显示。我在这里留下代码。有什么想法吗?

bbIQPacket pkt;
float *buffer;
double *maxIQ;
int totalB;

fftw_complex *in, *out;

const int BLOCK_SIZE = 32768;

totalB = BLOCK_SIZE * 2;

maxIQ = new double[totalB];

buffer = new float[totalB];

pkt.iqData = buffer;
pkt.iqCount = BLOCK_SIZE;
pkt.triggers = 0;
pkt.triggerCount = 0;
pkt.purge = true;

// Set a sample rate of 40.0e6 / 2 = 20.0e6 MS/s and bandwidth of 15 MHz
bbConfigureIQ(id, 2, 15.0e6);

bbStatus  status = bbInitiate(id, BB_STREAMING, BB_STREAM_IQ);

bbStatus status = bbGetIQ(id, &pkt);

//FFTW
in = ( fftw_complex* ) fftw_malloc( sizeof( fftw_complex ) * totalB);
out = ( fftw_complex* ) fftw_malloc( sizeof( fftw_complex ) * totalB);
fftw_plan my_plan;

for (int i = 0; i<totalB; i+=2)
{
    QVariant v(buffer[i]);
    double real = v.toDouble();

    double hw= 0.5 * (1 - cos(2*M_PI*i/totalB)); // Hann Windows

    in[count][0] = real * hw;
    in[count][1] = 0;

    count++;
}

for(int i=count; i<totalB; i++)
{
    in[i][0] = 0;
    in[i][1] = 0;
}

my_plan = fftw_plan_dft_1d(totalB, in, out, FFTW_FORWARD, FFTW_ESTIMATE);// create Plan

fftw_execute(my_plan);// FFT

for (int i = 0; i < totalB/2; i++)
{
    double r1 = out[i][0] * out[i][0];
    double im1 = out[i][1] * out[i][1];
    double t1 = r1 + im1;
    //double t = 20*log(sqrt(t1));

    double a = t1/(double)(totalB/2);

    double t = 10.0 * log10(a);

    //startFreq = 2.42;
    //double frec = (startFreq+i*(totalB/2))/1000;

    maxIQ[i] = t; 
}
© www.soinside.com 2019 - 2024. All rights reserved.