본문 바로가기
Computer/Algorithm

고속 푸리에 변환

by hydrogendeuteride 2021. 1. 28.

 

 

이산 푸리에 변환

이산 푸리에 변환의 C++ 코드이다. #define M_PI 3.14159265358979323846 void DFT(const std::vector &input, std::vector > &output) { int N = input.size(); std::complex img(0.0, 1.0); for (int i = 0; i <..

ellipsoid.tistory.com

이산 푸리에 변환 글을 참고하면 좋다.

void FFT(std::vector<std::complex<double>> &x)
{
    unsigned int N = x.size(), k = N, n;
    std::complex<double> phiT(cos(M_PI / (double) N), -sin(M_PI / (double) N)), T;

    while (k > 1)
    {
        n = k;
        k >>= 1;
        phiT = phiT * phiT;
        T = 1.0L;

        for (int i = 0; i < k; ++i)
        {
            for (int a = i; a < N; a += n)
            {
                int b = a + k;
                std::complex<double> t = x.at(a) - x.at(b);
                x.at(a) += x.at(b);
                x.at(b) = t * T;
            }
            T *= phiT;
        }
    }

    unsigned int m = (unsigned int) log2(N);
    for (int a = 0; a < N; ++a)
    {
        unsigned int b = a;

        b = (((b & 0xaaaaaaaa) >> 1) | ((b & 0x55555555) << 1));
        b = (((b & 0xcccccccc) >> 2) | ((b & 0x33333333) << 2));
        b = (((b & 0xf0f0f0f0) >> 4) | ((b & 0x0f0f0f0f) << 4));
        b = (((b & 0xff00ff00) >> 8) | ((b & 0x00ff00ff) << 8));
        b = ((b >> 16) | (b << 16)) >> (32 - m);
        if (b > a)
        {
            std::swap(x.at(a), x.at(b));
        }
    }
}

void fft_r(std::valarray<std::complex<double>>& x)
{
    const int N = x.size();
    if (N <= 1)
        return;

    std::valarray<std::complex<double>> even = x[std::slice(0, N / 2, 2)];
    std::valarray<std::complex<double>> odd = x[std::slice(1, N / 2, 2)];

    fft_r(even);
    fft_r(odd);

    for (int i = 0; i < N / 2; ++i)
    {
        std::complex<double> t = std::polar(1.0, -2 * M_PI * i / (double) N) * odd[i];
        x[i] = even[i] + t;
        x[i+N / 2] = even[i] - t;
    }
}

고속 푸리에 변환 C++ 코드이다.

일단, 아주 간단히 설명하자면 위 코드는 반복 알고리즘과 재귀 알고리즘으로 다르게 구현할 수 있다.

 

맞다 분할정복이다.

대충 러시아 농사꾼 알고리즘을 함수 영역으로 확장시켰다 보면 된다.

 

행렬을 쪼개서 2*2정도의 작은 행렬로 만들고 다시 결합하는 방식인데 이 블로그를 참고하면 좋다.

helloworldpark.github.io/mathematics/2017/02/26/FFT_02.html

 

푸리에 분석 - 고속 푸리에 변환 증명하기

푸리에 분석 - 왜 할까요 푸리에 분석 - 고속 푸리에 변환 증명하기 푸리에 분석 - 고속 푸리에 변환 구현하기 이 페이지는 최병선 교수님의 Wavelet 해석을 바탕으로 작성되었습니다. 그러나 책과

helloworldpark.github.io

본인은 선형대수 실력이 Boas수리물리책에 나오는 수준으로 한정되므로 이해하기 힘들었다.

나중에 설명할 수 있는 정도가 되면 설명해보겠다.

 

stackoverflow.com/questions/28009590/understanding-the-radix-2-fft-recursive-algorithm

 

Understanding the radix-2 FFT recursive algorithm

I'm currently studying DFT and FFT and we were given this simple question: se the recursive FFT to compute the DFT of this polynomial of third degree: -1 + 4x + 3x^2. So, I'm considering this algo...

stackoverflow.com

위의 블로그를 봤다면 여기도 참조해보자 구조가 좀 보일것이다.

'Computer > Algorithm' 카테고리의 다른 글

최척화된 Barnes-Hut 시뮬레이션  (0) 2023.12.28
배열 쿼드트리  (0) 2023.09.16
쿼드트리  (0) 2021.11.07
이산 푸리에 변환  (0) 2021.01.28
C++ vector, list, queue 속도 실험  (0) 2021.01.17

댓글