纬图虚拟仪器论坛

 找回密码
 立即注册
搜索
查看: 31281|回复: 39

STM32例程之FFT(源码下载)

[复制链接]
发表于 2012-8-6 21:50:43 | 显示全部楼层 |阅读模式
本帖最后由 wdluo 于 2012-8-15 11:11 编辑

本例程采用C语言版本的FFT算法对一个软件合成的信号进行FFT变换,并将FFT变换后每个频点的幅值打印输出。
信号合成程序:
  1. #define                NPT                128        //FFT采样点数,该点数应该为2的N次方,不满足此条件时应在后面补0
  2. #define                F1                50        //测试信号1频率
  3. #define                A1                3        //测试信号1幅度
  4. #define                P1                30        //测试信号1相位
  5. #define                F2                75        //测试信号1频率
  6. #define                A2                1.5        //测试信号1幅度
  7. #define                P2                90        //测试信号1相位
  8. //生成测试信号,该信号由两个正弦信号和一个直流信号合成
  9. for(t=0;t<NPT;t++)                                   //给结构体赋值
  10. {
  11.          s[t].real=2+A1*cos(2*PI*F1*t/NPT-PI*P1/180)+A2*cos(2*PI*F2*t/NPT+PI*P2/180);        
  12.          s[t].imag=0;                                //虚部为0
  13. }
复制代码
FFT变换后幅值输出如下:
FFT_128.jpg
性能测试(STM32 72M):
————————————
| 采样点数 | 耗时(ms) |
————————————
| 32       | 1.145    |
————————————
| 64       | 2.322    |
————————————
| 128      | 4.918    |
————————————
| 256      | 10.648   |
————————————
| 512      | 23.210   |
————————————
| 1024     | 50.832   |
————————————
源码下载:
FFT.rar (628.23 KB, 下载次数: 1164)
回复

使用道具 举报

发表于 2012-8-14 17:07:32 | 显示全部楼层

回帖奖励 +2

谢谢分享,真的很好!!!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-14 19:11:01 | 显示全部楼层
maxgo 发表于 2012-8-14 17:07
谢谢分享,真的很好!!!

回复 支持 反对

使用道具 举报

发表于 2012-8-15 11:07:09 | 显示全部楼层
谢谢分享啊
回复 支持 反对

使用道具 举报

发表于 2012-8-16 10:12:31 | 显示全部楼层

回帖奖励 +2

楼主的这个论坛真好,都是我想要的!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-16 10:58:00 | 显示全部楼层
Herossx 发表于 2012-8-16 10:12
楼主的这个论坛真好,都是我想要的!

回复 支持 反对

使用道具 举报

发表于 2012-8-18 12:12:43 | 显示全部楼层
之前还发微薄“技术垄断,都怕抢饭碗,那好大家都学不成,一直跟着外国的屁股跑吧 !”,很多代码都在淘宝上买的,版主奉献精神我泪流满面
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-18 12:31:48 | 显示全部楼层
vzhaodan 发表于 2012-8-18 12:12
之前还发微薄“技术垄断,都怕抢饭碗,那好大家都学不成,一直跟着外国的屁股跑吧 !”,很多代码都在淘宝上 ...

大家共同学习共同进步才是真理!哈哈哈
回复 支持 反对

使用道具 举报

发表于 2012-8-19 16:05:45 | 显示全部楼层
楼主,我在写音乐频谱的程序,现在FFT部分搞定了,只差送到LED屏显示部分的了,但没思路,能不能把你的程序分享下,学习学习
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-19 16:07:41 | 显示全部楼层
戴上耳机听歌 发表于 2012-8-19 16:05
楼主,我在写音乐频谱的程序,现在FFT部分搞定了,只差送到LED屏显示部分的了,但没思路,能不能把你的程序 ...

关注本论坛吧,后面会上传的
回复 支持 反对

使用道具 举报

发表于 2012-8-27 13:32:14 | 显示全部楼层
我要我要我还要
回复 支持 反对

使用道具 举报

发表于 2012-9-2 12:12:58 | 显示全部楼层
谢谢LZ分享
回复 支持 反对

使用道具 举报

发表于 2012-9-4 14:36:11 | 显示全部楼层
必须顶,先下载下来,用到时再请教楼主啊。。。
回复 支持 反对

使用道具 举报

发表于 2012-9-5 09:58:43 | 显示全部楼层
谢谢分享,支持楼主!!!!!!!!!

点评

如果有用也奉献些你的东西给大家吧,O(∩_∩)O~  发表于 2012-9-5 11:23
回复 支持 反对

使用道具 举报

发表于 2012-9-6 11:21:51 | 显示全部楼层
下载学习,谢了
回复 支持 反对

使用道具 举报

发表于 2012-9-6 14:13:15 | 显示全部楼层
果断下载,顶了!
回复 支持 反对

使用道具 举报

发表于 2012-9-28 16:15:07 | 显示全部楼层
谢谢分享 支持楼主
回复 支持 反对

使用道具 举报

发表于 2012-10-1 12:04:58 | 显示全部楼层
感谢大大的分享,
想请问一下,范例采样点数是128,
那如果改用1024个点,那50赫兹和75赫兹的值会是在哪呢?
最近会用STM32做FFT,刚好看到大大有分享,
所以想用大大分享的来做学习

点评

你等比例计算下就知道了,这个不难的  发表于 2012-10-15 16:47
回复 支持 反对

使用道具 举报

发表于 2012-10-12 00:30:34 | 显示全部楼层
谢谢分享啊 看看
回复 支持 反对

使用道具 举报

发表于 2012-10-15 16:45:38 | 显示全部楼层

谢谢分享,真的很好!!!
回复 支持 反对

使用道具 举报

发表于 2012-10-18 20:53:24 | 显示全部楼层
下载学习 谢谢分享
回复 支持 反对

使用道具 举报

发表于 2012-10-29 17:59:17 | 显示全部楼层
谢谢分享,真的很好!!!
回复 支持 反对

使用道具 举报

发表于 2012-10-29 18:27:57 | 显示全部楼层
嗯,很好的,收藏了
回复 支持 反对

使用道具 举报

发表于 2012-10-31 11:00:56 | 显示全部楼层
收藏了,谢谢!
回复 支持 反对

使用道具 举报

发表于 2012-11-3 18:37:57 | 显示全部楼层
楼主好人啊  谢谢了
回复 支持 反对

使用道具 举报

发表于 2012-11-7 15:46:49 | 显示全部楼层
太感谢你啦。。。神一样的LZ
回复 支持 反对

使用道具 举报

发表于 2013-5-18 04:01:06 | 显示全部楼层
不得不说这个论坛是我收益最多的,只是目前还太菜...
回复 支持 反对

使用道具 举报

发表于 2013-5-30 15:35:06 | 显示全部楼层
谢谢楼主无私的分享,好好学习下。。。
回复 支持 反对

使用道具 举报

发表于 2013-5-30 21:34:22 | 显示全部楼层
楼主好,我用STM32做FFT算法怎么512点以上就算不了?算64 128 256点 都可以,我对数据进行MATLAB仿真,跟STM32输出的结果一样,但是采样点数到512后,程序就卡住了一样,不知道怎么回事,楼主遇到过这种情况吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-5-30 22:25:01 | 显示全部楼层
你是用的STM32的DSP库还是C语言版本的?
回复 支持 反对

使用道具 举报

发表于 2013-7-25 20:16:35 | 显示全部楼层
楼主,我想请教一下,你给的程序的输入信号是自己用软件生成的(即把两个正弦信号和直流分量叠加在一起),如果我现在相对外部输入的信号进行AD采集然后进行FFT变换,该怎么进行信号采集呢?比如我50Hz的正弦信号我要从什么时候开始采集信号呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-26 11:28:55 | 显示全部楼层
澡雪 发表于 2013-7-25 20:16
楼主,我想请教一下,你给的程序的输入信号是自己用软件生成的(即把两个正弦信号和直流分量叠加在一起), ...

随便从什么时候开始采集都可以,采集时间的不同只会影响FFT变换过后的相位值,对于频率参数是不会有影响的
回复 支持 反对

使用道具 举报

发表于 2013-8-6 13:28:31 | 显示全部楼层
wdluo 发表于 2013-7-26 11:28
随便从什么时候开始采集都可以,采集时间的不同只会影响FFT变换过后的相位值,对于频率参数是不会有影响的 ...

谢谢楼主,我后来相通了
回复 支持 反对

使用道具 举报

发表于 2013-8-6 17:01:48 | 显示全部楼层
wdluo 发表于 2013-7-26 11:28
随便从什么时候开始采集都可以,采集时间的不同只会影响FFT变换过后的相位值,对于频率参数是不会有影响的 ...

楼主,还是想向你请教下,就是我你程序中不是设置了采集128个点吗?这样的话对于分别采集50Hz和1kHz的信号都是可以进行FFT变化分析的吗?这个128个采样点是不是就规定是在一个信号周期内进行采集的?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-6 17:06:43 | 显示全部楼层
澡雪 发表于 2013-8-6 17:01
楼主,还是想向你请教下,就是我你程序中不是设置了采集128个点吗?这样的话对于分别采集50Hz和1kHz的信号 ...

根据采样定理,采样频率只要大于信号频率的2倍以上基本上就可以还原原来的信号,当然也可以对它进行FFT变换,但是在实际工程中为保证频谱分析更精确点,一般采样频率都会大于信号频率的4倍以上,也就是说在你信号一个周期内采集4个以上的点就完全够了,所以你采集的128个点可以是多个周期的,也可以是一个周期的,这个没关系的。
回复 支持 反对

使用道具 举报

发表于 2013-8-6 20:48:45 | 显示全部楼层
wdluo 发表于 2013-8-6 17:06
根据采样定理,采样频率只要大于信号频率的2倍以上基本上就可以还原原来的信号,当然也可以对它进行FFT变 ...

问下楼主,那个我STM32的AD采样的触发方式应该没有规定吧?为什么我现在20Hz的正弦输入信号先用AD进行采集128次(采样AD采样时钟12M,55.5周期的时间),然后其他的就与楼主的程序一样了,但是我输出显示的话除了直流分量是与其他数不一样的,其他数都是一样的?这是什么情况?求大神点拨
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-8-6 20:56:35 | 显示全部楼层
澡雪 发表于 2013-8-6 20:48
问下楼主,那个我STM32的AD采样的触发方式应该没有规定吧?为什么我现在20Hz的正弦输入信号先用AD进行采集 ...

我这个程序是用公式的方式自己产生的一个模拟信号,你可以去论坛里面找找音乐频谱的帖子,那里的FFT变换是采集的真实物理信号。
回复 支持 反对

使用道具 举报

发表于 2014-6-16 22:42:33 | 显示全部楼层
好资料!谢谢分享!!
回复 支持 反对

使用道具 举报

发表于 2014-11-23 14:40:43 | 显示全部楼层
感谢楼主,好资料
回复 支持 反对

使用道具 举报

发表于 2015-10-1 16:26:38 | 显示全部楼层
好帖子,请问楼主,这个FFT算是定点FFT,还是算浮点数FFT?
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|纬图虚拟仪器

GMT+8, 2024-12-22 18:38 , Processed in 6.415104 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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