【VC开源代码栏目提醒】:网学会员,鉴于大家对VC开源代码十分关注,论文会员在此为大家搜集整理了“Analysis.cpp”一文,供大家参考学习!
///////////////////////////////////////////////////////////
//
// 类说明:
// 1。DFT_FFT() 离散快速傅立叶变换
// 2。DFT_IFFT() 离散快速傅立叶逆变换
// 3。ReverseOrder() 倒序函数
//
///////////////////////////////////////////////////////////
// Analysis.cpp : implementation file
//
#include "stdafx.h"
#include "TEMMS.h"
#include "Analysis.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAnalysis
CAnalysis::CAnalysis()
{
}
CAnalysis::~CAnalysis()
{
}
BEGIN_MESSAGE_MAP(CAnalysis, CWnd)
//{{AFX_MSG_MAP(CAnalysis)
// NOTE - the ClassWizard will add and remove mapping macros here.
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAnalysis message handlers
////////////////////////////////////////////////////
// 倒序函数 //
////////////////////////////////////////////////////
void CAnalysis::ReverseOrder(Complex *A, int N)
{
int NV2=N/2;
int NM1=N-1;
int I,J,K=0;
Complex T;
I=J=1;
while(I<=NM1)
{
if(I<J)
{
T=A[J-1];
A[J-1]=A[I-1];
A[I-1]=T;
}
K=NV2;
while(K<J)
{
J-=K;
K/=2;
}
J+=K;
I++;
}
}
////////////////////////////////////////////////////
// 时间抽选奇偶分解快速离散傅立叶变换 //
////////////////////////////////////////////////////
void CAnalysis::DFT_FFT(Complex *A, int M)
{
int N=(int)pow(2,M);
ReverseOrder(A,N);
for(int i=1;i<=M;i++)
{
int b=(int)pow(2,(i-1));
for(int j=0;j<=(b-1);j++)
{
float p=(float)(pow(2,(M-i))*j*2.0*PI/(float)N);
for(int k=j;k<=(N-1);)
{
float tr=(float)(A[k+b].Re*cos(p)+A[k+b].Im*sin(p));
float ti=(float)(A[k+b].Im*cos(p)-A[k+b].Re*sin(p));
A[k+b].Re=A[k].Re-tr;
A[k+b].Im=A[k].Im-ti;
A[k].Re+=tr;
A[k].Im+=ti;
k+=b*2;
}
}
}
}
////////////////////////////////////////////////////
// 快速傅立叶逆变换 //
////////////////////////////////////////////////////
void CAnalysis::DFT_IFFT(Complex *A, int M)
{
int N=(int)pow(2,M);
ReverseOrder(A,N);
for(int i=1;i<=M;i++)
{
int b=(int)pow(2,(i-1));
for(int j=0;j<=(b-1);j++)
{
float p=(float)(pow(2,(M-i))*j*2.0*PI/(float)N);
for(int k=j;k<=(N-1);)
{
float tr=(float)(A[k+b].Re*cos(p)-A[k+b].Im*sin(p));
float ti=(float)(A[k+b].Im*cos(p)+A[k+b].Re*sin(p));
A[k+b].Re=A[k].Re-tr;
A[k+b].Im=A[k].Im-ti;
A[k].Re+=tr;
A[k].Im+=ti;
k+=b*2;
}
}
}
for(i=0;i<N;i++)
{
A[i].Re/=N;
A[i].Im/=N;
}
}
上一篇:
AMMOSTATUS.CPP
下一篇:
高中政治教学中情境创设的尝试和思考