
8点FFT的C语言实现
处理的对象是实数,使用纯C语言实现。 该程序针对8点FFT进行设计,其中N=8。 由于采用按时间抽选的方式,输入数据需倒序排列,输出依然是正常序,因此需在转换过程中进行数据倒置处理。
发布日期:2025-03-28 11:14:42
浏览次数:7
分类:精选文章
本文共 3263 字,大约阅读时间需要 10 分钟。
程序原理来源:程佩青的《数字信号处理教程》中按时间抽选的基-2 FFT蝶形图
说明:
【 fft.c】
#include "fft.h"complex WN0 = {1, 0};complex WN1 = {0.7109, -0.7109};complex WN2 = {0, -1};complex WN3 = {-0.7109, -0.7109};complex ComplexMul(complex c1, complex c2) { complex r; r.re = c1.re * c2.re - c1.im * c2.im; r.im = c1.re * c2.im + c1.im * c2.re; return r;}complex ComplexAdd(complex c1, complex c2) { complex r; r.re = c1.re + c2.re; r.im = c1.im + c2.im; return r;}complex ReverseComplex(complex c) { c.re = -c.re; c.im = -c.im; return c;}void fft(complex *x, complex *r) { complex temp1[8]; complex temp2[8]; temp1[0] = x[0]; temp1[1] = ComplexMul(x[1], WN0); temp1[2] = x[2]; temp1[3] = ComplexMul(x[3], WN0); temp1[4] = x[4]; temp1[5] = ComplexMul(x[5], WN0); temp1[6] = x[6]; temp1[7] = ComplexMul(x[7], WN0); temp2[0] = ComplexAdd(temp1[0], temp1[1]); temp2[1] = ComplexAdd(temp1[0], ReverseComplex(temp1[1])); temp2[2] = ComplexAdd(temp1[2], temp1[3]); temp2[3] = ComplexAdd(temp1[2], ReverseComplex(temp1[3])); temp2[4] = ComplexAdd(temp1[4], temp1[5]); temp2[5] = ComplexAdd(temp1[4], ReverseComplex(temp1[5])); temp2[6] = ComplexAdd(temp1[6], temp1[7]); temp2[7] = ComplexAdd(temp1[6], ReverseComplex(temp1[7])); temp2[2] = ComplexMul(temp2[2], WN0); temp2[3] = ComplexMul(temp2[3], WN2); temp2[6] = ComplexMul(temp2[6], WN0); temp2[7] = ComplexMul(temp2[7], WN2); temp1[0] = ComplexAdd(temp2[0], temp2[2]); temp1[1] = ComplexAdd(temp2[1], temp2[3]); temp1[2] = ComplexAdd(temp2[0], ReverseComplex(temp2[2])); temp1[3] = ComplexAdd(temp2[1], ReverseComplex(temp2[3])); temp1[4] = ComplexAdd(temp2[4], temp2[6]); temp1[5] = ComplexAdd(temp2[5], temp2[7]); temp1[6] = ComplexAdd(temp2[4], ReverseComplex(temp2[6])); temp1[7] = ComplexAdd(temp2[5], ReverseComplex(temp2[7])); temp1[4] = ComplexMul(temp1[4], WN0); temp1[5] = ComplexMul(temp1[5], WN1); temp1[6] = ComplexMul(temp1[6], WN2); temp1[7] = ComplexMul(temp1[7], WN3); r[0] = ComplexAdd(temp1[0], temp1[4]); r[1] = ComplexAdd(temp1[1], temp1[5]); r[2] = ComplexAdd(temp1[2], temp1[6]); r[3] = ComplexAdd(temp1[3], temp1[7]); r[4] = ComplexAdd(temp1[0], ReverseComplex(temp1[4])); r[5] = ComplexAdd(temp1[1], ReverseComplex(temp1[5])); r[6] = ComplexAdd(temp1[2], ReverseComplex(temp1[6])); r[7] = ComplexAdd(temp1[3], ReverseComplex(temp1[7]));}
【 fft.h】
#ifndef _FFT_H#define _FFT_H#includetypedef unsigned int uint16u;typedef unsigned char uint8;typedef unsigned long uint32;typedef int sint16;typedef char sint8;typedef long sint32;typedef float fp32;typedef double fp64;#define FFT_N (8) // 8点FFTtypedef struct Complex { fp32 re; fp32 im;} complex;// 复数乘法complex ComplexMul(complex c1, complex c2);complex ComplexAdd(complex c1, complex c2);// 复数反转(倒置)complex ReverseComplex(complex c);// 8点基-2时间FFT算法void fft(complex *x, complex *r);void BitReverse(complex *x, complex *r, uint8 n, uint8 l);#endif
这个程序实现了一个8点的基-2快速傅里叶变换(FFT)算法,主要思想是通过蝶形变换逐步划分数据,利用复数乘法和加法进行快速转换。代码中定义了常量WN0到WN3,这些常量对应复数单位根,分别用于蝶形变换的不同阶段。
发表评论
最新留言
表示我来过!
[***.240.166.169]2025年04月16日 22时39分34秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
如何通过 WebSockets 实现 Python 和 JavaScript 的实时通信
2023-01-23
分享下自己总结的Git常用命令
2023-01-23
AIGC在量子计算研究中的应用:算法优化提示词
2023-01-23
三种引流方法&案例分析
2023-01-23
打开有惊喜
2023-01-23
AIGC在个性化医疗方案生成中的应用与挑战
2023-01-23
AUTOSAR_SWS_CANDriver4
2023-01-23
Spring高手系列2
2023-01-23
Android内存优化指南:从数据结构到5R法则的全面策略
2023-01-23
现代前端开发框架对比:React、Vue 和 Svelte 的选择指南
2023-01-23
跑男策划书
2023-01-23
智能电商小程序代码开发:打造全网热销购物体验
2023-01-23
程序员的幽默9
2023-01-23
计算机网络判断题二
2023-01-23
程序员都看不懂的代码
2023-01-23
LLM+多智能体协作:基于CrewAI与DeepSeek的邮件自动化实践
2023-01-23
404错误页面简约清新源码 非常好看
2023-01-23
404页面自动跳转源码
2023-01-23
44:数字序列中某一位的数字
2023-01-23
458. 可怜的小猪
2023-01-23