繁体   English   中英

直接在scipy.weave.inline中对复杂的numpy数组进行FFTW3

[英]FFTW3 on complex numpy array directly in scipy.weave.inline

我正在尝试在Python实现基于FFT的子像素移位(平移)算法。 傅里叶移位定理允许通过以下方式将阵列转换一个亚像素量:1.正向FFT阵列2.傅立叶空间中的线性相位斜率乘以阵列3.逆FFT阵列

这个算法很容易在python中使用numpy / scipy来实现,但是对于256 ** 2数组,它的每移位非常慢(〜10毫秒)。 我试图通过使用scipy.weave.inline直接从python调用c代码来加快速度。

但是在将复杂的numpy数组传递给FFTW时遇到了麻烦。 C代码如下所示:

    #include <fftw3.h>
    #include <stdlib.h>

    #define INVERSE +1
    #define FORWARD -1


    fftw_complex *i, *o;
    int n, m;
    fftw_plan pf, pi;
    #line 22 "test_scipy_weave.py" 

    i = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * xdim*ydim);
    o = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * xdim*ydim);

    pf = fftw_plan_dft_2d(xdim, ydim, i, o, -1, FFTW_PATIENT);
    pi = fftw_plan_dft_2d(xdim, ydim, o, i,  1, FFTW_PATIENT);

    # Copy data to fftw_complex array. How to use python arrays directly
    for (n=0; n<xdim;n++){
        for (m=0; m<ydim; m++){
            i[n*xdim+m][0]=a[n*xdim+m].real();
            i[n*xdim+m][1]=a[n*xdim+m].imag();
        }
    }

    fftw_execute(pf);

    /* Mult by linear phase ramp here */

    fftw_execute(pi);

    for (n=0; n<xdim;n++){
        for (m=0; m<ydim; m++){
            b[n*xdim+m] = std::complex<double>([in*xdim+m][0], i[n*xdim+m][1]);
        }
    }

    fftw_destroy_plan(p);

因此,您可以看到我必须将存储在numpy数组“ a”中的数据复制到fftw_complex数组“ i”中。 最后,我必须再次将结果“ i”复制到输出numpy数组“ b”中。 直接在fftw中使用numpy数组“ a”和“ b”会更有效,但我无法使它起作用。

有谁知道如何让scipy.weave.inline直接在scipy.weave.inline使用复杂的numpy数组?

谢谢

根据fftw.h 手册 ,您可以在fftw.h之前导入complex.h ,这将确保fftw_complex将对应于本机C数据类型。 我很确定numpy数据类型也可以保证与本机C数据类型兼容(或在实践中很可能兼容)。

在这种情况下,您可以使用a.data_as(ctypes.c_void_p)访问指向数组数据的指针。 不幸的是,ctypes无法识别复杂类型,但是希望强制转换为void指针可以解决问题。

这样做时,您必须注意,数组a以C连续方式存储,在创建数组时由参数order='C'指定。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM