快速傅里叶变换的基本原理由于公式不好显示请读者参考其它文章或书籍,本文重点给出了时域抽取法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[i];
xr[i]=xr[j];
xr[j]=temp;