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 #include
  • 使用 std::complex 表示复数
  • 输入长度必须是 2 的整数次幂(自动补零或报错提示

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

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

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

#include 
#include 
#include 
#include 

using Complex = std::complex using VecC = std::vector

// 将 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; }

// 基-2 迭代 FFT(in-place,升序输出) void fft(VecC& x) { int N = x.size(); if (N <= 1) return;

// 检查是否为 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 youjiankuohaophpcn 1; n youjiankuohaophpcnyoujiankuohaophpcn= 1) ++bits;

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

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

    for (int k = 0; k zuojiankuohaophpcn N; k += 2 * m) {
        Complex w = 1.0;
        for (int j = 0; j zuojiankuohaophpcn 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;
        }
    }
}

}

AutoDraw
AutoDraw

AutoDraw是一个绘图工具,可以将草图转换成现成的模型图片

下载

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

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

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

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

fft(signal);

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

return 0;

}

补充说明与优化建议

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

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

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

554

2024.04.28

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

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

97

2025.10.23

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

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

49

2025.08.29

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

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

97

2025.10.23

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

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

380

2023.07.18

堆和栈区别
堆和栈区别

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

566

2023.08.10

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

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

394

2023.08.14

python创建txt文件教程大全
python创建txt文件教程大全

本专题整合了python创建txt文件相关教程,阅读专题下面的文章了解更多详细内容。

10

2026.01.06

python去掉字符串空格教程大全
python去掉字符串空格教程大全

本专题整合了python去掉字符串空格教程大全,阅读专题下面的文章了解更多详细内容。

2

2026.01.06

热门下载

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

精品课程

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

共18课时 | 4.3万人学习

PostgreSQL 教程
PostgreSQL 教程

共48课时 | 6.7万人学习

Django 教程
Django 教程

共28课时 | 2.8万人学习

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

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