영상과 같은 2 차원 FFT 변환은 1 차원 FFT를 수평 슬라이스별로 수행한 후 수직에 또 1 차원 FFT 해 얻을 수 있습니다.
항상 도움만 얻고있는데, 작은 기여라도 하려고 코드를 올려봅니다.
본 코드는 VC++ 코드를 본인이 BCB버전으로 수정한 것입니다.
더 자세한 내용은 에 해주세요.
http://hal9000.mireene.com/bbs/zboard.php?id=transform
//FFT Header
public: // User declarations
__fastcall TForm1(TComponent* Owner);
void __fastcall fft(float *fr, float *fi, int LN, int numpoints, int dir);
void __fastcall scramble(int numpoints, float *fr, float *fi);
void __fastcall butterflies(int numpoints, int LN, int dir, float *fre, float *fim);
};
// Scramble() -------------------------------------------
void __fastcall TForm1::scramble(int numpoints, float *fr, float *fi)
{
int i,j,m;
float temp;
j=0;
for(int i=0;i<numpoints; i++)
{
if(i>j)
{
//swap real
temp=fr[j];
fr[j]=fr[i];
fr[i]=temp;
//swap imagenary
temp=fi[j];
fi[j]=fi[i];
fi[i]=temp;
}
m=numpoints >> 1;
while((j>=m)&&(m>=2))
{
j=j-m;
m=m >> 1;
}
j=j+m;
}
}
// Butterfly() --------------------------------------------
void __fastcall TForm1::butterflies(int numpoints, int LN, int dir, float *fre, float *fim)
{
double angle;
float wre, wim, wpre, wpim;
float tempre, tempim;
int i, j;
int N, half_N;
double wtemp;
N=1;
for(int k=0; k<LN; k++)
{
half_N=N;
N=(N<<1);
angle=-2.0*3.141593/N*dir;
wtemp=sin(0.5*angle);
wpre=(-2.0*wtemp*wtemp);
wpim=sin(angle);
wre=1.0;
wim=0.0;
for(int offset=0; offset<half_N; offset++)
{
i=offset;
while(i<numpoints)
{
j=i+half_N;
tempre=(wre*fre[j])-(wim*fim[j]);
tempim=(wim*fre[j])+(wre*fim[j]);
fre[j]=fre[i]-tempre;
fre[i]=fre[i]+tempre;
fim[j]=fim[i]-tempim;
fim[i]=fim[i]+tempim;
i=i+N;
} //while
wtemp=wre;
wre=(wtemp*wpre-wim*wpim+wre);
wim=(wim*wpre+wtemp*wpim+wim);
} // for offset
} // for k
if (dir=-1)
{
for(int i=0;i<numpoints; i++ )
{
fre[i] =fre[i] /numpoints;
fim[i] =fim[i] /numpoints;
} // for
} // if
}
// FFT Main ------------------------------------------------
void __fastcall TForm1::fft(float *fr, float *fi, int LN, int numpoints, int dir)
{
scramble(numpoints, fr, fi);
butterflies(numpoints, LN, dir, fr, fi);
}
// Call Example -----------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
Randomize();
float d_re[256], d_im[256];
for (int i=0; i<256 ;i++)
{
d_re[i]=256*sin(i/10);
d_im[i]=0;
}
fft(d_re, d_im, 8, 256, 1); //
int mag;
for (int i=0; i<256 ;i++)
{
mag=abs(d_re[i])+abs(d_im[i]);
// To Graph Control Plotting
Series1->AddXY(i, mag);
}
}