fftwpp создает заполненный нулями массив после свертки - PullRequest
1 голос
/ 23 марта 2011

Я использую fftwpp, чтобы преобразовать мои данные и мое ядро ​​свертки в пространство Фурье, умножить их вместе, как в скалярном произведении, и преобразовать их обратно в реальное пространство.Когда я впервые запускаю программу, она создает массив, который полностью заполнен нулями.Когда я запускаю его снова, он дает мне желаемые результаты.

Во время его запуска создается wisdom3.txt.Если я его удаляю, программа снова тратит много времени на создание массива, заполненного нулями.

Что не так с моим кодом?

// sx, sy and sz are the dimensions of my data

int szp = sz / 2 + 1;
size_t align = sizeof(Complex);

// creates arrays to store the data in, the double one is for the real data
// the Complex one for the fourier data
array3<double> f(sx, sy, sz, align);
array3<Complex> g(sx, sy, szp, align);

// copying data into double array
for(int k = 0; k < sz; k++)
    for(int j = 0; j < sy; j++)
        for(int i = 0; i < sx; i++)
            f(i, j, k) = data[i + sx * j + sx * sy * k];

// transforming data into fourier space
rcfft3d Forward3(sz, f, g);
Forward3.fft(f, g);


// generate the kernel
array3<double> kernel(sx, sy, sz);
array3<Complex> kernel2(sx, sy, szp, align);
// more code to create the kernel left out ...


// transform the kernel into the fourier space
rcfft3d ForwardKernel3(sz, kernel, kernel2);
ForwardKernel3.fft(kernel, kernel2);


// multiplying data and kernel in fourier space together
for(int k = 0; k < szp; k++)
    for(int j = 0; j < sy; j++)
        for(int i = 0; i < sx; i++)
            g(i, j, k) = g(i, j, k) * kernel2(i, j, k);


// transform back to normal space
crfft3d Backward3(sz, g, f);
Backward3.fftNormalized(g, f);


// putting everything in the results array and normalize
for(int k = 0; k < sz; k++)
    for(int j = 0; j < sy; j++)
        for(int i = 0; i < sx; i++)
            result[i + sx * j + sx * sy * k] =
                (f(i, j, k) >= thresholdValue ? f(i, j, k) : 0);

1 Ответ

3 голосов
/ 23 марта 2011

FFTW ++ - это оболочка над FFTW.FFTW требует генерации плана выполнения для эффективной обработки ваших данных.После того, как план сгенерирован, его можно повторно использовать для обработки различных наборов данных.Файл, который вы видите wisdom3.txt, представляет собой информацию о плане, который ваша программа генерирует при первом запуске.Как только он существует, он загружается при последующих запусках и позволяет вашей программе работать быстро.Если вы удалите его, FFTW придется его регенерировать, что заставит вашу программу снова работать медленно.

Относительно того, почему ваш вывод равен нулю при первом запуске, из-за этого шага генерации плана.Это объясняется в FFTW FAQ .

В заключение, поскольку я не использовал FFTW ++, я не знаю точный метод, который вы должны вызывать, чтобы убедиться, что план сгенерированперед выполнением FT.Но вы должны вызывать его сразу после определения ваших массивов ввода / вывода и перед инициализацией их вашими данными.И если вам нужно запустить код несколько раз, вы должны сохранить файл мудрости.

...