基于FFTW3.3.9的FFT标准测试

1 环境准备

1.1 确保g++可用

本次编译是基于 GNU C++ 环境的,因此务必确定g++编译器可用,使用如下命令验证:

g++ --version

出现类似如下输出则表明编译器可用:

image-20210317212234515

1.2 下载 FFTW 3.3.9 源码包

到FFTW官网(http://www.fftw.org/download.html)下载活着直接使用命令下载:

wget http://www.fftw.org/fftw-3.3.9.tar.gz

1.3 解压缩 fftw-3.3.9 源码包

直接使用 Centos 下的解压缩命令即可:

tar -xvf fftw-3.3.9.tar.gz

解压缩后进入hpl-2.3目录

cd fftw-3.3.9
  • 注意:此目录为本文所有操作的主目录,若下文提到主目录,皆表示此处。

2 编译安装

./configure --enable-threads
make
sudo make install

3 准备代码以及编译

FFT测试的代码如下所示:

/*
 * @Author: Bo Cai
 * @Mail: caibo0520@qq.com
 * @Date: 2021-04-01 20:35:07
 * @LastEditors: Bo Cai
 * @LastEditTime: 2021-04-01 20:44:27
 */
#include <fftw3.h>
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstdio>
#include <ctime>
#include <vector>
using namespace std;

float my_fftw(int nthreads, int num) //数据量、并行进程数
{
    /*******************初始化********************/
    srand(520);  //设置随机数种子,确保每次数据一致
    double cost; //计算用时

    fftw_init_threads(); // 初始化FFTW线程
    fftw_complex *in, *out;

    in = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * num); // 为FFTW输入输出数组分配空间
    out = (fftw_complex *)fftw_malloc(sizeof(fftw_complex) * num);
    if ((in == NULL) || (out == NULL))
    {
        printf("错误:内存不足,请尝试降低数据量!\n");
        return -1;
    }
    else
    {
        printf("============正在生成数据===========\n");
        for (int i = 0; i < num; i++) //使用固定的随机数种子生成数据
        {
            in[i][0] = (double)rand() / (double)(RAND_MAX);
            in[i][1] = 0;
        }
        printf("============数据生成成功===========\n");

        clock_t start, end; //数据准备好了,开始计时
        time(&start);

        cout << "==============计算开始=============\n";
        fftw_plan p;
        fftw_plan_with_nthreads(nthreads);
        p = fftw_plan_dft_1d(num, in, out, FFTW_FORWARD, FFTW_ESTIMATE);
        for (int i = 0; i < 2; i++) //循环计算100次
        {
            fftw_execute(p);
        }

        time(&end);
        cost = difftime(end, start);
        cout << "计算结束,总共用时: " << cost << " s" << endl;

        /*******************回收空间********************/
        fftw_destroy_plan(p);
        fftw_cleanup();
        if (in != NULL)
            fftw_free(in);
        if (out != NULL)
            fftw_free(out);
        fftw_cleanup_threads();
    }
    return cost;
}

int main()
{
    vector<float> time_history; //记录计算时间的列表
    int num = 1000000000;         //生成数据的个数
    int nthreads = 64;          //最大测试现场数
    cout << "进程:1" << endl;
    time_history.push_back(my_fftw(1, num));
    for (int i = 2; i <= nthreads; i += 2)//从一个线程开始测试,然后按照两个进程递增
    {
	cout << "进程:" << i << endl;
        time_history.push_back(my_fftw(i, num));
    }
    for (int i = 0; i < time_history.size(); i++)
    {
        cout << time_history[i] << endl;
    }
    return 0;
}

根据测试需求修改main函数中的numnthreads这两个变量。(标准测试要求num设置为1000000000nthreads设置为机器的逻辑核心数)。

然后执行如下命令编译它:

g++ [file_name] -o fftw_test.exe -lfftw3 -lfftw3_threads -lpthread
  • 注意:其中[file_name]为源程序保存后的文件名,请自己替换

4 运行测试

直接运行3中比编译好的程序(比如我编译时指定的文件名是fftw_test.exe):

./fftw_test.exe

image-20210401210000388

注意:其中[file_name]为源程序保存后的文件名,请自己替换

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好,您的问题是关于C++中使用fftw3库进行FFT计算的问题。我可以为您提供一些基本的信息和示例代码。 fftw3是一个高效的开源FFT库,它可以在多种平台上运行,并且提供了多种FFT计算方法和选项。在C++中使用fftw3库进行FFT计算的基本步骤如下: 1. 安装fftw3库。您可以从官方网站https://www.fftw.org/download.html下载适合您平台的版本,并按照官方文档进行安装。 2. 在C++代码中包含fftw3头文件,并链接fftw3库。 ```c++ #include <fftw3.h> #pragma comment(lib,"libfftw3-3.lib") ``` 3. 定义输入和输出数组,并创建fftw3计算计划。 ```c++ int n = 100; double* in = (double*)fftw_malloc(sizeof(double) * n); double* out = (double*)fftw_malloc(sizeof(double) * n); fftw_plan plan = fftw_plan_r2r_1d(n, in, out, FFTW_R2HC, FFTW_ESTIMATE); ``` 在上面的代码中,我们定义了一个长度为n的输入数组in和输出数组out,并创建了一个fftw3计算计划plan。fftw_plan_r2r_1d表示我们要计算一个实数序列的FFTFFTW_R2HC表示我们要使用实数序列的傅里叶变换,FFTW_ESTIMATE表示我们使用快速计算方法。 4. 填充输入数组,并执行计算计划。 ```c++ for (int i = 0; i < n; i++) { in[i] = sin(2 * M_PI * i / n); } fftw_execute(plan); ``` 在上面的代码中,我们填充了输入数组,然后使用fftw_execute函数执行计算计划。 5. 获取计算结果。 ```c++ for (int i = 0; i < n / 2 + 1; i++) { printf("%f ", out[i]); } ``` 在上面的代码中,我们打印了输出数组的前一半元素,这些元素表示了FFT计算的结果。 以上是一个基本的fftw3库的使用示例,您可以根据您的需求修改输入数组和计算计划的选项,以及处理输出数组的方式。希望能对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万古霉素(Vancomycin)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值