#include "../ComputerHead/floatComplexMatrixCompute.h"
#include <math.h>
#include <float.h>
/* --------------------Data format Convert----------------- */
//Addr Data Convert to a Matrix
int Addr2Matrix(float * inputAddr,floatComplexMatrix *mat)
{
size_t i,j;
size_t mRow,mCol;
mRow=mat->row;
mCol=mat->col;
for(i=0;i<mRow;i++)
for(j=0;j<mCol;j++)
{
mat->a[i][j].re=inputAddr[2*i*mCol+2*j];
mat->a[i][j].im=inputAddr[2*i*mCol+2*j+1];
}
return 1;
}
//Matrix Convert to a Addr
int Matrix2Addr(floatComplexMatrix *mat,float *outputAddr)
{
size_t i,j;
size_t mRow,mCol;
mRow=mat->row;
mCol=mat->col;
for(i=0;i<mRow;i++)
for(j=0;j<mCol;j++)
{
outputAddr[2*i*mCol+2*j]=mat->a[i][j].re;
outputAddr[2*i*mCol+2*j+1]=mat->a[i][j].im;
}
return 1;
}
//Addr Data Convert to a Vector
int Addr2ComplexVector(float * inputAddr,floatComplexVector *ver)
{
size_t i;
size_t vSize;
vSize=ver->size;
for(i=0;i<vSize;i++)
{
ver->a[i].re=inputAddr[2*(i)];
ver->a[i].im=inputAddr[2*(i)+1];
}
return 1;
}
//Vector Convert to a Addr
int ComplexVector2Addr(floatComplexVector *ver,float *outputAddr)
{
size_t i;
size_t vSize;
vSize=ver->size;
for(i=0;i<vSize;i++)
{
outputAddr[2*(i)]=ver->a[i].re;
outputAddr[2*(i)+1]=ver->a[i].im;
}
return 1;
}
//Addr Data Convert to a Real Vector
int Addr2RealVector(float * inputAddr,floatRealVector *ver)
{
size_t i;
size_t vSize;
vSize=ver->size;
for(i=0;i<vSize;i++)
ver->a[i]=inputAddr[i];
return 1;
}
//Addr Data Convert to a fix 32 Vector
int Addr2fix32Vector(long int * inputAddr,fix32RealVector *ver)
{
size_t i;
size_t vSize;
vSize=ver->size;
for(i=0;i<vSize;i++)
ver->a[i]=inputAddr[i];
return 1;
}
// fix 32 Vector Convert to a Addr Data
int fix32Vector2Addr(fix32RealVector *ver,long int *outputAddr)
{
size_t i;
size_t vSize;
vSize=ver->size;
for(i=0;i<vSize;i++)
outputAddr[i]=ver->a[i];
return 1;
}
//Addr Data Convert to a fix 16 Vector
int Addr2fix16Vector(short int *inputAddr,fix16RealVector *ver)
{
size_t i;
size_t vSize;
vSize=ver->size;
for(i=0;i<vSize;i++)
ver->a[i]=inputAddr[i];
return 1;
}
// fix 16 Vector Convert to a Addr Data
int fix16Vector2Addr(fix16RealVector *ver,short int *outputAddr)
{
size_t i;
size_t vSize;
vSize=ver->size;
for(i=0;i<vSize;i++)
outputAddr[i]=ver->a[i];
return 1;
}
//Real Vector Convert to a Addr
int RealVector2Addr(floatRealVector *ver,float *outputAddr)
{
size_t i;
size_t vSize;
vSize=ver->size;
for(i=0;i<vSize;i++)
outputAddr[i]=ver->a[i];
return 1;
}
//Addr Real Data ConCdatat to a Complex
int Addr2Complex(float * inputAddr,floatComplex Cdata)
{
Cdata.re=inputAddr[0];
Cdata.im=inputAddr[1];
return 1;
}
//Complex convert to a Addr Read Data
int Complex2Addr(floatComplex Cdata,float *outputAddr)
{
outputAddr[0]=Cdata.re;
outputAddr[1]=Cdata.im;
return 1;
}
/*float complex vector */
floatComplexVector *floatComplexVectorAlloc(size_t vSize)
{
floatComplexVector *r;
r=malloc(sizeof(floatComplexVector));
r->a=malloc(vSize*sizeof(floatComplex));
r->size=vSize;
return r;
}
/*float real vector */
floatRealVector *floatRealVectorAlloc(size_t vSize)
{
floatRealVector *r;
r=malloc(sizeof(floatRealVector));
r->a=malloc(vSize*sizeof(float));
r->size=vSize;
return r;
}
/*fix 32 real vector */
fix32RealVector *fix32RealVectorAlloc(size_t vSize)
{
fix32RealVector *r;
r=malloc(sizeof(fix32RealVector));
r->a=malloc(vSize*sizeof(long));
r->size=vSize;
return r;
}
/*fix 16 real vector */
fix16RealVector *fix16RealVectorAlloc(size_t vSize)
{
fix16RealVector *r;
r=malloc(sizeof(fix16RealVector));
r->a=malloc(vSize*sizeof(short));
r->size=vSize;
return r;
}
void floatRealVectorFree(floatRealVector *ver)
{
free(ver->a);
free(ver);
}
void fix32RealVectorFree(fix32RealVector *ver)
{
free(ver->a);
free(ver);
}
void fix16RealVectorFree(fix16RealVector *ver)
{
free(ver->a);
free(ver);
}
void floatComplexVectorFree(floatComplexVector *ver)
{
free(ver->a);
free(ver);
}
/* float complex Matrix */
floatComplexMatrix *floatComplexMatrixAlloc(size_t row,size_t col)
{
size_t i;
floatComplexMatrix *r;
r=malloc(sizeof(floatComplexMatrix));
r->a=malloc(row*sizeof(floatComplex *));
for(i=0;i<row;i++)
r->a[i]=malloc(col*sizeof(floatComplex));
r->row=row;
r->col=col;
return r;
}
void floatComplexMatrixFree(floatComplexMatrix *mat)
{
size_t i;
for(i=0;i<mat->row;i++)
free(mat->a[i]);
free(mat->a);
free(mat);
}
/* Print a float complex matrix */
void floatPrintComplexMatrix(floatComplexMatrix *mat)
{
size_t i,j;
for(i=0;i<mat->row;i++)
{
for(j=0;j<mat->col;j++)
{
printf("%f+i(%f)\t",mat->a[i][j].re,mat->a[i][j].im);
}
printf("\n");
}
}
/* Print a matrix from output Addr to a file */
void floatPrintAddrMatrix2File(float *outputAddr,size_t mRow,size_t mCol,FILE *fp)
{
size_t i,j;
for(i=0;i<mRow;i++)
{
for(j=0;j<mCol;j++)
{
fprintf(fp,"%f+i(%f)\t",outputAddr[2*i*mCol+2*j],outputAddr[2*i*mCol+2*j+1]);
}
fprintf(fp,"\n");
}
}
/* Print a float complex matrix to a txt file */
void floatPrintComplexMatrix2File(floatComplexMatrix *mat,FILE *fp)
{
size_t i,j;
for(i=0;i<mat->row;i++)
{
for(j=0;j<mat->col;j++)
{
fprintf(fp,"%f+i(%f)\t",mat->a[i][j].re,mat->a[i][j].im);
}
fprintf(fp,"\n");
}
}
/* Print a float complex vector */
void floatPrintComplexVector(floatComplexVector *ver)
{
size_t i;
for(i=0;i<ver->size;i++)
{
printf("%f+i(%f)\t\n",ver->a[i].re,ver->a[i].im);
}
}
/* Print a float complex vector to a txt file */
void floatPrintComplexVector2File(floatComplexVector *ver,FILE *fp)
{
size_t i;
for(i=0;i<ver->size;i++)
{
fprintf(fp,"%f+i(%f)\t\n",ver->a[i].re,ver->a[i].im);
}
}
/* Print a float real vector to a txt file */
void floatPrintRealVector2File(floatRealVector *ver,FILE *fp)
{
size_t i;
for(i=0;i<ver->size;i++)
{
fprintf(fp,"%f\n",ver->a[i]);
}
}
/* Print a fix 16 real vector to a txt file */
void fix16PrintRealVector2File(fix16RealVector *ver,FILE *fp)
{
size_t i;
for(i=0;i<ver->size;i++)
{
fprintf(fp,"%d\n",ver->a[i]);
}
}
/* Print a fix 32 real vector to a txt file */
void fix32PrintRealVector2File(fix32RealVector *ver,FILE *fp)
{
size_t i;
for(i=0;i<ver->size;i++)
{
fprintf(fp,"%d\n",ver->a[i]);
}
}
/* Print a vector from output Addr to a file */
void floatPrintAddrVector2File(float *outputAddr,size_t vSize,FILE *fp)
{
size_t i;
for(i=0;i<vSize;i++)
{
fprintf(fp,"%f+i(%f)\n",outputAddr[2*i],outputAddr[2*i+1]);
}
}
/* Print a real vector from output Addr to a file */
void floatPrintAddrRealVector2File(float *outputAddr,size_t vSize,FILE *fp)
{
size_t i;
for(i=0;i<vSize;i++)
{
fprintf(fp,"%f\n",outputAddr[i]);
}
}
/* Print a fix 16 real vector from output Addr to a file */
void fix16PrintAddrRealVector2File(short int *outputAddr,size_t vSize,FILE *fp)
{
size_t i;
for(i=0;i<vSize;i++)
{
fprintf(fp,"%d\n",outputAddr[i]);
}
}
/* Print a fix 32 real vector from output Addr to a file */
void fix32PrintAddrRealVector2File(long int *outputAddr,size_t vSize,FILE *fp)
{
size_t i;
for(i=0;i<vSize;i++)
{
fprintf(fp,"%d\n",outputAddr[i]);
}
}
/* swap two rows of a float complex matrix */
void swapMatrixRow(floatComplexMatrix *mat, size_t row1, size_t row2)
{
size_t j;
floatComplex atemp;
for(j=0;j<mat->col;j++)
{
atemp=mat->a[row1][j];
mat->a[row1][j]=mat->a[row2][j];
mat->a[row2][j]=atemp;
}
}
/* swap two rows of a float complex matrix only in l