声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 3749|回复: 17

[编程技巧] 谁知道FFT源代码的流程图???

[复制链接]
发表于 2016-6-27 10:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
哪位大神知道FFT编写的流程图或者源代码啊???

本帖被以下淘专辑推荐:

回复
分享到:

使用道具 举报

发表于 2016-6-27 13:41 | 显示全部楼层
之前你不就发过一个类似的帖子吗  还没弄明白?

点评

没有啊,我现在就是想知道FFT的流程是怎么样的。。。实在没辙了!只能想着先把流程搞明白了,再继续慢慢编吧!!!  详情 回复 发表于 2016-6-27 15:50
 楼主| 发表于 2016-6-27 15:50 | 显示全部楼层
缱绻 发表于 2016-6-27 13:41
之前你不就发过一个类似的帖子吗  还没弄明白?

没有啊,我现在就是想知道FFT的流程是怎么样的。。。实在没辙了!只能想着先把流程搞明白了,再继续慢慢编吧!!!
发表于 2016-6-27 16:10 | 显示全部楼层
http://forum.vibunion.com/forum. ... 2&highlight=fft
是不是你发的???哈哈,有图有真相!
wxid_kpnygglfe5ou22_1467015053798_93.png

点评

是啊,但是上次的是源代码,我现在想知道流程。。。  详情 回复 发表于 2016-6-28 09:39
 楼主| 发表于 2016-6-28 09:39 | 显示全部楼层
缱绻 发表于 2016-6-27 16:10
http://forum.vibunion.com/forum.php?mod=viewthread&tid=146922&highlight=fft
是不是你发的???哈哈 ...

是啊,但是上次的是源代码,我现在想知道流程。。。

点评

你是学生?研究啥的?  详情 回复 发表于 2016-6-28 10:00
发表于 2016-6-28 10:00 | 显示全部楼层
ZH----过客 发表于 2016-6-28 09:39
是啊,但是上次的是源代码,我现在想知道流程。。。

你是学生?研究啥的?

点评

研究生?研几了?  详情 回复 发表于 2016-6-28 11:12
是啊,现在就是做信号处理这方面的。  详情 回复 发表于 2016-6-28 10:57
发表于 2016-6-28 10:01 | 显示全部楼层
  1. 时域抽取法FFT的C++实现。
  2.      下面是算法的流程图

  3.      倒序的流程图

  4. C++实现代码:
  5. 1. FFT.h
  6. #pragma once
  7. #ifndef FFT_H
  8. #define FFT_H
  9. #include <cstring>
  10. #include <cmath>
  11. using namespace std;
  12. #define pi 3.141592
  13. class FFT
  14. {
  15. private:
  16. void changeOrder(double* xr,double* xi,int n);
  17. public:
  18. FFT(void);
  19. void FFT_1D(double* ctxr,double* ctxi,double* cfxr,double* cfxi,int len);
  20. void rFFT_1D(double* ctxr,double* cfxr,double* cfxi,int len);
  21. void IFFT_1D(double* cfxr,double* cfxi,double* ctxr,double* ctxi,int len);
  22. void rIFFT_1D(double* cfxr,double* cfxi,double* ctxr,int len);
  23. ~FFT(void);
  24. };
  25. #endif
  26. 2.FFT.cpp
  27. #include ".fft.h"
  28. FFT::FFT()
  29. {
  30. }
  31. ///////////////////////////
  32. //倒序实现
  33. //xr实部,xi虚部,n为2的幂
  34. ///////////////////////////
  35. void FFT::changeOrder(double *xr,double *xi,int n)
  36. {
  37. double temp;
  38. int k;
  39. int lh=n/2;
  40. int j=lh;
  41. int n1=n-2;
  42. for(int i=1;i<=n1;i++)
  43. {
  44.   if(i<j)
  45.   {
  46.    temp=xr[i];
  47.    xr[i]=xr[j];
  48.    xr[j]=temp;
  49.    temp=xi[i];
  50.    xi[i]=xi[j];
  51.    xi[j]=temp;
  52.   }
  53.   k=lh;
  54.   while(j>=k)
  55.   {
  56.    j=j-k;
  57.    k=(int)(k/2+0.5);
  58.   }
  59.   j=j+k;
  60. }
  61. }
  62. //////////////////////////
  63. //复数FFT
  64. //ctxr和ctxi的长度为len
  65. //cfxr和cfxi的长度为2的幂
  66. //////////////////////////
  67. void FFT::FFT_1D(double *ctxr,double *ctxi,double *cfxr,double *cfxi,int len)
  68. {
  69. int m=ceil(log((double)len)/log(2.0));
  70. int l,b,j,p,k;
  71. double rkb,ikb;
  72. int n=1<<m;
  73. double* rcos=new double[n/2];
  74. double* isin=new double[n/2];
  75. for(l=0;l<n/2;l++)           
  76. {
  77.   rcos[l]=cos(l*pi*2/n);
  78.   isin[l]=sin(l*pi*2/n);
  79. }                           
  80. memcpy(cfxr,ctxr,sizeof(double)*len);
  81. memcpy(cfxi,ctxi,sizeof(double)*len);
  82. for(l=len;l<n;l++)
  83. {
  84.   cfxr[l]=0;
  85.   cfxi[l]=0;
  86. }
  87. changeOrder(cfxr,cfxi,n);  //倒序
  88. for(l=1;l<=m;l++)
  89. {
  90.   b=(int)(pow(2,l-1)+0.5);
  91.   for(j=0;j<b;j++)
  92.   {
  93.    p=j*(int)(pow(2,m-l)+0.5);
  94.    for(k=j;k<n;k+=(int)(pow(2,l)+0.5))
  95.    {
  96.     rkb=cfxr[k+b]*rcos[p]+cfxi[k+b]*isin[p];
  97.     ikb=cfxi[k+b]*rcos[p]-cfxr[k+b]*isin[p];
  98.     cfxr[k+b]=cfxr[k]-rkb;
  99.     cfxi[k+b]=cfxi[k]-ikb;
  100.     cfxr[k]=cfxr[k]+rkb;
  101.     cfxi[k]=cfxi[k]+ikb;
  102.    }
  103.   }
  104. }
  105. delete []rcos;
  106. delete []isin;
  107. }
  108. /////////////////////////////
  109. //实数FFT
  110. //ctxr的长度为len
  111. //cfxr和cfxi的长度为2的幂
  112. ////////////////////////////
  113. void FFT::rFFT_1D(double *ctxr,double *cfxr,double *cfxi,int len)
  114. {
  115. int m=ceil(log((double)len)/log(2.0));
  116. int n=1<<m;
  117. double* rcos=new double[n/2];
  118. double* isin=new double[n/2];
  119. for(int l=0;l<n/2;l++)         
  120. {
  121.   rcos[l]=cos(l*pi*2/n);
  122.   isin[l]=sin(l*pi*2/n);
  123. }   
  124. double* txr=new double[(len+1)/2];
  125. double* txi=new double[(len+1)/2];
  126. for(int i=0;i<len/2;i++)
  127. {
  128.   txr[i]=ctxr[i*2];
  129.   txi[i]=ctxr[i*2+1];
  130. }
  131. if(len%2==1)
  132. {
  133.   txr[(len-1)/2]=ctxr[len-1];
  134.   txi[(len-1)/2]=0;
  135. }
  136. FFT_1D(txr,txi,cfxr,cfxi,(len+1)/2);
  137. double* x1r=new double[n/2];
  138. double* x1i=new double[n/2];
  139. double* x2r=new double[n/2];
  140. double* x2i=new double[n/2];
  141. x1r[0]=cfxr[0];
  142. x1i[0]=0;
  143. x2r[0]=cfxi[0];
  144. x2i[0]=0;
  145. for(int k=1;k<n/2;k++)
  146. {
  147.   x1r[k]=(cfxr[k]+cfxr[n/2-k])/2.0;
  148.   x1i[k]=(cfxi[k]-cfxi[n/2-k])/2.0;
  149.   x2r[k]=(cfxi[k]+cfxi[n/2-k])/2.0;
  150.   x2i[k]=(-cfxr[k]+cfxr[n/2-k])/2.0;
  151. }
  152. double rkb,ikb;
  153. for(i=0;i<n/2;i++)
  154. {
  155.   rkb=x2r[i]*rcos[i]+x2i[i]*isin[i];
  156.   ikb=x2i[i]*rcos[i]-x2r[i]*isin[i];
  157.   cfxr[i+n/2]=x1r[i]-rkb;
  158.   cfxi[i+n/2]=x1i[i]-ikb;
  159.   cfxr[i]=x1r[i]+rkb;
  160.   cfxi[i]=x1i[i]+ikb;
  161. }
  162. delete []txr;
  163. delete []txi;
  164. delete []x1r;
  165. delete []x1i;
  166. delete []x2r;
  167. delete []x2i;
  168. delete []rcos;
  169. delete []isin;
  170. }
  171. ///////////////////////////////
  172. //复数IFFT
  173. //cfxr和cfxi的长度为n(2的幂)
  174. //ctxr和ctxi的长度为len
  175. ///////////////////////////////
  176. void FFT::IFFT_1D(double *cfxr,double *cfxi,double *ctxr,double *ctxi,int len)
  177. {
  178. int m=ceil(log((double)len)/log(2.0));
  179. int n=1<<m;
  180. double* txr=new double[n];
  181. double* txi=new double[n];
  182. for(int i=0;i<n;i++)
  183.   cfxi[i]=-cfxi[i];
  184. FFT_1D(cfxr,cfxi,txr,txi,n);
  185. for(i=0;i<len;i++)
  186. {
  187.   ctxr[i]=txr[i]/n;
  188.   ctxi[i]=-txi[i]/n;
  189. }
  190. delete []txr;
  191. delete []txi;
  192. }
  193. //////////////////////////////
  194. //实数IFFT
  195. //cfxr和cfxi的长度为n(2的幂)
  196. //ctxr的长度为len
  197. //////////////////////////////
  198. void FFT::rIFFT_1D(double *cfxr,double *cfxi,double *ctxr,int len)
  199. {
  200. int m=ceil(log((double)len)/log(2.0));
  201. int n=1<<m;
  202. double* txr=new double[n];
  203. double* txi=new double[n];
  204. for(int i=0;i<n;i++)
  205.   cfxi[i]=-cfxi[i];
  206. FFT_1D(cfxr,cfxi,txr,txi,n);
  207. for(int i=0;i<len;i++)
  208. {
  209.   ctxr[i]=txr[i]/n;
  210. }
  211. delete []txr;
  212. delete []txi;
  213. }
  214. FFT::~FFT(void)
  215. {
  216. }
  217. 3.test.cpp
  218. #include <iostream>
  219. #include "FFT.h"
  220. using namespace std;
  221. void main()
  222. {
  223. double xr[10]={1,2,3,4,5,6,7,8,9,10};   //实部
  224. double xi[10]={0,0,0,0,0,0,0,0,0,0};    //虚部
  225. double *cxr,*cxi;
  226. cxr=new double[16];
  227. cxi=new double[16];
  228. FFT f;
  229. f.rFFT_1D(xr,cxr,cxi,10);
  230. for(int i=0;i<16;i++)
  231. {
  232.   cout<<cxr[i]<<"+j"<<cxi[i];
  233.   cout<<endl;
  234. }
  235. cout<<endl;
  236. double *fxr,*fxi;
  237. fxr=new double[10];
  238. fxi=new double[10];
  239. f.rIFFT_1D(cxr,cxi,fxr,10);
  240. for(i=0;i<10;i++)
  241. {
  242.   cout<<fxr[i];
  243.   cout<<endl;
  244. }
  245. delete []fxr;
  246. delete []fxi;
  247. delete []cxr;
  248. delete []cxi;

  249. }
复制代码


点评

谢谢!!!  详情 回复 发表于 2016-6-28 10:58
 楼主| 发表于 2016-6-28 10:57 | 显示全部楼层
缱绻 发表于 2016-6-28 10:00
你是学生?研究啥的?

是啊,现在就是做信号处理这方面的。
 楼主| 发表于 2016-6-28 10:58 | 显示全部楼层
发表于 2016-6-28 11:12 | 显示全部楼层
缱绻 发表于 2016-6-28 10:00
你是学生?研究啥的?

研究生?研几了?

点评

现在研一啊!!!你是上班了???  详情 回复 发表于 2016-6-28 13:47
 楼主| 发表于 2016-6-28 13:47 | 显示全部楼层
缱绻 发表于 2016-6-28 11:12
研究生?研几了?

现在研一啊!!!你是上班了???

点评

我大二。。。  详情 回复 发表于 2016-6-28 14:04
发表于 2016-6-28 14:04 | 显示全部楼层
ZH----过客 发表于 2016-6-28 13:47
现在研一啊!!!你是上班了???

我大二。。。

点评

你接触的挺早啊。。。在哪上学啊???  详情 回复 发表于 2016-6-28 14:24
 楼主| 发表于 2016-6-28 14:24 | 显示全部楼层

你接触的挺早啊。。。在哪上学啊???

点评

谈不上接触 就是比较感兴趣  详情 回复 发表于 2016-6-28 14:44
发表于 2016-6-28 14:44 | 显示全部楼层
ZH----过客 发表于 2016-6-28 14:24
你接触的挺早啊。。。在哪上学啊???

谈不上接触  就是比较感兴趣

点评

你的专业是什么啊,如果感兴趣的话可以多学学Matlab和c#还有scada!!!以后工作应该会用到!!!都是在一起用的。  详情 回复 发表于 2016-6-28 14:50
 楼主| 发表于 2016-6-28 14:50 | 显示全部楼层
缱绻 发表于 2016-6-28 14:44
谈不上接触  就是比较感兴趣

你的专业是什么啊,如果感兴趣的话可以多学学Matlab和c#还有scada!!!以后工作应该会用到!!!都是在一起用的。

点评

好的 谢谢学哥指导 以后有问题还可以像你请教  详情 回复 发表于 2016-6-28 15:00
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-17 07:04 , Processed in 0.147980 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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