使用FFTWLib(C#):如果vshost没有运行,使用fftw.dft_r2c_2d()会崩溃vshost.exe或主程序

时间:2012-02-08 03:49:10

标签: c# fft fftw

正如标题所述:我正在尝试在Visual C#2010 Professional(试用版)中使用Tamas Szalay的C# port of FFTW,当我尝试使用二维变换时,我遇到了上述错误。 (当我切换到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)中运行它,但dll和程序是x86。这个previously caused a problem in Visual C# 2010 Express,通过切换到专业试用版然后手动将配置目标从“x86”更改为“任何CPU”来解决。

更新:运行提供的测试代码可以正常工作。

1 个答案:

答案 0 :(得分:0)

事实证明,计划函数不能使用“虚拟”指针 - 它们指向的数组必须初始化。回想起来,这应该是显而易见的......