⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 1024_ifft.cpp

📁 该程序是DVB-T系统的1024点的FFT 与 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 + -