Добавил:
korayakov
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include <assert.h>
#define _USE_MATH_DEFINES
#include <math.h>
#undef _USE_MATH_DEFINES
#include "utils.h"
#include "myfft.h"
#include "myfastconv.h"
int myfastconv(const ComplexArray* x, const ComplexArray* y, ComplexArray* u)
{
int result = 0;
unsigned int N, N2, n, i;
ComplexArray tmpx, tmpy, tmpu;
assert(x != 0);
assert(y != 0);
assert(u != 0);
assert(x->count != 0);
assert(y->count != 0);
N = Max(x->count, y->count);
n = (unsigned int)ceil(log(N)/M_LN2);
N = (unsigned int)pow(2, n);
N2 = 2*N;
if (!ComplexArrayCreate(&tmpx, N2))
goto ErrorLevel1;
if (!ComplexArrayCreate(&tmpy, N2))
goto ErrorLevel2;
if (!ComplexArrayCreate(&tmpu, N2))
goto ErrorLevel3;
if (!ComplexArrayCreate(u, x->count + y->count - 1))
goto ErrorLevel4;
ComplexArrayZero(&tmpx);
ComplexArrayZero(&tmpy);
ComplexArrayCopy(x, &tmpx);
ComplexArrayCopy(y, &tmpy);
myfft(&tmpx);
myfft(&tmpy);
for (i=0; i<N2; ++i)
{
tmpu.r[i] = tmpx.r[i]*tmpy.r[i] - tmpx.i[i]*tmpy.i[i];
tmpu.i[i] = tmpx.r[i]*tmpy.i[i] + tmpx.i[i]*tmpy.r[i];
}
myifft(&tmpu);
ComplexArrayCopyN(&tmpu, u, u->count);
result = 1;
ErrorLevel4:
ComplexArrayDestroy(&tmpu);
ErrorLevel3:
ComplexArrayDestroy(&tmpy);
ErrorLevel2:
ComplexArrayDestroy(&tmpx);
ErrorLevel1:
return result;
}
Соседние файлы в папке fft