Скачиваний:
57
Добавлен:
16.04.2013
Размер:
3.11 Кб
Скачать
#include <assert.h>
#include <memory.h>
#ifdef _MATLAB_MEX_
#include "mex.h"
#define myprintf mexPrintf
#else
#include <stdlib.h>
#include <stdio.h>
#define myprintf printf
#endif
#include <math.h>
#include "complexarray.h"

int ComplexArrayCreate(ComplexArray* arr, unsigned int size)
{	
	assert(arr != 0);

#ifndef _MATLAB_MEX_
	arr->r = malloc(sizeof(double)*size);
	if (0 == arr->r)
		goto ErrorLevel1;

	arr->i = malloc(sizeof(double)*size);
	if (0 == arr->i)
		goto ErrorLevel2;

	arr->count = size;	

	return 1;

ErrorLevel2:
	free(arr->r);	
ErrorLevel1:
	arr->i = 0;
	arr->r = 0;
	arr->count = 0;
	return 0;
#else
	arr->mArr = mxCreateDoubleMatrix(1, size, mxCOMPLEX);

	arr->r = mxGetPr(arr->mArr);
	arr->i = mxGetPi(arr->mArr);
	arr->count = size;

	return 1;
#endif
}

void ComplexArrayDestroy(ComplexArray* arr)
{
	assert(arr != 0);

#ifndef _MATLAB_MEX_
	if (arr->r != 0)
	{
		free(arr->r);
		arr->r = 0;
	}
	if (arr->i != 0)
	{
		free(arr->i);	
		arr->i = 0;
	}

	arr->count = 0;
#else
	mxDestroyArray(arr->mArr);

	arr->r = 0;
	arr->i = 0;
	arr->count = 0;
	arr->mArr = 0;
#endif
}

void ComplexArrayPrint(const ComplexArray* arr)
{
	unsigned int i;

	assert(arr != 0);

	for (i=0; i<arr->count; ++i)
	{
		if (arr->i[i] >= 0)		
			myprintf("%.3f + %.3fi\n", arr->r[i], arr->i[i]);
		else
			myprintf("%.3f - %.3fi\n", arr->r[i], fabs(arr->i[i]));
	}
}

unsigned int NextRev(unsigned int r, unsigned int n)
{
	do
	{
		n = n >> 1;
		r = r^n;
	} while ((r & n) == 0);

	return r;
}

void ComplexArrayInverseOrder(ComplexArray *arr)
{
	double tmpr, tmpi;
	unsigned int x, r;

	assert(arr != 0);

	if (arr->count <= 2)
		return;

	r = 0;

	for ( x = 1; x<arr->count; ++x)
	{
		r = NextRev(r, arr->count);
		if (r > x)
		{			
			tmpr = arr->r[x];
			tmpi = arr->i[x];
			arr->r[x] = arr->r[r];
			arr->i[x] = arr->i[r];
			arr->r[r] = tmpr;
			arr->i[r] = tmpi;
		}
	}
}

void ComplexArrayCopy(const ComplexArray *arr, ComplexArray* out)
{	
	ComplexArrayCopyN(arr, out, arr->count);
}

void ComplexArrayCopyN(const ComplexArray *arr, ComplexArray* out, unsigned int N)
{	
	assert(arr != 0);
	assert(out != 0);
	assert(arr->count >= N);
	assert(N <= out->count);

	memcpy(out->r, arr->r, sizeof(double)*N);
	memcpy(out->i, arr->i, sizeof(double)*N);
}

void ComplexArrayZero(ComplexArray *arr)
{
	assert(arr != 0);

	memset(arr->r, 0, sizeof(double)*arr->count);
	memset(arr->i, 0, sizeof(double)*arr->count);
}

#ifdef _MATLAB_MEX_
void ComplexArrayFromMxArray(ComplexArray* arr, mxArray* mArr)
{	
	assert(arr != 0);
	assert(mArr != 0);

	arr->count = mxGetN(mArr);
	arr->mArr = mArr;
	arr->r = mxGetPr(mArr);
	if (mxIsComplex(mArr))
	{
		arr->i = mxGetPi(mArr);
	}
	else
	{
		arr->i = mxCalloc(arr->count, sizeof(double));
	}	
}

void MxArrayFromComplexArray(mxArray** mArr, ComplexArray* arr)
{	
	assert(mArr != 0);
	assert(*mArr != 0);
	assert(arr != 0);		

	*mArr = arr->mArr;

	mxSetPi(*mArr, arr->i);
}
#endif
Соседние файлы в папке fft