本帖最后由 10xjzheng 于 2016-6-1 21:45 编辑
单片机只是工具,没有思想怎么行?最近看了些信号处理方面的书籍,开始自己实现一些算法。本FFT程序是自己看书看懂后完全自己写出来的,
因为看不懂别人写的,效率上大致跟一般的程序没有区别,但是由于没有用在实际中用到,所以小细节方面的效率可能还需要优化,但是在我感
觉我写的思路比较清晰。画说回来,实现完后本来可以搞个频谱FFT玩玩,但是不知道为什么一点兴趣都没有了。
下面两本是很好的书籍,第二本讲道理讲到我都想推公式了,还是公式简单明了,也侧面反应了书籍很不错,然后去看到安富莱的FFT教程,大部
分也是抄这本书里面的内容,虽然有说是抄的,但是也......我的程序是参考第一本书中讲解的内容编写的,主要看P183页的图。
PS:书本可以上网上二手书店买,很便宜,大学的很专业的书籍又没有多少人学会的最便宜了
包括邮费通常特厚的20块钱就买到了。
参考书籍:
《深入浅出数字信号处理》
《实用数字信号处理 从原理到应用》
参考网页:
基础的概念
http://www.360doc.com/content/13/0328/12/202378_274443797.shtml
清晰的推导过程
http://blog.sina.com.cn/s/blog_57ad1bd20100txgs.html
FFT结果的物理意义
http://blog.sina.com.cn/s/blog_640029b301010xkv.html
MyFFT.zip
(2.76 MB, 下载次数: 130)
2016-6-1 21:22 上传
点击文件名下载附件
- //FFT处理
- //本算法为了清晰明了,就没有省略一些中间变量
- void MyFFT(struct ComplexNbr *OriginalBuff,unsigned int BuffLength)
- {
- unsigned char OrderCnt;
- unsigned int NbrOfBigDieXing,CntOfBigDieXing,i,NbrOfDataInPerBigDieXing,NbrOfLittleDieXingInBigDiexing,CntOfLittleDieXing;
- struct ComplexNbr TempComplexNbr;
- unsigned int Index0,Index1;
- //最外层循环,FFT级数
- for (OrderCnt = 1; OrderCnt <=FFT_ORDER;OrderCnt++)
- {
- NbrOfBigDieXing = 1;
- #if DEBUG==1
- printf("当前蝶形运算的级数是%d
",OrderCnt);
- #endif
- //首先计算出蝶形运算的个数,一开始是2^(FFT_ORDER - OrderCnt)
- for (i=0;i<(FFT_ORDER - OrderCnt);i++)
- {
- NbrOfBigDieXing *= 2;
- }
- #if DEBUG==1
- printf("大蝶形运算的个数是:%d
",NbrOfBigDieXing);
- #endif
- //每个蝶形运算中的个数
- NbrOfDataInPerBigDieXing = TOTAL_NBR/NbrOfBigDieXing;
- NbrOfLittleDieXingInBigDiexing = NbrOfDataInPerBigDieXing/2;
- #if DEBUG==1
- printf("每个大蝶形运算的数字有%d个,每个大的蝶形运算有%d个小的蝶形运算
",NbrOfDataInPerBigDieXing,NbrOfLittleDieXingInBigDiexing);
- #endif
-
- //第二层循环——每个大蝶形运算
- for(CntOfBigDieXing = 0;CntOfBigDieXing<NbrOfBigDieXing;CntOfBigDieXing++)
- {
- //第三层循环——每个小蝶形运算
- //蝶形中NbrOfDataInPerDieXing个数的计算,这NbrOfDataInPerDieXing个数又分为(NbrOfDataInPerDieXing/2)个
- //2-》2的蝶形运算,每个数交叉
- for(CntOfLittleDieXing = 0;CntOfLittleDieXing<NbrOfLittleDieXingInBigDiexing;CntOfLittleDieXing++)
- {
- //计算出小蝶形算法的第二个初始值的索引
- Index1 = CntOfBigDieXing*NbrOfDataInPerBigDieXing+NbrOfDataInPerBigDieXing/2+CntOfLittleDieXing;
- Index0 = Index1 - NbrOfLittleDieXingInBigDiexing;
- #if (DEBUG == 1)
- printf("%d - %d
",Index0,Index1);
- #endif
- //旋转因子跟初始值相乘,旋转因子的步进值跟级数有关
- //1级——4,二级——2,三级——1,这跟NbrOfBigDieXing是一样的,所以u的索引为CntOfLittleDieXing*NbrOfBigDieXing
- ComplexNbrMultip(OriginalBuff[Index1],u[CntOfLittleDieXing*NbrOfBigDieXing],&TempComplexNbr);
- //先对小蝶形中的第二个进行减,然后再对第一个进行加
- ComplexNbrSub(OriginalBuff[Index0],TempComplexNbr,&OriginalBuff[Index1]);
- ComplexNbrPlus(OriginalBuff[Index0],TempComplexNbr,&OriginalBuff[Index0]);
- }
- }
- printf("
");
- }
-
- }
复制代码
QQ截图20160601212102.png (22.06 KB, 下载次数: 1)
下载附件
2016-6-1 21:18 上传
一周热门 更多>