找回密码
 立即注册
查看: 121|回复: 2

FFT、IFFT、RFFT、IRFFT通用库函数,提供FP32、Q31、Q15、Q10等四种精度

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:2
  • 最近打卡:2026-06-14 10:01:12
已绑定手机

1

主题

3

回帖

19

积分

新手上路

积分
19
发表于 2026-6-14 10:01:12 | 显示全部楼层 |阅读模式
线性变换库 - 傅里叶变换、逆傅里叶变换、实傅里叶变换、逆实傅里叶变换



FP32 - 单精度浮点(float32),支持 0-1024点
Q31 - 高精度整型(int32),支持0-1024点

Q15 - 中精度整型(int16),支持0-256点
Q10 - 低精度整型(int16),支持0-256点

     (点数必须为2的幂次方)


精度计算指标:详见accuracy.csv
MSE - Mean Squared Error - 低于(e-4)
SNR - 信噪比 - 高于(60dB)


运算时间指标:详见timing.csv
该指标本人计算详细,以下只列出256点FFT(傅里叶变换)最快的
1)FP32(40M主频,108M供TFPU频率):15970us
2)Q31(40M主频 + MDU32):48780us
3)Q15(40M主频 + MDU32):11890us
4)Q10(40M主频 + MDU32):9180us
!!不得不吐槽,Q31慢主要是它计算需要int32*int32,然后C语言没有64位整型,需要用汇编优化,太难搞了!!
!!可以发现这个没有比梁工256点快,主要是为了通用即在 0~1024 | 0~256 点都可以算,那个只能算256,精度还感人!!


验证方法:
FP32、Q31都是用已知1024的数组计算出来和scipy内置的比较;
Q15、Q10都是用已知256的数组计算出来和scipy内置的比较;
其余点数没测过,大家可以试一试,有问题我可以改进,我一个人测太烦了;


使用说明:
阅读keil内的readme,大家可以用AI来阅读和操作;
整体步骤:初始化 -> 运算;
整型部分还有convert.h文件中的,浮点转整型与整型转浮点;
大家使用的时候,无需关心.c文件如何实现,看.h中函数用法就行;

算法说明:

有三个技术文档大家可以参考








线性变换库函数.zip

1.33 MB, 下载次数: 14

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:299
  • 最近打卡:2026-07-04 00:01:55
已绑定手机

66

主题

808

回帖

3037

积分

论坛元老

DIY玩家

积分
3037
发表于 2026-6-14 11:03:17 | 显示全部楼层
实现优化快速傅里叶变换
需求场景还是多的
永怀这学徒心
回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:393
  • 最近打卡:2026-07-04 17:13:30

83

主题

7888

回帖

1万

积分

超级版主

积分
16827
发表于 2026-6-14 17:40:28 | 显示全部楼层
我的FFT-256点的精度是对应12位的ADC的,为了快速,做了优化,计算时间大约4ms@80MHz。
我通常用FFT-256评估单片机算力。或者用8阶以上的数字滤波器来评估算力。
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-7-5 08:03 , Processed in 0.067511 second(s), 54 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表