더북(TheBook)

소스 10-2는 이산 푸리에 변환 수식을 그대로 C/C++ 형태로 변환한 DFT1d 함수의 정의를 보여준다. 이 함수는 IppFourier.cpp 파일에 작성하도록 하자.

소스 10-2 1차원 데이터에 대한 DFT 구현 함수(IppFourier.cpp)
#include "StdAfx.h"
#include "IppFourier.h"

#include  <math.h>

const double PI = 3.14159265358979323846;

void DFT1d(double* re, double* im, int N, int dir)
{
    double* tr = new double[N];
    double* ti = new double[N];
    memcpy(tr, re, sizeof(double) * N);
    memcpy(ti, im, sizeof(double) * N);

    register int i, x;
    double sum_re, sum_im, temp;

    for (i = 0; i < N; i++)
    {
        sum_re = sum_im = 0;
  
        for (x = 0; x < N; x++)
        {
            temp = 2 * dir * PI * ((double)i * x / N);

            sum_re += (tr[x] * cos(temp) + ti[x] * sin(temp));
            sum_im += (ti[x] * cos(temp) - tr[x] * sin(temp));
        }

        re[i] = sum_re;
        im[i] = sum_im;
    }
  
    if (dir == -1) // IDFT
    {
        for (i = 0; i < N; i++)
        {
            re[i] /= (double)N;
            im[i] /= (double)N;
        }
    }

    delete[] tr;
    delete[] ti;
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.