📄 1024_ifft.cpp
字号:
// 1024_ifft.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <math.h>
#include <stdio.h>
#include <iostream.h>
#define N 4
//void Fft(double xr[],double xi[],int N,int M);
//void ChangeOrder(double xr[],double xi[],int N);
void ChangeOrder(double xr[],double xi[]) // FFT前倒序
{
int LH,N1,i,J,K;
double T;
LH=N/2;J=LH;N1=N-2;
for(i=1;i<=N1;i++)
{
if(i<J)
{
T=xr[i];xr[i]=xr[J];xr[J]=T;
T=xi[i];xi[i]=xi[J];xi[J]=T;
}
K=LH;
while(J>=K) //最高位为1
{
J=J-K; // 置零
K=(int)(K/2+0.5); //次高位
}
J=J+K;
}
}
void ifft(double xr[],double xi[]) //xr为实部,xi为虚部
{
int L,B,J,P,k,i,n;
double rPartKB,iPartKB;
double rCf[N],iCf[N];
double PI2=8.0*atan(1.0); // 2*pi
int M;
M=int(log(N)/log(2));
for(i=0;i<N;i++)
{
rCf[i]=cos(i*PI2/N); //旋转因子W
iCf[i]=-sin(i*PI2/N);
}
ChangeOrder(xr,xi);
for(L=1;L<=M;L++) // L级运算
{
B=(int)(pow(2,(L-1))+0.5); //蝶形运算的两个输入数据相距B点
for(J=0;J<=B-1;J++)
{
P=J*((int)(pow(2,(M-L))+0.5));
for(k=J;k<=N-1;k+=(int)(pow(2,L)+0.5))
{
rPartKB=xr[k+B]*rCf[P]+xi[k+B]*iCf[P];
iPartKB=xi[k+B]*rCf[P]-xr[k+B]*iCf[P];
xr[k+B]=xr[k]-rPartKB;
xi[k+B]=xi[k]-iPartKB;
xr[k]=xr[k]+rPartKB;
xi[k]=xi[k]+iPartKB;
}
}
}
for(n=0;n<N;n++)
{
xr[n]=xr[n]/N;
xi[n]=xi[n]/N;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -