FFTW3.3.10库与QT结合的使用

FFTW(Fastest Fourier Transform in the West)是世界上最快的FFT, 实测计算长度为10000的double数组, 单次运行时间在2ms左右。为了详细了解FFTW以及为编程方便,特将用户手册看了一下,并结合手册制作了以下FFTW中文参考。其中大部分是原文重点内容的翻译,并加入了一些注解。

  先看一下使用FFTW编程的方法:

      #include <fftw3.h>

     ...

     {

         fftw_complex *in, *out;

         fftw_plan p;

         ...

         in = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);

         out = (fftw_complex*) fftw_malloc(sizeof(fftw_complex) * N);

         // 输入数据in赋值

         p = fftw_plan_dft_1d(N, in, out, FFTW_FORWARD, FFTW_ESTIMATE);

         fftw_execute(p); // 执行变换

         ...

         fftw_destroy_plan(p);

         fftw_free(in);

         fftw_free(out);

     }

大致是先用fftw_malloc分配输入输出内存,然后输入数据赋值,然后创建变换方案(fftw_plan),然后执行变换(fftw_execute),最后释放资源,还是比较简单的。

一维复数据的DFT

  1. 数据类型

   fftw_complex默认由两个double组成,在内存中顺序排列,实部在 前,虚部在后,即typedef double fftw_complex[2]。FFTW文档指出如果有一个支持C99标准的C编译器(如gcc),可以在#include <fftw3.h>前加入#include <complex.h>,这样一来fftw_complex就被定义为本机复数类型,而且与上述typedef二进制兼容(指内存排列),经 测试不能用在Windows下。C++有一个复数模板类complex<T>,在头文件<complex>下定义。C++标准委 员会最近同意该类的存储方式与C99二进制兼容,即顺序存储,实部在前,虚部在后(见报告WG21/N1388),该解决方案在所有主流标准库实现中都能正确工作。所以实际上可以用complex <double> 来代替fftw_complex,比如有一个复数数组complex<double> *x,则可以将其类型转换后作为参数传递给fftw:reinterpret_cast<fftw_complex*>(x)。测试如下:开 两个数组fftw_complex x1[2]和complex<double> x2[2],然后赋相同值,在调试模式下可以看到它们的内存排列是相同的。complex<T>类数据赋值的方式不是很直接,必须采用无名对象方式x2[i] = complex <double>(1,2) 或成员函数方式x2[i].real(1);x2[i].imag(2);不能直接写x2[i].real=1;x2[i].imag=2。 fftw_complex赋值方式比较直接:x1[i][0]=1;x1[i][1]=2。最后,考虑到数据对齐(见后),最好使用 fftw_malloc分配内存,所以可以将其返回的指针转换为complex <double> *类型使用(比如赋值或读取等),变换时再将其转换为fftw_complex*。

  2. 函数接口

fftw_plan fftw_plan_dft_1d(int n, fftw_complex *in, fftw_complex *out, int sign, unsigned flags);

 n为数据个数,可以为任意正整数,但如果为一些小因子的乘积计算起来可以更有效,不过即使n为素数算法仍然能够达到O(nlogn)的复杂度。FFTW对N=2a 3b 5c 7d 11e 13f的变换处理得最好,其中e+f=0/1,其它幂指数可以为任意值。

   如果in和out指针相同为原位运算,否则为非原位运算。

   sign可以为正变换FFTW_FORWARD(-1),也可以为逆变换FFTW_BACKWORD(+1),实际上就是变换公式中指数项的符号。需注意FFTW的逆变换没有除以N,即数据正变换再反变换后是原始数据的N倍。

   flags参数一般情况下为FFTW_MEASURE 或 FFTW_ESTIMATE。FFTW_MEASURE表示FFTW会先计算一些FFT并测量所用的时间,以便为大小为n的变换寻找最优的计算方法。依据 机器配置和变换的大小(n),这个过程耗费约数秒(时钟clock精度)。FFTW_ESTIMATE则相反,它直接构造一个合理的但可能是次最优的方案。总体来说,如果你的程序需要进行大量相同大小的FFT,并且初始化时间不重要,可以使用FFTW_MEASURE,否则应使用 FFTW_ESTIMATE。FFTW_MEASURE模式下in和out数组中的值会被覆盖,所以该方式应该在用户初始化输入数据in之前完成。

   不知道上述说法是不是这个意思:先用FFTW_MEASURE模式自动选最优方案,速度较慢;然后使用该模式变换数据就会较快。示例代码为:

  int length = 50000;

  fftw_complex* din  = (fftw_complex *)fftw_malloc(sizeof(double)*length * 2);

  fftw_complex* dout = (fftw_complex *)fftw_malloc(sizeof(double)*length * 2);

  fftw_plan p   = fftw_plan_dft_1d(length, din, din, FFTW_FORWARD, FFTW_MEASURE);

  fftw_execute(p);

  // 输入数据din赋值

  // ...

  fftw_execute(p);

  // 读取变换结果

  // ...

  fftw_destroy_plan(p);

  fftw_free(din);

  fftw_free(dout);

实验发现第一个fftw_execute耗费了数秒,而第二个fftw_execute则瞬间完成,说明上述猜想可能是对的。

    创建完方案(fftw_plan)后,就可以用fftw_execute对指定的 数据in/out做任意次变换。如果想变换一个相同大小(N相等)但数据不同的另外一个数组in,可以创建一个新方案,FFTW会自动重用上次方案的信息。这一点其实是非常好的,比如你首先用FFTW_MEASURE模式创建了一个最优的变换方案,只要变换数据的大小不变,你可以用 fftw_plan_dft_1d创建新的方案以对新数据执行变换,同时新变换仍然是最优的。

一个fftw_plan只能对固定的in/out进行变换, 但可以在变换后改变in的内容(大小不变)以用同一个方案执行新的变换

 软件整体界面如下:

1、可设置正弦信号的频率、采样频率、采样点数、直流信号、是否加噪声。

2、点击“计算FFT”按钮可生成频谱。

3、还可以进行自动计算。信号频谱按10Hz依次增加,再依次计算这个频率对应的频谱。运行效果如下:

将原始信号修改为 sin(f0) + sin(f1) + sin(f2) + sin(f3)  模拟4个不同频率的信号合成信号。

再看它的FFT变换结果。

源码出售,完整代码,包教会表情包 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/78811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器异地备份,服务器异地备份有哪些方法?

服务器异地备份是应对区域性灾难&#xff08;如地震、火灾、洪水&#xff09;或人为事故&#xff08;如误删除、勒索病毒攻击&#xff09;的关键策略&#xff0c;其核心在于将数据副本存储在物理隔离的地理位置&#xff0c;确保主数据中心故障时仍可恢复业务。 以下是主流的异地…

导轨表面硬化处理有哪些?

导轨是机器工作的重要组成部分&#xff0c;它与滑块紧密配合&#xff0c;保证机器的运转精度和定位精度。为了提高导轨的耐磨性能和使用寿命&#xff0c;通常在导轨表面加工硬化层。硬化层一般是在导轨表面形成一层高硬度和高强度的薄层&#xff0c;有效地提高了导轨的耐磨性能…

Android Compose vs 传统View系统:全面对比与选型指南

Android Compose vs 传统View系统&#xff1a;全面对比与选型指南 一、引言 随着Android Jetpack Compose的正式发布&#xff0c;Android开发迎来了全新的声明式UI框架。本文将全面对比Compose与传统View系统的差异&#xff0c;帮助开发者做出合理的技术选型。 二、核心架构…

C#中实现JSON解析器

JSON(JavaScript Object Notation)即 JavaScript 对象表示法,是一种轻量级的数据交换格式。 起源与发展 JSON 源于 JavaScript 编程语言,是 JavaScript 对象字面量语法的一个子集。但如今它已经独立于 JavaScript,成为一种通用的数据格式,广泛应用于各种编程语言和系统…

【Maven】子POM与父POM

文章目录 子POM与父POM一、继承的内容1.子 POM 可以继承父 POM 的内容2.子 POM 中声明相同配置覆盖规则示例 子POM与父POM 一、继承的内容 在 Maven 项目结构中&#xff0c;子 POM&#xff08;子模块&#xff09;可以继承父 POM 的很多配置。合理使用继承机制可以大大减少重复…

12前端项目----添加购物车1.0

商品添加购物车 商品数量添加购物车浏览器本地存储localStoragesessionStorage添加成功页面 商品数量 输入为数字&#xff0c;最少为1<div class"cartWrap"><div class"controls"><input autocomplete"off" class"itxt&quo…

EasyRTC嵌入式音视频通信SDK助力视频客服,开启智能服务新时代

一、背景 在数字化服务浪潮下&#xff0c;客户对服务体验的要求日益提升&#xff0c;传统语音及文字客服在复杂业务沟通、可视化指导等场景下渐显不足。视频客服虽成为企业服务升级的关键方向&#xff0c;但普遍面临音视频延迟高、画质模糊、多端适配难、功能扩展性差等问题&a…

干货分享|MaxKB智能问数方案及步骤详解

DeepSeek-R1的发布掀起了AI智能变革的浪潮。在过去几个月里&#xff0c;MaxKB开源企业级AI助手已经帮助大量企业和组织快速落地了DeepSeek&#xff0c;让AI在不同的行业土壤中产生持续、可度量的业务价值。 MaxKB&#xff08;github.com/1Panel-dev/MaxKB&#xff09; 可以为本…

【python】数据类型小结

1.数据类型 int、float、str、bool、元组tuple、列表list、字典dict、集合set 分为两类&#xff1a;可变和不可变数据类型 2.可变数据类型和不可变数据类型 当变量的值变化&#xff0c;内存地址不变则为可变数据类型&#xff0c; eg&#xff1a;int、float、bool、字符串st…

泰山派常用命令

0.连接adb 设备列表&#xff1a;adb devices 进入命令&#xff1a;adb shell 1.连接WiFi 查看当前网络&#xff1a;nmcli con show 我的WiFi名称&#xff1a;6 我的WiFi密码&#xff1a;12345789 连接当前网络&#xff1a;nmcli device wifi connect 6 password 1234578…

whois为什么有时会返回两个不同的域名状态

前阵子发现一直想注册但被别人注册了的一个域名快要过期了&#xff0c;就想着写个脚本跑在电脑上&#xff0c;每分钟检查一次域名状态&#xff0c;一旦域名被正式删除&#xff0c;就发封邮件通知我&#xff0c;这样就不用频繁手动检查域名状态了。 写脚本时发现一个有趣的现象…

NGINX ngx_http_addition_module 模块响应体前后注入内容

一、模块概述 模块名称&#xff1a;ngx_http_addition_module引入版本&#xff1a;自 0.7.9 起支持 addition_types&#xff0c;0.8.29 起支持“*”通配&#xff1b;功能&#xff1a;对符合 MIME 类型的响应&#xff0c;在响应体前后分别插入指定子请求 URI 返回的内容&#x…

半监督学习与强化学习的结合:新兴的智能训练模式

&#x1f4cc; 友情提示&#xff1a; 本文内容由银河易创AI&#xff08;https://ai.eaigx.com&#xff09;创作平台的gpt-4o-mini模型生成&#xff0c;旨在提供技术参考与灵感启发。文中观点或代码示例需结合实际情况验证&#xff0c;建议读者通过官方文档或实践进一步确认其准…

复习Vue136~180

1.使用create-vue创建项目 npm init vuelatest 项目目录和关键文件&#xff1a; new Vue() 创建一个应用实例 > createApp()、createRouter() createStore() 、将创建实例进行了封装&#xff0c;保证每个实例的独立封闭性。 禁用vue2的插件vuter 使用vue3的插件volar scrip…

QT采用mqtt进行通信(17.1)

文章目录 1.试错历程2. qt5.8安装3. 开始搞了4. 测试连接mqtt broker1.试错历程 尝试过网上说的各种版本,官方库和第三方库,试过qt5.9.9, qt5.12, qt5.12.2, qt5.14 等各个版本,都能编译通过,调用mqtt库,但是都不能连接成功,真的是试吐了,不知道他们的为什么都能成功,…

西门子PLC结构化编程_水处理系统水泵多备多投

文章目录 前言一、功能概述二、程序编写1. 需求分析2. 编写运行时间累计功能块3. 创建自定义数据类型1. 时间排序数据类型2. 多备多投数据类型3. 多备多投切换数据类型 4. 编程1. 创建DB数据块1. 多备多投数据块2. 多备多投切换数据块 2. 创建FB功能块 三、程序调用总结 前言 …

QT:自定义ComboBox

实现效果: 实现combobox的下拉框区域与item区域分开做UI交互显示。 支持4种实现效果,如下 效果一: 效果二: 效果三: 效果四: 实现逻辑: ui由一个toolbutton和combobox上下组合成,重点在于combobox。 我设置了4种枚举,ButtonWithComboBox对应效果一;OnlyButt…

VS2022+OpenCasCade配置编译

一、Open CASCADE Technology介绍及安装&#xff08;windows10&#xff09; Open CASCADE Technology&#xff08;简称OCCT&#xff09;是一款开源的 3D CAD/CAM/CAE 软件开发平台&#xff0c;广泛应用于工业设计、工程仿真、制造等领域。开源OCC对象库是一个面向对象C类库&…

【OSG学习笔记】Day 12: 回调机制——动态更新场景

UpdateCallback 在OpenSceneGraph&#xff08;OSG&#xff09;里&#xff0c;UpdateCallback是用来动态更新场景的关键机制。 借助UpdateCallback&#xff0c;你能够实现节点的动画效果&#xff0c;像旋转、位移等。 NodeCallback osg::NodeCallback 是一个更通用的回调类&…

全新升级:BRAV-7601-T003高性能无风扇AI边缘计算系统,助力智能未来!

在数字化与智能化飞速发展的今天&#xff0c;AI边缘计算正成为各行各业的核心驱动力。BRAV-7601作为一款高性能无风扇AI边缘计算系统&#xff0c;凭借其强大的硬件配置与丰富的扩展能力&#xff0c;为车路协同、特种车辆车载、机器视觉、医疗影像等领域提供了卓越的解决方案。最…