当前位置: 首页 > news >正文

嵌入式下快速傅里叶变换(FFT)C语言库kissfft

一.FFT常用库(C/C++)

1.FFTW

(1)最常用的当属FFTW(Fastest Fourier Transform in the West),FFTW是一个专注于快速傅里叶变换(FFT)的高性能计算库,被广泛应用于科学计算、信号处理、图像处理等领域。

(2)跨平台兼容:

支持 Linux、Windows、macOS 等主流操作系统,以及 x86、ARM、PowerPC 等处理器架构。

可无缝集成到 Python(通过 SciPy)、MATLAB、R 等高级语言中。

(3)FFTW比较通用,由于之前写过两篇相关文章,本文不做重点阐述。

      <<QT实现FFT整体流程及结果展示>>  

<<FFTW库在vs2022下编译lib库及在QT6.8中调用>>

     

2.KissFFT(本文重点介绍)

(1)KissFFT(Keep It Simple, Stupid Fast Fourier Transform)是一个轻量级、高性能的 FFT 库,其核心优势在于代码简洁(约 500 行)、无外部依赖、支持定点/浮点运算,特别适合嵌入式系统和实时处理场景。

官网:https://github.com/mborgerding/kissfft

(2)核心特性

二.KissFFT使用

1.浮点输入模式(默认)

头文件配置:无特殊定义

数据类型:

typedef float kiss_fft_scalar;       // 实数输入类型

typedef struct { float r; float i; } kiss_fft_cpx;  // 复数类型

适用场景:PC、服务器、带FPU的嵌入式设备

2.整型输入模式(定点数)

头文件配置(在 kiss_fft.h 中定义):

#define FIXED_POINT 16     // 16位定点 (Q15)

// 或

#define FIXED_POINT 32     // 32位定点 (Q31)

数据类型:

typedef int16_t kiss_fft_scalar;    // Q15 输入

typedef struct { int16_t r; int16_t i; } kiss_fft_cpx;

Q格式说明:

Q15:数值范围 [-1.0, 1.0) 映射到 [-32768, 32767]

计算时需手动缩放(如 input = raw_data >> 4)

3.代码示例:浮点数 FFT(1024 点)

#include "kiss_fft.h"

void float_fft_example() {

    const int N = 1024;

    kiss_fft_cfg cfg = kiss_fft_alloc(N, 0, NULL, NULL);  // 正向FFT

    // 准备输入(实数信号)

    kiss_fft_scalar in[N];

    for (int i = 0; i < N; i++) {

        in[i] = sinf(2 * M_PI * 100 * i / 44100.0f);  // 100Hz正弦波

    }

    // 执行实数FFT(需 kiss_fftr.h)

    kiss_fft_cpx out[N/2 + 1];

    kiss_fftr_cfg rcfg = kiss_fftr_alloc(N, 0, NULL, NULL);

    kiss_fftr(rcfg, in, out);  // 实数FFT计算

    // 计算幅度谱

    float mag[N/2 + 1];

    for (int i = 0; i <= N/2; i++) {

        mag[i] = sqrtf(out[i].r * out[i].r + out[i].i * out[i].i);

    }

    // 释放资源

    kiss_fft_free(cfg);

    kiss_fftr_free(rcfg);

}

4.代码示例:整型输入 FFT(Q15 定点数)

#define FIXED_POINT 16  // 启用16位定点模式

#include "kiss_fftr.h"

void fixed_point_fft_example() {

    const int N = 512;

    const int SCALE_SHIFT = 3;  // 缩放因子(防溢出)

    // 配置FFT(正向实数变换)

    kiss_fftr_cfg cfg = kiss_fftr_alloc(N, 0, NULL, NULL);

    // 准备整型输入(Q15格式)

    kiss_fft_scalar in[N];  // 实际类型为 int16_t

    int16_t adc_data[N] = {...};  // 原始ADC数据(-32768~32767)

    

    // 缩放至Q15范围 [-1.0, 1.0)

    for (int i = 0; i < N; i++) {

        in[i] = adc_data[i] >> SCALE_SHIFT;  // 防溢出缩放

    }

    // 执行FFT

    kiss_fft_cpx out[N/2 + 1];

    kiss_fftr(cfg, in, out);

    // 计算幅度(需反缩放)

    int32_t mag[N/2 + 1];

    const int32_t scale_correction = 1 << (SCALE_SHIFT + 1);  // 补偿因子

    for (int i = 0; i <= N/2; i++) {

        int32_t re = (int32_t)out[i].r * scale_correction;

        int32_t im = (int32_t)out[i].i * scale_correction;

        mag[i] = sqrt(re * re + im * im);  // 实际需用查表法优化

    }

    kiss_fftr_free(cfg);

}

5.总结

浮点模式:精度高(~1e-6),适合科学计算

定点模式:速度快、功耗低,适合实时嵌入式系统

6.选择建议

http://www.dtcms.com/a/282897.html

相关文章:

  • 图机器学习(9)——图正则化算法
  • 2. nth-child 和 nth-of-type 区别
  • xss-labs通关
  • k8s之持久化存储流程
  • 小架构step系列16:代码文档
  • 深度点评:2025 年机床钣金加工 TOP10 终极点评
  • 批量文件重命名工具 香菇重命名v0.2
  • Linux运维新手的修炼手扎之第21天
  • 调试bug记录
  • 如何用山海鲸轻松构建3D智慧大屏?
  • 【开源.NET】一个 .NET 开源美观、灵活易用、功能强大的图表库
  • 3DGS之COLMAP
  • 能行为监测算法:低成本下的高效管理
  • LIN通信协议入门
  • AI学习笔记三十一:YOLOv8 C++编译测试(OpenVINO)
  • 构建足球实时比分APP:REST API与WebSocket接入方案详解
  • PandaWiki与GitBook深度对比:AI时代的知识管理工具,选谁好?
  • 自动控制原理知识地图:舵轮、路径与导航图
  • 经典排序算法之归并排序(Merge Sort)
  • Linux内核IPv4路由查找:LPC-Trie算法的深度实践
  • 记录一道sql面试题3
  • 【Docker基础】Dockerfile多阶段构建:Multi-stage Builds详解
  • 【java面试day5】redis缓存-数据过期策略
  • MyBatis 之分页四式传参与聚合、主键操作全解
  • cv610_10B烧录,只能烧录到10%~20%,可能为DDRIO电压没有1.8v
  • Datawhale AI夏令营-基于带货视频评论的用户洞察挑战赛使用bert提升效果
  • socket和websocket的区别
  • 「大模型应用」(2)RAG的检索与rerank
  • vue页面不销毁的情况下再返回,总是执行created,而不触发 activated
  • uniapp 调起支付宝 requestPayment:fail service not found