FFTW使用小结

2023-11-02

简介
================
FFTW—Fastest Fourier Transform in the West,是由 MIT 的 Matteo Frigo 博士和 Steven G. Johnson 博士开发的一个完全免费的软件包。FFTW 最初的 release 版本于 1997 年发布,最新的 release 版本 fftw-3.3.4。git路径:
https://github.com/FFTW/fftw3.git
它是一个 C 语言开发的库,支持任意大小的、任意维数的数据的离散傅里叶变换(DFT),并且还支持离散余弦变换(DCT)、离散正弦变换(DST)和离散哈特莱变换(DHT)

数据类型
================
FFTW 有三个版本的数据类型:double、float 和 long double,使用方法如下:
1.链接对应的库(比如 libfftw3-3、libfftw3f-3、或 ibfftw3l-3)
2.包含同样的头文件 fftw3.h
将所有以小写"fftw_"开头的名字替换为"fftwf_"(float 版本)或"fftwl_"(long double 版本)。比如将 fftw_complex 替换为 fftwf_complex,将 fftw_execute
替换为 fftwf_execute 等。
3.所有以大写"FFTW_"开头的名字不变
4.将函数参数中的 double 替换为 float 或 long double
5.最后,虽然 long double 是 C99 的标准,但你的编译器可能根本不支持该类型,或它并不能提供比 double 更高的精度。
6.fftw_malloc 考虑了数据对齐,以便使用 SIMD 指令加速,所以最好不要用 C 函数malloc 替代,而且不要将 fftw_malloc、fftw_free 和 malloc、free、 delete 等混用。
尽量使用 fftw_malloc 分配空间,而不是使用的静态数组,因为静态数组是在栈上分配的,而栈空间较小;还因为这种方式没有考虑数据对齐,不便应用SIMD 指令。


编译构造
=================
1.默认FFTW编译生成double类型,加入参数“--enable-single”或“--enable-float”编译单精度(float),加入参数“--enable-long-double”支持长双进度类型
2.另外,在ARM平台上可增加“--enable-neon”,使能ARM NEON流媒体加速核心

多线程
=================
FFTW 可以多线程执行,但是多线程存在线程同步问题,这可能会降低性能。所以除非问题规模非常大,一般并不能从多线程中获益。

plan复用
=================
用同一个 fftw_plan 执行多个数据的变换
同一个 fftw_plan 通过对输入数据赋不同值来实现不同的变换,实际上还可以利用同一个 fftw_plan 实现对不同输入输出数据的变换,也就是说可以有多个
输入输出数据数组,各自进行变换,互不影响。当然这要满足一定的条件:
1.输入/输出数据大小相等。
2.变换类型、是否原位运算不变。
3.对 split 数组(指实虚部分开),实部和虚部的分割方式与方案创建时相同。
4.数组的对齐方式相同。如果都是用 fftw_malloc 分配的则此项条件满足,除非使用
FFTW_UNALIGNED 标志

总结:是用现有PLAN必须满足所有参数条件和申请PLAN时一致。

一维数据
=================
目前使用最广泛,项目也只使用1D,并且输入数据为实数,因此变化有两种方法
1.将输入部分扩展成虚数,即所有虚数为0,然后使用一维复数变化接口

fftw_plan fftw_plan_dft_1d(int n, fftw_complex *in, fftw_complex *out,
int sign, unsigned flags);
参数说明:
n -- 复数数据点数
in/out -- 输入数据和输出数据,可以相同(原位相同)
sign -- FFTW_FORWARD(-1)正变换 FFTW_BACKWORD(+1) 逆变换
flags -- 主要有两个参数 FFTW_MEASURE/FFTW_ESTIMATE
    FFTW_MEASURE 先进行预处理,对大数据(数据长度不变)连续FFT变化效果明显
    FFTW_ESTIMATE 直接构造一个次最优的方案,非连续 实时选择这种方案

2.使用1D实数DFT变化,由于实数DFT变化具有Hmitian对称性,所以只需计算n/2 + 1个输出数据即可
需要注意:
a.如果采用原位运算则out空间必须>= 2*(n/2 + 1)
b.1D实数DFT逆变换任何情况都会破坏IN数据
c.当n为偶数,由Nyquust采样定理,第n/2个变化结果也是实数,所以可以把第0个和n/2个数据合并(n/2实部做0虚部),但实际上FFTW没有这样实现,因为在多维数据时不兼容


几种方案测试

=============

使用C2C MEASURE
===============================
FFT-DFT :309us
FFT-DFT :345us
FFT-DFT :320us
FFT-DFT :349us
FFT-DFT :319us
FFT-DFT :320us
FFT-DFT :321us
FFT-DFT :324us
FFT-DFT :320us
FFT-DFT :319us
FFT-DFT :757919us
幅值:9.465116    相位:-169.040115

real    0m2.064s
user    0m2.044s
sys    0m0.020s
===============================

===============================
使用R2C
FFT-DFT :208us
FFT-DFT :195us
FFT-DFT :198us
FFT-DFT :214us
FFT-DFT :212us
FFT-DFT :212us
FFT-DFT :221us
FFT-DFT :215us
FFT-DFT :214us
FFT-DFT :216us
FFT-DFT :564592us
幅值:9.465116    相位:-169.040115

real    0m0.584s
user    0m0.552s
sys    0m0.032
================================
================================
使用C2C 次最优方案
FFT-DFT :213us
FFT-DFT :204us
FFT-DFT :195us
FFT-DFT :195us
FFT-DFT :195us
FFT-DFT :196us
FFT-DFT :197us
FFT-DFT :196us
FFT-DFT :198us
FFT-DFT :197us
FFT-DFT :554788us
幅值:9.465116    相位:-169.040115

real    0m0.571s
user    0m0.544s
sys    0m0.028s
================================

采样点数为24000,进行1维复数/实数变化,参数选择有FFTW_MEASURE/FFTW_ESTIMATE

1.经测试,发现使用MEASURE方案时,在第一构造plan时花费约1.5秒,而一次DFT变化在300us-,构造的时间能做普通(FFTW_ESTIMATE)5000次左右,故在一般场合FFTW_ESTIMATE完全满足需求。

2.实数FFTW_ESTIMATE,时间上并没有优于复数DFT变化,只是内存开辟只有复数DFT的一半。实数DFT在构造plan时间上比复数慢,但变换比复数快,所以整体持平

3.最终选择复数和实数 ESTIMATE方案


FFTW_WISDOM
============
关于WISDOM,翻译自FFTW官网
FFTW -wisdom是一种实用工具来生成wisdom文件,其中包含有关如何以最佳方式计算(傅立叶)变换不同大小的保存的信息。
wisdom 的大体思路就是把生成好的策略相关的配置信息存储在磁盘里,然后在下次重新运行程序的时候,把策略相关的配置信息重新载入到内存中,这样在重新生成 plan 的时候就可以节约大量的时间。

FFTW 提供了多种方式来生成wisdom文件,使用时不必关心其中具体格式是怎么样,可以导入/出到文件/字符串等

322 FFTW_EXTERN int X(export_wisdom_to_filename)(const char *filename);        \
323 FFTW_EXTERN void X(export_wisdom_to_file)(FILE *output_file);              \
324 FFTW_EXTERN char *X(export_wisdom_to_string)(void);                        \
325 FFTW_EXTERN void X(export_wisdom)(X(write_char_func) write_char,           \
326                                   void *data);                             \
327 FFTW_EXTERN int X(import_system_wisdom)(void);                             \
328 FFTW_EXTERN int X(import_wisdom_from_filename)(const char *filename);      \
329 FFTW_EXTERN int X(import_wisdom_from_file)(FILE *input_file);              \
330 FFTW_EXTERN int X(import_wisdom_from_string)(const char *input_string);    \
331 FFTW_EXTERN int X(import_wisdom)(X(read_char_func) read_char, void *data);

wisdom 存储起来的不是 plan 本身,而是和 plan 相关的配置信息,例如内存、寄存器等。故在导入wisdom后还是需要执行plan初始化。
example:
    fftw_export_wisdom_to_filename("wisdom.conf");
    p_str = fftw_export_wisdom_to_string();
    
    fftw_export_wisdom_from_filename("wisdom.conf");
    fftw_export_wisdom_from_string(p_str);

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FFTW使用小结 的相关文章

  • MODIS数据的简介和下载(二)——MODIS数据下载方式(FTP)

    前一篇我们已经介绍了MODIS数据的简介 参数以及相关的典型应用 这一篇我们来介绍下MODIS数据的下载方式 当然这边主要是介绍国外网站的下载方式 国内网站的普遍是在地理空间数据云和遥感集市下载 国外网站 NASA官网 下载方式主要介绍两种
  • 区块链中的哈希函数

    小白如何秒懂区块链中的哈希计算 当我在区块链的学习过程中 发现有一个词像幽灵一样反复出现 哈希 英文写作 HASH 那位说 拉稀 同学你给我出去 这个 哈希 据说是来源于密码学的一个函数 尝试搜一搜 论文出来一堆一堆的 不是横式就是竖式 不
  • 牛客网-网易2018校园招聘编程题真题集合-解题思路及源码

    因为牛客网上的题目内容有版权声明 暂时就不复制题目了 需要的同学请自行登录牛客网获取 1 魔法币 思路 分析题目中发现 魔法机器1只能产生奇数的魔法币 而魔法机器2只能产生偶数的魔法币 本题目采用从结果倒推的思路 比如例子中需要10个魔法币
  • string转换成int的几种方式

    写在前面 遇到了多次oj的题目需要将string转换为int或者将int转换为string 每次遇到都是现查 一直没有好好的总结导致总是忘记 现在做个总结 首先是今天遇到的方式 采用string头文件里定义的string类型转换的函数 st
  • springboot项目配置多数据库连接

    前言 之前编写了一篇maven项目创建多数据库的方法 现在对springboot更了解之后 将把springboot项目配置多数据库的方法贴出来 从项目开始创建到调用数据库依次写出来 PS 本项目使用的是IDEA进行创建 创建springb
  • engine.js[dwr]javascript

    Copyright 2005 Joe Walker Licensed under the Apache License Version 2 0 the License you may not use this file except in
  • SQL注入绕过的姿势

    1 注释符绕过 常用的注释符有 1 注释内容 2 注释内容 3 注释内容 eg union select 1 2 union select 1 2 构造闭合 union select 1 2 2 大小写绕过 常用于 waf的正则对大小写不敏
  • 搭建和部署nuxt项目

    说在前面的话 vue js开发的SPA是不利于seo的 搜索引擎对它支持的并不是太好 百度根本就不可以在SPA应用的页面抓取数据 这对很看重seo优化的网站来说肯定是不能容忍的 而使用nuxt开发的网站就可以让爬虫爬取 而且它是基于vue
  • 神经网络轮廓特征是什么,神经网络轮廓特征图

    神经网络 的四个基本属性是什么 神经网络 的四个基本属性 1 非线性 非线性是自然界的普遍特征 脑智能是一种非线性现象 人工神经元处于两种不同的激活或抑制状态 它们在数学上是非线性的 由阈值神经元组成的网络具有更好的性能 可以提高网络的容错
  • 游学电子教您:如何给原子的imx6开发板烧录Linux系统

    义县游学电子科技有限公司官方帐号 科技爱好者 今天游学电子带您一起学习下imx6开发板如何烧录系统 使用的开发板是原子的 这里有个注意的地方是我们烧录的系统是到emmc中 而非sd卡中 01 步骤方法 把开发板的启动拨码开关拨到 USB 模
  • FPN、PAN在计算机视觉(CV)领域的意思

    FPN Feature Pyramid Network的首字母缩写 即特征金字塔网络的意思 PAN Pixel Aggregation Network的首字母缩写 即像素聚合网络的意思 名词出处 Path Aggregation Netwo
  • 2022-03-14

    一 你在工作中用到了什么设计模式 怎么用的 1 单例模式 编写kafka共用sdk写入的时候 使用了单例模式 不管new多少次kafkaProducer实例 最终都是一个 采用了静态内部类初始化方式 使用阿里云oss sdk的时候 创建的c
  • 【Git系列】Git下载与安装教程

    Git下载与安装教程 1 下载 2 安装 其他系列 Git最详细的体系化教程 1 下载 官网下载地址 https git scm com downloads 淘宝镜像下载地址 http npm taobao org mirrors git
  • YOLOv2论文理解

    YOLO9000 Better Faster Stronger 论文YOLO9000 Better Faster Stronger的主要内容有三点 1 作者提出了YOLOv2 YOLOv2在YOLOv1的基础上 使用新的网络结构 darkn
  • 西瓜书学习笔记第5章【神经网络】

    西瓜书学习笔记第5章 神经网络 5 1神经元模型 5 2 感知机与多层网络 一 感知机 二 多层功能神经元 多层网络 5 3误差逆传播算法 反向传播 BP 算法 对各个参数更新公式的推导 早停 early stopping 正则化 regu
  • SQL Server修改数据

    本篇主要讲解的是SQL Server 中修改数据的几种语句 INSERT语句 INSERT INTO SELECT语句 UPDATE语句 DELETE语句 一 INSERT语句 INSERT语句向表中添加新行 以下是INSERT语句的最基本
  • 比较IP代理与路由器获取IP地址的三大差异

    在今天的文章中 我们将与大家一起探讨IP代理与路由器获取IP地址的差异 这两种方式在获取IP地址上有一些区别 而这些区别会对我们的网络使用体验产生影响 今天我们深入分析并提供一些实际的例子与操作经验 稳定性差异 通过路由器获取IP地址时 我
  • 字段明明存在,用Web API使用该字段进行查询报错?

    我是微软Dynamics 365 Power Platform方面的工程师罗勇 也是2015年7月到2018年6月连续三年Dynamics CRM Business Solutions方面的微软最有价值专家 Microsoft MVP 欢迎

随机推荐

  • (一)MyBatis

    一 MyBatis特性 1 MyBatis 是支持定制化 SQL 存储过程以及高级映射的优秀的持久层框架 2 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集 3 MyBatis可以使用简单的XML或注解用于配置
  • Unity——射线检测

    1 new Raw cube0 transform Vector3 forward 射线 第一个参数 射线的起始点 第二参数 射线的方向 myray new Ray this gameObject transform position Ve
  • Flutter系列之Navigator组件使用

    PS 想做一件事很容易 真正去做一件事很困难 同系列文章如下 Flutter系列之Navigator使用详解 Flutter系列之Flex布局详解 Flutter系列之图片加载详解 Flutter系列之Widget生命周期 Flutter系
  • 基于AT指令开发短信程序

    基于AT指令开发短信程序 本人的专职工作是做手机底层软件中SMS和CBS的功能模块软件 对SMS的PDU格式可以说是比较了解 在网上查找了一下感觉目前国内公开的软件大多功能比较单一 主要特点如下 1 支持分页短信 最大可以支持15个分页 可
  • Python利用selenium+Beautifulsoup破解动态class/id并提取相应文本的方法

    最近小白掌柜接了领导一项任务 要全程自动化的注册一个网站并登录网站后逗留一段时间再离开 起初觉得这个应该难度不会太大 就欣然接受了 谁知 拿到具体需求后一分析纳尼 这个里面其实有好多难点 but本着我就是进阶的小白还是决定挑战下去 今天先不
  • 【Python】如何在Python中绘制带有连接线的双饼图?

    文章目录 一 导入所需的库 二 准备数据 三 绘制双饼图 3 1 创建画布和子图对象 3 2 绘制大饼图 3 3 绘制小饼图 3 4 连接线1 连接大饼图的上边缘和小饼图的饼块 3 5 连接线2 连接大饼图的下边缘和小饼图的饼块 3 6 添
  • 强化学习笔记

    强化学习笔记 简介 本文是根据 Sutton的经典书籍 Reinforcement Learning An Introduction 前三章内容整理的笔记 枯燥预警 本文侧重对强化学习概念的理论分析 在基本概念上的剖析较为详细 也就是说会比
  • 深入剖析mmap原理 - 从三个关键问题说起

    作者 招财二师兄 链接 https www jianshu com p eece39beee20 来源 简书 著作权归作者所有 商业转载请联系作者获得授权 非商业转载请注明出处 对于mmap 您是否能从原理上解析以下三个问题 1 mmap比
  • 部署docker wsl下载ubuntu时报错无法从“https://raw.githubusercontent.com/microsoft/WSL/master/distributions/Dist

    挂科了个VPN好了 真是莫名其妙
  • 行列式求值、矩阵求逆

    include
  • CSS:渐变属性

    渐变属性 transition 值 参数1 定义需要渐变的属性 必填 常用值all 参数2 定义渐变需要的时间 必填 单位s 参数3 定义速度曲线 选填 默认ease慢快慢 常用linear匀速 参数4 定义效果延迟时间 选填 默认0 单位
  • SQL 注入漏洞(五)union 联合注入

    一 union 联合注入原理 联合查询注入是联合两个表进行注入攻击 使用关键词 union select 对两个表进行联合查询 两个表的字段数要相同 不然会出现报错 1 联合查询的错误方式 guestbook 表有三个字段 users 有八
  • 如何用logrotate管理每日增长的日志

    这篇文章主要介绍了如何用logrotate管理每日增长的日志问题 具有很好的参考价值 希望对大家有所帮助 如有错误或未考虑完全的地方 望不吝赐教 logrotate简介 logrotate is designed to ease admin
  • 2020秋招找工作总结

    找完工作闲了很久 现在还是想写点什么 留给未来的自己看看吧 本人双非 渣硕 面试岗位 C C 软件开放岗 嵌入式软件开放岗 从时间先后顺序面试了以下几家公司 网易游戏 雷火 广州腾讯 成都浦发银行 成都华为 成都汇顶科技 成都烽火 成都紫光
  • 昇腾应用案例体验:(5) 全目标结构化

    昇腾AI应用 探索人工智能的无限可能 使能千行百业 全目标结构化 概述 全目标结构化旨在处理海量视频 图像等机器无法理解的非结构化数据 从中挖掘潜在有价值信息并将其结构化存储 本例基于 mxVision 提供的插件以及自开发的目标挑选 人脸
  • Coins【暑期培训Z题】【多重背包】

    一道用来防AK的题 但是被我们给弄出来了 还是挺可以的 People in Silverland use coins They have coins of value A1 A2 A3 An Silverland dollar One da
  • Spring Boot + Vue的网上商城之商品信息展示

    Spring Boot Vue的网上商城之商品信息展示 当实现一个Spring Boot Vue的网上商城的商品信息展示时 可以按照以下步骤进行 后端实现 创建一个Spring Boot项目 并添加所需的依赖 包括Spring Web和Sp
  • gitlab中组的分类及权限介绍

    gitlab基本功能 gitlab是支持人员权限管理的 且在其内部支持分组规划 一般情况下的分组都会对应到研发部的各个部门 比如前端组 后端组 大数据组 数据分析组 测试组 运维组 当然以上的分组配置为一般中小互联网企业的人员架构 若是在大
  • WuThreat身份安全云-TVD每日漏洞情报-2023-05-10

    漏洞名称 Ppick CMS 远程代码执行 RCE 漏洞 漏洞级别 高危 漏洞编号 CVE 2023 25828 CNNVD 202303 2203 相关涉及 Pluck CMS 漏洞状态 POC 参考链接 https tvd wuthre
  • FFTW使用小结

    简介 FFTW Fastest Fourier Transform in the West 是由 MIT 的 Matteo Frigo 博士和 Steven G Johnson 博士开发的一个完全免费的软件包 FFTW 最初的 releas