快速入门#

以下代码是 1d_c2c_single_example.cpp 的简化版本,可从 NVPLSamples 获取,展示了如何使用 NVPL FFT。

#include <iostream>
#include <vector>
#include <complex>
#include <nvpl_fftw.h>

int main(int argc, char *argv[]) {
    const int n = 4;
    const int howmany = 2;

    std::vector<std::complex<float>> in(howmany * n);
    std::vector<std::complex<float>> out(howmany * n);

    fftwf_complex *in_data  = reinterpret_cast<fftwf_complex*>(in.data() );
    fftwf_complex *out_data = reinterpret_cast<fftwf_complex*>(out.data());

    fftwf_plan plan = fftwf_plan_dft_1d(n, in_data, out_data, FFTW_FORWARD, FFTW_ESTIMATE);

    int i = 0;
    for (auto& v: in) {
        v = {(float)i, -(float)i};
        i++;
    }

    for(int b = 0; b < howmany; b++) {
        fftwf_execute_dft(plan, in_data+b*n, out_data+b*n);
    }

    for (const auto& v: out) {
        std::cout << v << "\n";
    }

    fftwf_destroy_plan(plan);
    fftwf_cleanup();
    return 0;
}

此示例计算大小为 n 的一维正向 FFT 的 howmany 批次。它执行以下操作:

  1. 分配输入和输出数据

  2. 创建具有指定大小 n 和变换方向 FFTW_FORWARD 的一维 FFTW 计划

  3. 初始化输入数据。

  4. 执行计划。一次一批。

  5. 输出结果。

  6. 销毁计划。

然后可以编译和运行该示例,如下所示

$ g++ app.cpp -I/path/to/nvpl_fft/include -L/path/to/nvpl_fft/lib -lnvpl_fftw -o app
$ ./app
(6,-6)
(0,4)
(-2,2)
(-4,0)
(22,-22)
(0,4)
(-2,2)
(-4,0)

注意

从 NVPL FFT 0.4.0 开始,NVPL FFT 提供 nvpl_fftw.h 的副本,重命名为 fftw3.h,位于新的标头路径下:/path/to/nvpl_fft/include/nvpl_fftw。此路径已添加到 CMake 构建文件中,因此使用 CMake 构建时无需进行任何更改。如果不用 CMake 构建,则可以通过更新包含路径或通过 CPATH (即 CPATH=<prefix>/include/nvpl_fftw:$CPATH)使新标头路径可见

提示

对于动态链接到 FFTW3 库的应用程序,可以通过使用 LD_PRELOAD=/path/to/nvpl_fft/lib/libnvpl_fftw.so 运行应用程序来测试 NVPL FFT。