ZH----过客 发表于 2016-6-27 10:15

谁知道FFT源代码的流程图???

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

缱绻 发表于 2016-6-27 13:41

之前你不就发过一个类似的帖子吗还没弄明白?

ZH----过客 发表于 2016-6-27 15:50

缱绻 发表于 2016-6-27 13:41
之前你不就发过一个类似的帖子吗还没弄明白?

没有啊,我现在就是想知道FFT的流程是怎么样的。。。实在没辙了!只能想着先把流程搞明白了,再继续慢慢编吧!!!

缱绻 发表于 2016-6-27 16:10

http://forum.vibunion.com/forum.php?mod=viewthread&tid=146922&highlight=fft
是不是你发的???哈哈,有图有真相!


ZH----过客 发表于 2016-6-28 09:39

缱绻 发表于 2016-6-27 16:10
http://forum.vibunion.com/forum.php?mod=viewthread&tid=146922&highlight=fft
是不是你发的???哈哈 ...

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

缱绻 发表于 2016-6-28 10:00

ZH----过客 发表于 2016-6-28 09:39
是啊,但是上次的是源代码,我现在想知道流程。。。

你是学生?研究啥的?

think2015 发表于 2016-6-28 10:01

时域抽取法FFT的C++实现。
   下面是算法的流程图

   倒序的流程图

C++实现代码:
1. FFT.h
#pragma once
#ifndef FFT_H
#define FFT_H
#include <cstring>
#include <cmath>
using namespace std;
#define pi 3.141592
class FFT
{
private:
void changeOrder(double* xr,double* xi,int n);
public:
FFT(void);
void FFT_1D(double* ctxr,double* ctxi,double* cfxr,double* cfxi,int len);
void rFFT_1D(double* ctxr,double* cfxr,double* cfxi,int len);
void IFFT_1D(double* cfxr,double* cfxi,double* ctxr,double* ctxi,int len);
void rIFFT_1D(double* cfxr,double* cfxi,double* ctxr,int len);
~FFT(void);
};
#endif
2.FFT.cpp
#include ".fft.h"
FFT::FFT()
{
}
///////////////////////////
//倒序实现
//xr实部,xi虚部,n为2的幂
///////////////////////////
void FFT::changeOrder(double *xr,double *xi,int n)
{
double temp;
int k;
int lh=n/2;
int j=lh;
int n1=n-2;
for(int i=1;i<=n1;i++)
{
if(i<j)
{
   temp=xr;
   xr=xr;
   xr=temp;
   temp=xi;
   xi=xi;
   xi=temp;
}
k=lh;
while(j>=k)
{
   j=j-k;
   k=(int)(k/2+0.5);
}
j=j+k;
}
}
//////////////////////////
//复数FFT
//ctxr和ctxi的长度为len
//cfxr和cfxi的长度为2的幂
//////////////////////////
void FFT::FFT_1D(double *ctxr,double *ctxi,double *cfxr,double *cfxi,int len)
{
int m=ceil(log((double)len)/log(2.0));
int l,b,j,p,k;
double rkb,ikb;
int n=1<<m;
double* rcos=new double;
double* isin=new double;
for(l=0;l<n/2;l++)         
{
rcos=cos(l*pi*2/n);
isin=sin(l*pi*2/n);
}                           
memcpy(cfxr,ctxr,sizeof(double)*len);
memcpy(cfxi,ctxi,sizeof(double)*len);
for(l=len;l<n;l++)
{
cfxr=0;
cfxi=0;
}
changeOrder(cfxr,cfxi,n);//倒序
for(l=1;l<=m;l++)
{
b=(int)(pow(2,l-1)+0.5);
for(j=0;j<b;j++)
{
   p=j*(int)(pow(2,m-l)+0.5);
   for(k=j;k<n;k+=(int)(pow(2,l)+0.5))
   {
    rkb=cfxr*rcos+cfxi*isin;
    ikb=cfxi*rcos-cfxr*isin;
    cfxr=cfxr-rkb;
    cfxi=cfxi-ikb;
    cfxr=cfxr+rkb;
    cfxi=cfxi+ikb;
   }
}
}
delete []rcos;
delete []isin;
}
/////////////////////////////
//实数FFT
//ctxr的长度为len
//cfxr和cfxi的长度为2的幂
////////////////////////////
void FFT::rFFT_1D(double *ctxr,double *cfxr,double *cfxi,int len)
{
int m=ceil(log((double)len)/log(2.0));
int n=1<<m;
double* rcos=new double;
double* isin=new double;
for(int l=0;l<n/2;l++)         
{
rcos=cos(l*pi*2/n);
isin=sin(l*pi*2/n);
}   
double* txr=new double[(len+1)/2];
double* txi=new double[(len+1)/2];
for(int i=0;i<len/2;i++)
{
txr=ctxr;
txi=ctxr;
}
if(len%2==1)
{
txr[(len-1)/2]=ctxr;
txi[(len-1)/2]=0;
}
FFT_1D(txr,txi,cfxr,cfxi,(len+1)/2);
double* x1r=new double;
double* x1i=new double;
double* x2r=new double;
double* x2i=new double;
x1r=cfxr;
x1i=0;
x2r=cfxi;
x2i=0;
for(int k=1;k<n/2;k++)
{
x1r=(cfxr+cfxr)/2.0;
x1i=(cfxi-cfxi)/2.0;
x2r=(cfxi+cfxi)/2.0;
x2i=(-cfxr+cfxr)/2.0;
}
double rkb,ikb;
for(i=0;i<n/2;i++)
{
rkb=x2r*rcos+x2i*isin;
ikb=x2i*rcos-x2r*isin;
cfxr=x1r-rkb;
cfxi=x1i-ikb;
cfxr=x1r+rkb;
cfxi=x1i+ikb;
}
delete []txr;
delete []txi;
delete []x1r;
delete []x1i;
delete []x2r;
delete []x2i;
delete []rcos;
delete []isin;
}
///////////////////////////////
//复数IFFT
//cfxr和cfxi的长度为n(2的幂)
//ctxr和ctxi的长度为len
///////////////////////////////
void FFT::IFFT_1D(double *cfxr,double *cfxi,double *ctxr,double *ctxi,int len)
{
int m=ceil(log((double)len)/log(2.0));
int n=1<<m;
double* txr=new double;
double* txi=new double;
for(int i=0;i<n;i++)
cfxi=-cfxi;
FFT_1D(cfxr,cfxi,txr,txi,n);
for(i=0;i<len;i++)
{
ctxr=txr/n;
ctxi=-txi/n;
}
delete []txr;
delete []txi;
}
//////////////////////////////
//实数IFFT
//cfxr和cfxi的长度为n(2的幂)
//ctxr的长度为len
//////////////////////////////
void FFT::rIFFT_1D(double *cfxr,double *cfxi,double *ctxr,int len)
{
int m=ceil(log((double)len)/log(2.0));
int n=1<<m;
double* txr=new double;
double* txi=new double;
for(int i=0;i<n;i++)
cfxi=-cfxi;
FFT_1D(cfxr,cfxi,txr,txi,n);
for(int i=0;i<len;i++)
{
ctxr=txr/n;
}
delete []txr;
delete []txi;
}
FFT::~FFT(void)
{
}
3.test.cpp
#include <iostream>
#include "FFT.h"
using namespace std;
void main()
{
double xr={1,2,3,4,5,6,7,8,9,10};   //实部
double xi={0,0,0,0,0,0,0,0,0,0};    //虚部
double *cxr,*cxi;
cxr=new double;
cxi=new double;
FFT f;
f.rFFT_1D(xr,cxr,cxi,10);
for(int i=0;i<16;i++)
{
cout<<cxr<<"+j"<<cxi;
cout<<endl;
}
cout<<endl;
double *fxr,*fxi;
fxr=new double;
fxi=new double;
f.rIFFT_1D(cxr,cxi,fxr,10);
for(i=0;i<10;i++)
{
cout<<fxr;
cout<<endl;
}
delete []fxr;
delete []fxi;
delete []cxr;
delete []cxi;

}

ZH----过客 发表于 2016-6-28 10:57

缱绻 发表于 2016-6-28 10:00
你是学生?研究啥的?

是啊,现在就是做信号处理这方面的。

ZH----过客 发表于 2016-6-28 10:58

think2015 发表于 2016-6-28 10:01


谢谢!!!{:{39}:}

缱绻 发表于 2016-6-28 11:12

缱绻 发表于 2016-6-28 10:00
你是学生?研究啥的?

研究生?研几了?

ZH----过客 发表于 2016-6-28 13:47

缱绻 发表于 2016-6-28 11:12
研究生?研几了?

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

缱绻 发表于 2016-6-28 14:04

ZH----过客 发表于 2016-6-28 13:47
现在研一啊!!!你是上班了???

我大二。。。

ZH----过客 发表于 2016-6-28 14:24

缱绻 发表于 2016-6-28 14:04
我大二。。。

{:4_63:}你接触的挺早啊。。。在哪上学啊???

缱绻 发表于 2016-6-28 14:44

ZH----过客 发表于 2016-6-28 14:24
你接触的挺早啊。。。在哪上学啊???

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

ZH----过客 发表于 2016-6-28 14:50

缱绻 发表于 2016-6-28 14:44
谈不上接触就是比较感兴趣

你的专业是什么啊,如果感兴趣的话可以多学学Matlab和c#还有scada!!!以后工作应该会用到!!!都是在一起用的。
页: [1] 2
查看完整版本: 谁知道FFT源代码的流程图???