FFTW в Qt Creator - PullRequest
       24

FFTW в Qt Creator

0 голосов
/ 17 февраля 2020

Я пытаюсь создать программу, которая вычисляет FFTW из данных IQ. Windows 10 64 бит. Qt Creator 4.8.2 На основе Qt 5.12.2 (MSV C 2015, 32 бит) тот же результат.

.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);
}

Я надеюсь, что кто-то может мне помочь. Спасибо.

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

спасибо всем за отклик. Они были правы, переменная N не правильно инициализировала его. Я уже исправил эти ошибки, и это сработало для меня. Теперь у меня есть еще один вопрос, касающийся представления полученного спектра. Я на центральной частоте 900 МГц, и я настроен на частоту дискретизации (IQ пар / с) 40 мс / с с максимальной шириной полосы 27 МГц. Но при представлении он показывает только 900 - 913,5 МГц, только около 13,5 МГц. Исходный спектр не показан. Здесь я оставляю код. Есть идеи?

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;

bbConfigureIQ(id, 1, 27.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);
    //double frec = (startFreq+i*(totalB/2))/1000;

    maxIQ[i] = t; 
}
0 голосов
/ 17 февраля 2020

Это не имеет ничего общего ни с Windows, ни с QtCreator. Вы должны написать программу правильно.

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

Это не строка, которая вылетает. Эта строка просто отлично. Следующее будет совершенно ожидаемо sh, потому что вы никогда не назначали myPlan.

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

, чтобы исправить вашу проблему. Это при условии, что вы установили N на что-то разумное. Я уверен, что вы также должны установить in по крайней мере. Конечно, если вы хотите преобразовать Фурье, то, что окажется в in в вашей оперативной памяти. Что круто. :)

...