fft2.txt

来自「快速付里叶变换子程序所需 RAM 空间以输入的首地址为基址,向增加的方向扩展」· 文本 代码 · 共 70 行

TXT
70
字号
/* fftdi.c: fast Fourier transform, direct and inverse              */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int inverseq( int i1, int imax );
extern void f(double tt, double fri[2] );
void creata( double a, double b, double A[2][N] );
void creata( double a, double b, double A[2][N] )
{
int i;
double tt,fri[2],deltat;
deltat=(b-a)/N;
for(i=0;i<N;i++)
  {
  tt=a+i*deltat;
  f( tt, fri );
  A[0][i]=fri[0]*deltat;
  A[1][i]=fri[1]*deltat;
  }
}
/********************************************************************/
void fftdi( int sign, double A[2][N], double x[2][N] )
{
int i,j,i0,ii,iloop,step[M],loop[M],least,jstep,reseq;
double pi,unit,alpha,w[2],ar,ai;
if( sign == 1 )
    for(i=0;i<N;i++)  { A[0][i]=x[0][i]; A[1][i]=x[1][i]; }
step[0]=N/2;
loop[0]=1;
pi=4.0*atan(1.0);
unit=pi*2.0/((double)N);
for(i=1;i<M;i++)  { step[i]=step[i-1]/2; loop[i]=loop[i-1]*2; }
for(i=0;i<M;i++)
  {
  for(iloop=0;iloop<loop[i];iloop++)
    {
    reseq=inverseq(iloop,i);
    alpha=unit*step[i]*reseq;
    least=2*step[i]*iloop;
    w[0]=cos(alpha);
    w[1]=sign*sin(alpha);
    for(j=0;j<step[i];j++)
      {
      jstep=least+step[i]+j;
      ar=A[0][jstep]*w[0]-A[1][jstep]*w[1];
      ai=A[0][jstep]*w[1]+A[1][jstep]*w[0];
      A[0][jstep]=A[0][least+j]-ar;
      A[1][jstep]=A[1][least+j]-ai;
      A[0][least+j]=A[0][least+j]+ar;
      A[1][least+j]=A[1][least+j]+ai;
      }
    }
  }
for(i=0;i<N;i++)
  { j=inverseq(i,M);  x[0][i]=A[0][j];  x[1][i]=A[1][j]; }
if( sign == 1 )
  for(i=0;i<N;i++)
    { A[0][i]=x[0][i]/((double)N); A[1][i]=x[1][i]/((double)N); }
}
/********************************************************************/
int inverseq( int i1, int imax )
{
int i,j,ii,i0,inv;
i0=i1;  inv=0;
for(j=0;j<imax;j++)
  { ii=i0%2; inv=2*inv+ii; i0=(i0-ii)/2; }
return(inv);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?