0

0

c++如何实现一个快速傅里叶变换(FFT)_c++信号处理算法【源码】

冰火之心

冰火之心

发布时间:2026-01-05 14:14:42

|

641人浏览过

|

来源于php中文网

原创

c++实现的基-2迭代cooley-tukey fft支持复数输入、自然序输出,含位逆序重排与蝶形运算,要求长度为2的幂,使用std::complex,无外部依赖,可直接编译运行。

c++如何实现一个快速傅里叶变换(fft)_c++信号处理算法【源码】

用 C++ 实现一个高效、可读、实用的快速傅里叶变换(FFT),核心是采用 基-2 递归/迭代 Cooley-Tukey 算法,支持复数输入,输出为标准频域复数数组(按自然序,非位逆序)。下面给出一个轻量、无外部依赖、可直接编译运行的完整实现。

基础准备:使用 std::complex 和标准库

无需第三方库,仅需:

  • #include <complex></complex>#include <vector></vector>
  • 使用 std::complex<double></double> 表示复数
  • 输入长度必须是 2 的整数次幂(自动补零或报错提示

迭代版 FFT(推荐:避免递归开销,内存友好)

迭代实现更稳定、无溢出风险,适合实时信号处理。关键点是位逆序重排 + 蝶形运算分层计算:

立即学习C++免费学习笔记(深入)”;

#include <iostream>
#include <vector>
#include <complex>
#include <cmath>
<p>using Complex = std::complex<double>
using VecC = std::vector<Complex></p><p>// 将 n 转换为 bit-reversed 数(bit width = log2(size))
int bitReverse(int n, int bits) {
int rev = 0;
for (int i = 0; i < bits; ++i) {
rev |= ((n >> i) & 1) << (bits - 1 - i);
}
return rev;
}</p><p>// 基-2 迭代 FFT(in-place,升序输出)
void fft(VecC& x) {
int N = x.size();
if (N <= 1) return;</p><pre class='brush:php;toolbar:false;'>// 检查是否为 2 的幂
if ((N & (N - 1)) != 0) {
    throw std::runtime_error("FFT size must be power of 2");
}

int bits = 0;
for (int n = N; n > 1; n >>= 1) ++bits;

// 位逆序重排
for (int i = 0; i < N; ++i) {
    int j = bitReverse(i, bits);
    if (j > i) std::swap(x[i], x[j]);
}

// 蝶形运算:按级数(m = 1,2,4,...,N/2)
for (int m = 1; m < N; m *= 2) {
    double theta = M_PI / m; // π/m
    Complex w_m = Complex(cos(theta), -sin(theta)); // 主根 ωₘ

    for (int k = 0; k < N; k += 2 * m) {
        Complex w = 1.0;
        for (int j = 0; j < m; ++j) {
            Complex t = w * x[k + j + m];
            Complex u = x[k + j];
            x[k + j] = u + t;
            x[k + j + m] = u - t;
            w *= w_m;
        }
    }
}

}

PhotoAid Image Upscaler
PhotoAid Image Upscaler

PhotoAid出品的免费在线AI图片放大工具

下载

使用示例:生成正弦信号并分析频谱

验证 FFT 正确性,比如对 64 点含 8Hz 正弦波(采样率 64Hz)做变换:

立即学习C++免费学习笔记(深入)”;

int main() {
    const int N = 64;
    VecC signal(N);
<pre class='brush:php;toolbar:false;'>// 生成 8Hz 正弦(采样率 fs = 64Hz → 一个周期 8 点 → 频点索引 = 8)
double fs = 64.0;
for (int i = 0; i < N; ++i) {
    double t = i / fs;
    signal[i] = std::sin(2 * M_PI * 8 * t);
}

fft(signal);

// 输出前 12 个幅度谱(|X[k]|)
std::cout << "Magnitude spectrum (first 12 bins):\n";
for (int k = 0; k < 12; ++k) {
    double mag = std::abs(signal[k]);
    std::cout << "bin[" << k << "] = " << mag << "\n";
}
// 应看到 bin[8] 和 bin[56](共轭对)幅值显著(≈32)

return 0;

}

补充说明与优化建议

  • 逆变换 IFFT:只需对 FFT 结果取共轭 → 调用 fft → 再取共轭并除以 N
  • 实数 FFT 优化:若输入纯实数,可用 packed 格式(如将两个实序列合进一个复序列)提升 2 倍效率
  • 精度注意:使用 double 复数,避免 float 在长序列下累积误差
  • 生产环境:高频/大数据推荐用 FFTW 或 Intel IPP;教学/嵌入式场景此实现足够清晰可控

基本上就这些 —— 代码简洁、逻辑清晰、可直接集成到信号采集、滤波器设计或频谱分析模块中。需要支持任意长度(Bluestein 算法)或 SIMD 加速时,再在此基础上扩展即可。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

594

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

294

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

434

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

601

2023.08.10

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

489

2023.08.14

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

1

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

19

2026.03.05

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
CSS3 教程
CSS3 教程

共18课时 | 6.7万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.2万人学习

Django 教程
Django 教程

共28课时 | 4.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号