더북(TheBook)

2차원 영상의 행과 열을 분리하여 이산 푸리에 변환을 하는 함수 DFTRC의 구현을 소스 10-5에 나타내었다. 이 함수는 DFT 함수와 마찬가지로 정수형 인자 dir을 하나 받으며, 이 인자는 이산 푸리에 변환의 방향을 나타낸다. 즉, dir 값이 +1이면 순방향 이산 푸리에 변환을 하고, -1의 값을 넘겨주면 이산 푸리에 역변환을 수행한다. 이산 푸리에 변환된 결과는 멤버 변수인 realimag에 각각 저장된다. DFTRC 함수의 수행 결과는 DFT 함수의 결과와 완전히 동일하지만, 연산 속도는 DFT 함수에 비해 상당히 빠르다.

소스 10-5 DFTRC 구현 함수(IppFourier.cpp)
void IppFourier::DFTRC(int dir)
{
    if (!real.IsValid())
    return;

    //-------------------------------------------------------------------------
    // 행(Row) 단위 이산 푸리에 변환 (또는 역변환)
    //-------------------------------------------------------------------------
  
    IppDoubleImage real_tmp, imag_tmp;

    real_tmp.CreateImage(width, 1);
    imag_tmp.CreateImage(width, 1);

    double* re = real_tmp.GetPixels();
    double* im = imag_tmp.GetPixels();

    double** pRe = real.GetPixels2D();
    double** pIm = imag.GetPixels2D();

    register int i, j;

    for (j = 0; j < height; j++)
    {
        for (i = 0; i < width; i++)
        {
            re[i] = pRe[j][i];
            im[i] = pIm[j][i];
        }

        DFT1d(re, im, width, dir);

        for (i = 0; i < width; i++)
        {
            pRe[j][i] = re[i];
            pIm[j][i] = im[i];
        }
    }

    //-------------------------------------------------------------------------
    // 열(Column) 단위 이산 푸리에 변환 (또는 역변환)
    //-------------------------------------------------------------------------

    real_tmp.CreateImage(height, 1);
    imag_tmp.CreateImage(height, 1);

    re = real_tmp.GetPixels();
    im = imag_tmp.GetPixels();

    memset(re, 0, sizeof(double) * height);
    memset(im, 0, sizeof(double) * height);

    for (i = 0; i < width; i++)
    {
        for (j = 0; j < height; j++)
        {
            re[j] = pRe[j][i];
            im[j] = pIm[j][i];
        }

        DFT1d(re, im, height, dir);

        for (j = 0; j < height; j++)
        {
            pRe[j][i] = re[j];
            pIm[j][i] = im[j];
        }
    }
}
신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.