В документации математики накопал что Фурье считается вот так:

Реализовал эту формулу в математике, но убрал мнимую часть по формуле Эйлера:

В коде на скорую руку получилось нечто такое:
В Математике
Код
inputPtr;
n = Length[inputPtr]
fftNew = ConstantArray[0, n];
For[s = 1, s <= n, s++, {
For[r = 1, r <= n, r++, {
fftNew[[s]] =
fftNew[[s]] + inputPtr[[r]]*Cos[2*Pi*(r - 1)*(s - 1)/n];
}]
}]
Функция CUDA... вызывается для каждого элементов fftPtr параллельно. потоков 512, поэтому в каждом считаю два отсчета Фурье
Код
__global__ void fft(float* inputPtr, float* fftPtr)
{
//Получаем id текущей нити.
int idx = threadIdx.x;
int id1 = idx*2+0;
int id2 = idx*2+1;
fftPtr[id1] = 0;
//Расчитываем результат.
for(int i = 0; i < 1024; i++)
{
fftPtr[id1] += inputPtr[i]*cos((3.141592653*i*id1)/512);
fftPtr[id2] += inputPtr[i]*cos((3.141592653*i*id2)/512);
}
fftPtr[id1] = abs(fftPtr[id1]/32);
fftPtr[id2] = abs(fftPtr[id2]/32);
}
Вобщем моя реализация что в математике, что в С++ выдает почти одинаковый результат довольно похожий на CUFFT, но он опять же отличается от того что выдает стандартное Fourier[] Математики!
Сообщение отредактировал AlexCorvis - Jun 2 2010, 04:23