Re: Программа по быстрого преобразования Фурье нужна
От: SWW Россия  
Дата: 22.11.03 19:20
Оценка:
V>Может это не по MFC вопрос конечно, но так как я пишу в основном под ним, то и спрашиваю здесь.
V>В общем, нужен исходник, реализующий быстрое преобразование Фурье.
V>Встречал кто такое?
V>Можно в принципе и на других языках, не на С.

Например так
// нерекурсивный алгоритм с прореживанием по частоте
void CYourCoolClass::Fft(complex a[], int m, int ind)
    {
    int n = pow2(m), i;

    ASSERT(n == BUFSIZE);
    complex v, w;
    int step = n;
    for(i = m; i > 0; i--)
        {
        step >>= 1;

        cexp(&v, ind*step);
        w = complex(1, 0);
        for(int j = 0; j < step; j++)
            {
            for(int k = j; k < n; k += step<<1)
                bfl(a[k], a[k+step], w);
            w *= v;
            }
        }

    for(int j = i = 0; i < n-1; i++)
        {
        if(i < j)
            {
            complex t;
            t = a[i];
            a[i] = a[j];
            a[j] = t;
            }
        int k = n/2;
        while(k <= j)
            {
            j -= k;
            k /=2;
            }
        j += k;
        }
    }

double cexp(complex* c, int n)
    {
    __asm
        {
        fldpi
        fild    n
        fdivp   st(1), st(0)
        fsincos
        mov     ebx, c
        fstp    qword ptr [ebx]
        fstp    qword ptr [ebx+8]
        }
    }


void CYourCoolClass::bfl(complex& a1, complex& a2, complex& w)
    {
    complex t = a1 - a2;
    a1 += a2;
    a2 = w * t;
    }


Или так (медленнее, но понятнее)

// рекурсивный вариант БПФ
void CYourCoolClass::fft(complex a[], int num, int ind)
    {
    if(num == 2)
        {
        complex tmp = a[0] - a[1];
        a[0] += a[1];
        a[1] = tmp;
        return;
        }

    int step = num>>1;
    complex    w, v;
    cexp(&v, ind*step);
    w = complex(1,0);
    for(int k = 0; k < step; k++)
        {
        int l = k+step;
        complex tmp = a[k] - a[l];
        a[k] += a[l];
        a[l] = w * tmp;
        w *= v;
        }

    fft(a, step, ind);
    fft(a+step, step, ind);
    }
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.