Использование FFTWLib (C #): Использование fftw.dft_r2c_2d () приводит к сбою vshost.exe или основной программы, если vshost не запущен - PullRequest
4 голосов
/ 08 февраля 2012

Как гласит заголовок: я пытаюсь использовать C # порт FFTW от Tamas Szalay в Visual C # 2010 Professional (пробная версия), и я получаю вышеуказанную ошибку при попытке использовать двапреобразование.(Проблема сохраняется, когда я переключаюсь на dft_c2r_2d ()).Другие функции (в частности, fftw.malloc ()) работают нормально.

Подробности:

unsafe void FFTFind(IntPtr Scan0, int stride, int width, int height, Rectangle roi)
{
    IntPtr ComplexImage = fftw.malloc(width * height * 16);
    double[] pComplexImage = new double[width * height * 2];
    byte* pScan0 = (byte*)Scan0.ToPointer();

    Console.WriteLine("3");

    for (int y = 0; y < height; y++)
    {
        for (int x = 0; x < width; x++)
        {
            pComplexImage[x * y * 2] = pScan0[y * stride + x * 4];
            //pComplexImage[x * y * 2] = pScan0[y * stride + x];
        }
    }

    Console.WriteLine("3.05");

    Marshal.Copy(pComplexImage, 0, ComplexImage, width * height * 2);

    Console.WriteLine("Starting FFTFind");

    FFTFindKernel(ComplexImage, stride, width, height, roi);
}

unsafe void FFTFindKernel(IntPtr imageIn, int stride, int width, int height, Rectangle roi)
{
    Console.WriteLine("3.1");
    IntPtr hScan0 = (IntPtr) GCHandle.Alloc(imageIn, GCHandleType.Pinned);
    Console.WriteLine("3.3");
    IntPtr FourierPlan;

    Console.WriteLine("3.5");
    int start = System.Environment.TickCount;
    Console.WriteLine("3.7");
    FourierPlan = fftw.dft_r2c_2d(width, height, hScan0, hScan0, 0);
    Console.WriteLine("4");
    fftw.execute(FourierPlan);
    Console.WriteLine("Time: {0} ms", (System.Environment.TickCount - start));
}

Консоль печатает до «3,7».Попытка запустить FourierPlan = ... вызывает сбой программы и всплывающее окно с сообщением:

vshost.exe has stopped working.

Отключение хост-процесса Visual Studio заменяет только «vshost.exe» на «FFTFind».

Возможно, актуально: я запускаю это в среде x64 (Windows Server Standard), но библиотеки и программы x86.Это ранее вызывало проблему в Visual C # 2010 Express , которая была решена путем переключения на Профессиональную пробную версию и последующего изменения цели конфигурации вручную с «x86» на «Любой ЦП».

ОБНОВЛЕНИЕ: Запуск предоставленного тестового кода работает нормально.

1 Ответ

0 голосов
/ 09 февраля 2012

Как оказалось, функции плана не могут принимать "фиктивные" указатели - массивы, на которые они указывают, должны быть инициализированы.Оглядываясь назад, это должно было быть очевидно ...

...