【C++】自研基 2 Cooley–Tukey

“自研基 2 Cooley–Tukey:倒位序 + 逐级蝶形,入口 fft(int N, complex f[])

拆成三件事


它在讲什么

  1. “基 2 Cooley–Tukey”
    指的是最常见的 FFT 算法:长度 N 必须是 2 的整数次幂,把离散傅里叶变换分解成一层一层的“2 点蝶形”运算,复杂度从 O(N2)O(N^2)O(N2) 降到 O(Nlog⁡2N)O(N\log_2N)O(Nlog2N)。头文件里也写着“点数必须为 8, 16, 32, …”【】;接口层不满足时会自动补零到最近的 2 的幂
if (originDataQueue.size() < round(pow(2, 5)))
  1. “倒位序”(bit-reversal permutation)
    在做蝶形之前,要把输入序列按“索引的二进制位反转”的顺序重排,这样内层蝶形才能就地计算、顺序访问。 fft() 里先算 M=log⁡2NM=\log_2 NM=log2N【】,然后执行倒位序重排i,j,k 这段就是) 。

  2. “逐级蝶形”(stage-by-stage butterflies)
    一共 M 层。第 m 层把数据分成长度 2m2^m2m 的小组,每组做一堆 2 点蝶形;每个蝶形都要乘一个“旋转因子” WNr=e−j2πr/NW_N^r=e^{-j2\pi r/N}WNr=ej2πr/N。代码里:

    • 分层与分组:la = 2^mlb = la/2【】;

    • 计算旋转因子:Wn_i(N, r, &wn, 1)(flag=1 表示正变换取 -sin) ;

    • 2 点蝶形核心:

      t = f[lc] * wn
      f[lc] = f[n] - t
      f[n]  = f[n] + t
      

      这三行就在循环里 。整段“逐级蝶形”的外层/内层循环见 。


“入口函数 fft(int N, complex f[])

  • 函数签名fft(int N, complex f[]);传入长度 N 和一段复数数组 f
  • 就地运算输入和输出都在同一个数组 f(in-place),不另外开输出缓冲;这一点在头文件注释里写了。
  • 正/逆变换:正变换用 fft(...);逆变换 ifft(...) 的实现方式是“共轭→fft→再共轭→每点除以 N” 。

这段代码的变量怎么对应

  • M = log2(N):总共层数
  • 倒位序重排:i,j,k 三个指针完成置换
  • 每层参数:la=2^m(这一层每组长度)、lb=la/2(每组蝶形的“半距离”)
  • 旋转因子:Wn_i(N,r,...) 生成 e−j2πr/Ne^{-j2\pi r/N}ej2πr/Ne+j2πr/Ne^{+j2\pi r/N}e+j2πr/N(逆变换)
  • 蝶形对下标:n 是上节点,lc = n + lb 是下节点

和整条链路的关系

  • C# 侧把时域数据打包成 JSON 串,调用 calcOfflineFFT_testing 送到 C++;
  • C++ 侧去直流补零到 2 的幂,再调 fft(N, fftData)
  • FFT 结果出来后你在接口层做了单边谱归一化(直流和奈奎斯特不乘 2,其余乘 2/N)并构建频轴 df = Fs/N

需要注意的两点

  • fft() 本身不做幅值归一化;如果要得到幅值(如 Vrms/Arms 或幅度谱),现在是在外层完成的,这是对的。
  • N 必须是 2 的幂;已经在接口层做了检查并自动补零,避免算法报错或性能退化。

扩展举例
可以把这段算法画成一张小示意图或用 N=8 的例子演示“倒位序”如何从索引 0..7 变成 0,4,2,6,1,5,3,7,再走一层层蝶形

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

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

相关文章

小白挑战一周上架元服务——ArkUI04

文章目录前言一、ArkUI是何方神圣&#xff1f;二、声明式UI三、组件1.基础组件2.布局容器组件3.导航组件4.自定义组件5.组件生命周期四、状态管理1.State装饰器: 状态变量2.Prop装饰器&#xff1a;父子单向同步3.Link装饰器&#xff1a;父子双向同步4.Provide/Consume装饰器&am…

剧本杀小程序系统开发:构建剧本杀社交新生态

在社交需求日益多样化的今天&#xff0c;剧本杀凭借其独特的社交属性&#xff0c;成为了人们热衷的社交娱乐方式之一。而剧本杀小程序系统开发&#xff0c;则进一步拓展了剧本杀的社交边界&#xff0c;构建起一个全新的剧本杀社交新生态&#xff0c;让玩家在推理与角色扮演中&a…

AI提高投放效率的核心策略

内容概要人工智能技术正深刻改变着广告投放领域&#xff0c;其核心价值在于显著提升投放效率。通过融合智能算法优化、实时数据分析与自动化投放流程&#xff0c;AI系统能够以前所未有的速度和精度处理海量信息&#xff0c;驱动更精准的营销决策。这不仅大幅缩短了传统人工操作…

OpenBMC 中命令模式的深度解析:从原理到实现

引言 在 OpenBMC 的设计中&#xff0c;命令模式&#xff08;Command Pattern&#xff09;被广泛应用于各种场景&#xff0c;特别是 IPMI 命令处理、异步操作封装和用户请求管理等。本文将深入分析 OpenBMC 中命令模式的实现原理、架构设计以及完整的执行流程&#xff0c;并通过…

从0开始跟小甲鱼C语言视频使用linux一步步学习C语言(持续更新)8.15

第十七天 第五十七&#xff0c;五十八&#xff0c;五十九和六十集 第五十六集 删除链表结点 没什么好说的关键部分代码如图 链表的插入操作 依旧没有啥可以说的代码部分大家看视频就能看懂&#xff0c;大家应该是没有什么问题的吧&#xff1f; 第五十七集 共用体形式结构与结构…

云服务器网站无法访问的系统化故障排查指南及多维度解决方案

当云服务器上的网站突然无法访问时&#xff0c;这种突发状况往往让人措手不及。别担心&#xff0c;我们可以通过系统化的排查流程快速定位问题根源。以下是经过实战验证的故障排除指南&#xff0c;帮您分步解决网站访问异常问题。一、基础状态确认 服务器的生命体征就像人体的脉…

strings命令和findstr命令验证iso文件中ntkrnlmp.exe系统版本

strings命令和findstr命令验证iso文件中ntkrnlmp.exe系统版本D:\chsads3647\i386>expand.exe Microsoft (R) File Expansion Utility Version 5.2.3647.0 版本所有 (c) Microsoft Corporation. 保留所有权利。未指定文件。D:\chsads3647\i386>strings.exe ntkrnlmp.exe …

C语言:指针(5)

1. sizeof与strlen的对比1.1 sizeofsizeof属于是操作符&#xff0c;用于计算变量所占的空间大小&#xff0c;单位为字节。如果操作数是类型的话&#xff0c;计算的是使用类型创建的变量所占内存空间的大小。sizeof只计算数据在内存中所占的空间大小&#xff0c;而不在乎内存中存…

rent8 安装部署教程之 Windows

1. Apache 安装与配置 1.1. 获取并解压 Apache 在 Apache Lounge 网址下载编译版的 Apache。下载完成后&#xff0c;将压缩包解压到 d:\web\Apache24 作为 Apache 的安装目录。 1.2. 配置 Apache 打开配置文件 conf\httpd.conf&#xff0c;找到第 37 行配置。 ​ Define SRVROO…

边缘智能实战手册:攻克IoT应用三大挑战的AI战术

前言&#xff1a;在当前的AIoT&#xff08;人工智能物联网&#xff09;赛道上&#xff0c;将AI能力下沉至边缘设备已不再是“要不要做”的选择题&#xff0c;而是“如何做好”的必答题。然而&#xff0c;在实际项目中&#xff0c;工程师们常常会遇到性能、功耗和隐私这“三座大…

【React】use-immer vs 原生 Hook:谁更胜一筹?

1.概述 use-immer 不属于官方 Hook&#xff0c;是社区维护的第三方库&#xff01;use-immer 通过封装 Immer 的不可变更新机制&#xff0c;为 React 开发者提供了一种更直观、高效的状态管理方式。它尤其适合处理复杂嵌套状态或需要频繁更新的场景&#xff0c;同时保持了与 Re…

【案例】Vue3 实现高性能级横向循环滚动生产线效果:基于 requestAnimationFrame 的流畅动画方案

动画效果在工业监控系统、生产看板等场景中&#xff0c;经常需要模拟生产线的动态运行效果。本文将基于 Vue3 和 requestAnimationFrame 实现一个高性能的横向循环滚动效果&#xff0c;完美模拟生产线传输带的视觉体验。我们将从代码实现到原理分析&#xff0c;全面讲解如何打造…

万字长文解码如何玩转Prompt(附实践应用)

在AI技术迅猛发展的今天&#xff0c;如何与大型语言模型高效“对话”已成为释放其潜力的关键。本文深入探讨了提示词工程&#xff08;Prompt Engineering&#xff09;这一新兴领域&#xff0c;系统解析了从基础概念到高级技巧的完整知识体系&#xff0c;并结合“淘宝XX业务数科…

easyExcel嵌套子集合导出Excel

我想要的Excel效果说明: 1.创建两个自定义注解:ExcelMerge(表示主对象内的单个属性,后续会根据子集合的大小合并下面的单元格),ExcelNestedList(表示嵌套的子集合) 2.NestedDataConverter.java 会把查询到的数据转换为一行一行的,相当于主表 left join 子表 ON 主.id子.主id的形…

基于 C# WinForm 字体编辑器开发记录:从基础到进阶

目录 基础版本实现 进阶版本改进 字体设置窗体增强 主窗体改进 功能对比 项目在本文章的绑定资源中免费的&#xff0c;0积分就可以下载哦~ 在 Windows Forms 应用开发中&#xff0c;字体编辑功能是许多文本处理软件的基础功能。本文将分享一个简易字体编辑器的开发过程&a…

Linux基本使用和Java程序部署(含 JDK 与 MySQL)

文章目录Linux 背景知识Linux 基本使用Linux 常用的特殊符号和操作符Linux 常用命令文本处理与分析系统管理与操作用户与权限管理文件/目录操作与内容处理工具Linux系统防火墙Shell 脚本与实践搭建 Java 部署环境apt&#xff08;Debian/Ubuntu 系的包管理利器&#xff09;介绍安…

抗辐照CANFD通信芯片在高安全领域国产化替代的研究

摘要&#xff1a;随着现代科技的飞速发展&#xff0c;高安全领域如航空航天、卫星通信等对电子设备的可靠性与抗辐照性能提出了极高的要求。CANFD通信芯片作为数据传输的关键组件&#xff0c;其性能优劣直接关系到整个系统的稳定性与安全性。本文聚焦于抗辐照CANFD通信芯片在高…

Mybatis 源码解读-SqlSession 会话源码和Executor SQL操作执行器源码

作者源码阅读笔记主要采用金山云文档记录的&#xff0c;所有的交互图和代码阅读笔记都是记录在云文档里面&#xff0c;本平台的文档编辑实在不方便&#xff0c;会导致我梳理的交互图和文档失去原来的格式&#xff0c;所以整理在文档里面&#xff0c;供大家阅读交流. 【金山文档…

Java集合类综合练习题

代码 import java.util.*; class ScoreRecord {private String studentId;private String name;private String subject;private int score;public ScoreRecord(String studentId, String name, String subject, int score) {this.studentId studentId;this.name name;this.s…

秒懂边缘云|1分钟了解边缘安全加速 ESA

普通开发者如何搭建安全快速的在线业务才能性价比最高 &#xff1f;阿里云现已为开发者推出免费版边缘安全加速 ESA&#xff0c;1 个产品就能把 CDN 缓存 API 加速 DNS WAF DDoS 防护全部搞定&#xff0c;还支持边缘函数快速部署网站和 AI 应用&#xff0c;性价比拉满。 1…