Хорошо, поэтому я некоторое время работаю над следующей проблемой и не могу найти ответ. Короче говоря, я реализую томографическую визуализацию для радиолокационного сигнала и не могу заставить FFTW давать мне результат, отличный от нулей. Я реализую через C++ и используя библиотеку FFTW3.Почему вход FFTW не равен нулю, вывод возвращает все нули (C++)
В настоящее время вход представляет собой смоделированный точечный рассеиватель в начале сцены, который имеет фазовый отклик всех реальных (см. Переменную rxphase
). Из-за используемой пропускной способности и т. Д. IFFT отфильтрованного принятого сигнала должен быть довольно большим (я еще не масштабировал его), но я получаю нули для каждого импульса.
выдержка из моего кода:
void ifftshift(std::vector<phdata> &argin, std::size_t count){
int k = 0;
int c = (int)floor((float)count/2);
if (count % 2 == 0)
{
for (k=0; k<c;k++)
{
complex<double> tmp = argin[k];
argin[k] = argin[k+c];
argin[k+c] = tmp;
}
}
else
{
complex<double> tmp = argin[count-1];
for (k=c-1; k>=0; k--)
{
argin[c+k+1] = argin[k];
argin[k] = argin[c+k];
}
argin[c] = tmp;
}
};
void main(){
std::vector<complex<double> > filteredData;
// Number of pulses across the aperture
std::int pulses = 11;
// Define the frequency vector
std::vector<double> freq;
std::double freqmin = 9 * pow(10,9);
std::double freqmax = 11 * pow(10,9);
std::vector<complex<double> > outData;
std::vector<complex<double> > rxphase;
for (int i = 0; i<64; i++)
{
freq.push_back(freqmin + (((freqmax-freqmin)/64)*i));
}
// Create a (samples X pulses) array of complex doubles
rxphase.assign(64, std::vector<complex<double> > (11, {1,0}));
fftw_complex *in, *out;
fftw_plan plan;
in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * image.Nfft);
out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * image.Nfft);
plan = fftw_plan_dft_1d(image.Nfft, in, out, FFTW_BACKWARD, FFTW_MEASURE);
// iterate through pulses to back project across the aperture
for (int i=0; i<=pulses; i++)
{
// Reset vectors for each pulse
filteredData.clear();
outData.clear();
for (int ii=0; ii<freq.size(); ii++)
{
// Apply simple ramp filter
filteredData.push_back(freq[ii]*rxphase[ii][i]);
}
// Shift the data to put the center frequency at DC position (zero index)
ifftshift(filteredData, filteredData.size());
for (int ii=0; ii<filteredData.size(); ii++)
{
std::cout << filteredData[ii] ;
}
std::cout << std::endl;
// filteredData is what I expect it to be.
// Recast the vector to the type needed for FFTW and compute FFT
in = reinterpret_cast<fftw_complex*>(&filteredData[0]);
for (int ii=0; ii<filteredData.size(); ii++)
{
std::cout << "(" << (in[ii])[0] << "," << (in[ii])[1] << ");";
}
std::cout << std::endl;
// values for in are the same as for filteredData, as expected.
fftw_execute(plan);
for (int ii=0; ii<filteredData.size(); ii++)
{
std::cout << "(" << (out[ii])[0] << "," << (out[ii])[1] << ");";
}
std::cout << std::endl;
// The values for out are all (0,0)
}
fftw_destroy_plan(plan);
//fftw_free(in); error here
//fftw_free(out); error here
};
любая помощь будет принята с благодарностью.
EDIT: код должен быть немного более полным.
Я не могу сказать, что здесь не так, но я рекомендую использовать [FFTW ++] (http://fftwpp.sourceforge.net/), когда вы работаете с FFTW из кода C++. – Rostislav