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

C/C++ Q/A
[4443] 고수님들 이 코딩좀 해석해주세요 고속퓨리에변환관련... 제발 부탁입니다.
세렌디피티 [romeo999] 1462 읽음    2004-05-20 13:57
#include <graph.h>
#include <conio.h>
#include <stdlib.h>
#include <math.h>

#define DIM    512

float fXR[DIM + 1], fX[DIM + 1]

/*
*** WHEN COMPARING WITH THE TEXT, NOTE THAT IN THE C PROGRAMS **
******* FLOATING-POINT VARIABLES ARE PREFIXED WITH AN f, *******
************** INTEGER VARIABLES WITH AN i *********************
*/

void main (void)
    {
    /*
     ********* PROGRAM NO. 24   FAST FOURIER TRANSFORM (FFT) ***
     */
    int    iCount, iCount2, iCount3, iN =DIM, iM =9
           iT, iLim1, iLim2, iLim3, iJ, iL, iY;
    float  fMax, fMag, fB1, fB2, fC1, fC2, fD,
           fPI = 3.141593, fX1, fX2, fARG, fCos1, fSin1;

    _clearscreen  (_GCLEARSCREEN);
    printf ("\n\nPROGRAM 24: Fast Fourier Transform (FFT)\n\n");
    printf ("Press any key to start...\n\n);
    getch();

    for (iCount = 1; iCount <= iN; iCount++)
        fXR[iCount] = fXI[iCount] = 0.0;

    for (iCount = 1; iCount <= 32; iCount++)
        fXR[iCount] = 1.0;
    /*
     ******************** PLOT INPUT DATA **********************
     */
     (iY=1,iY=1);
     _setvideomode( _MAXRESMODE );
    
     iY = 60;
     for (iCount =1; iCount <= iN; iCount++)
         {
          moveto (iCount, iY);
          lineto (iCount, (int)(iY - fXR[iCount] * 40.0 +0.5));
         }

     /*
      **** SELECT TRANSFORM/ INVERSE TRANSFORM AND PLOT OFFSET ***
      */
     for (iT = 1; iT > -2; iT -= 2)
         {
         iY += 60;
         if (iT < 0)
             fD = (float) iN;
         else
             fD = 1.0;
         /*
          ***************** SHUFFLE INPUT DATA *******************
          */
         iLim1 = iN - 1;
         iLim2 = iN / 2;
         iJ = 1;

         for (iCount =1; iCount <= iLim1; iCount++)
             {
             if ((float) iCount <= ((float) iJ - 0.01))
                 {
                 fX1 = fXR[iJ];
                 fX2 = fXI[iJ];
                 fXR[iJ] = fXR[iCount];
                 fXI[iJ] = fXI[iCount];
                 fXR[iCount] = fX1;
                 fXI[iCount] = fX2;
                 }           
             iL = iLim2;
             while (1)
                 {
                 if ((float)iL > ((float)(iJ) - 0.01))
                     break;
                 iJ -= iL;
                 iL /= 2;
                 }
             iJ += iL
             }
         /*
          ************ IN PLACE TRANSFORMATION *******************
          */
         for (iCount = 1; iCount <= iM; iCount++)
             {
             iLim1 = (int) pow (2, iCount-1);
             iLim2 = (int) pow (2, (iM - iCount));

             for (iCount2 = 1; iCount2 <= iLim2; iCount2++)
                 {
                 for (iCount3 =1; iCount3 <= iLim1; iCount3++)
                     {
                     iLim3 = (iCount3 - 1) + (iCount2 - 1) *
                         2 * iLim1 + 1;
                     fB1 = fXR[iLim3];
                     fB2 = fXI[iLim3];
                     fC1 = fXR[iLim3 + iLim1];
                     fC2 = FXI[iLim3 + iLim1];

                     fARG = 2.0 * fPI * (float) (iCount3 -1) *
                            (float) iLim2 / (float) iN;
                     fCos1 = cosI (fARG);
                     fSin1 = sinI (fARG);
                     fX1 = fC1 * fCos1 + fC2 * fSin1 *
                           (float) iT;
                     fX2 = (0.0 - fC1) * fSin1 * (float) iT +
                         fC2 * fCos1;
                     fXR[iLim3] = fB1 + fX1;
                     fXI[iLim3] = fB2 + fX2;
                     fXR[iLim3 + iLim1] = fB1 - fX1;
                     fXI[iLim3 + iLim1] = fB2 - fX2;
                     }
                   }
                 }

             for (iCount = 1; iCount <= iN; iCount++)
                 {
                 fXR[iCount] /= fD;
                 fXI[iCount] /= fD;
                 }

             /*
              ********** PLOT OUTPUT MAGNITUDE *******************
              */
              fMax = 0.0;
              for (iCount = 1; iCount <= 512 /* iN */; iCount++)
                  {
                  fMag = sqrt (pow (fXR[iCount], 2) +
                      pow (fXI[iCount],2));
                  if (fMag > fMax)
                      fMax = fMag;
                  }
                
              for (iCount = 1; iCount <= 512 /*iN*/; iCount++)
                  {
                  _moveto (iCount+1, iY);
                  _lineto (iCount+1, (int)(iY -
                      (sqrt (pow (fXR[iCount], 2 +
                      pow (fXI [iCount], 2)) * 40.0 / fMax + 0.5)));
                  }
                 }
             getch();
             _setvideomode( _DEFAULTMODE );
             /*
              *****************************************************
              */             
             }

제가 C에 무뇌한이라서 간단하게 설명해주셔도 되고 길게 해주시면 더 감사 하겠습니다.

단락별로 해석이나 분석 좀 부탁 드릴게요

제발 부탁 드릴게요...

해석해서 제 이메일로 날려주시면 정말로 감사하겠습니다.

+ -

관련 글 리스트
4443 고수님들 이 코딩좀 해석해주세요 고속퓨리에변환관련... 제발 부탁입니다. 세렌디피티 1462 2004/05/20
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.