我尝试制作一个从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或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
也是如此。这是一件很酷的事情。 :)
谢谢大家的回应。他们是正确的,变量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;
}