Скачиваний:
57
Добавлен:
16.04.2013
Размер:
1.36 Кб
Скачать
#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