C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 자료실
C++Builder Programming Resources
[328] 1차원 FFT 코드(C++Builder).
제갈식 [] 12649 읽음    2006-12-18 16:18
영상과 같은 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);
  }
}

+ -

관련 글 리스트
328 1차원 FFT 코드(C++Builder). 제갈식 12649 2006/12/18
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.