inline void FDLSEstimation(float *pXt,
				    float *pXtDagger,
 					float *pYt,
					float *pHTranspose,
					int NumLayer,
					int NumRxAntenna)
{
	float pXDX[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX * 2];

	MatrixProd(NumLayer, 2, NumLayer, pXtDagger, pXt, pXDX);

	float pInvXDX[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX * 2];

	MatrixInv(NumLayer, pXDX, pInvXDX);

	float pXDY[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX * 2];

	MatrixProd(NumLayer, 2, NumRxAntenna, pXtDagger, pYt, pXDY);

	MatrixProd(NumLayer, NumLayer, NumRxAntenna, pInvXDX, pXDY, pHTranspose);
								
	/*
	for (int i = 0; i < 4; i++)
	{
		printf("%f\n", pHTranspose[i]);
		printf("%f\n", pHTranspose[i + 4]);
	}
	*/
}
inline void FDLSEstimation(float *pXtReal, float *pXtImag,
				    float *pXtDaggerReal, float *pXtDaggerImag,
 					float *pYtReal, float *pYtImag,
					float *pHTransposeReal, float *pHTransposeImag,
					int NumLayer,
					int NumRxAntenna)
{
	float pXDXReal[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX];
	float pXDXImag[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX];

	MatrixProd(NumLayer, 2, NumLayer, pXtDaggerReal, pXtDaggerImag, pXtReal, pXtImag, pXDXReal, pXDXImag);

	float pInvXDXReal[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX];
	float pInvXDXImag[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX];

	MatrixInv(NumLayer, pXDXReal, pXDXImag, pInvXDXReal, pInvXDXImag);
 
	float pXDYReal[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX];
	float pXDYImag[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX];

	MatrixProd(NumLayer, 2, NumRxAntenna, pXtDaggerReal, pXtDaggerImag, pYtReal, pYtImag, pXDYReal, pXDYImag);

	MatrixProd(NumLayer, NumLayer, NumRxAntenna, pInvXDXReal, pInvXDXImag, pXDYReal, pXDYImag, pHTransposeReal, pHTransposeImag);

/*	for (int i = 0; i < 4; i++)
	{
		printf("%f\n", pHTransposeReal[i]);
		printf("%f\n", pHTransposeImag[i]);
	}*/
}
void FDLSEstimation(float pXt[2 * /*LTE_PHY_N_ANT_MAX*/NUM_LAYER * 2],
				    float pXtDagger[/*LTE_PHY_N_ANT_MAX*/NUM_LAYER * 2 * 2],
					float pYt[2 * /*LTE_PHY_N_ANT_MAX*/NUM_RX_ANTENNA * 2],
					float pHTranspose[/*LTE_PHY_N_ANT_MAX*/NUM_LAYER * /*LTE_PHY_N_ANT_MAX*/NUM_RX_ANTENNA * 2],
					int NumLayer,
					int NumRxAntenna)
{
//	float pXDX[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX * 2];
	float pXDX[NUM_LAYER * NUM_LAYER * 2];

//	MatrixProd(NumLayer, 2, NumLayer, pXtDagger, pXt, pXDX);
	MatrixProd(NUM_LAYER, 2, NUM_LAYER, pXtDagger, pXt, pXDX);

//	float pInvXDX[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX * 2];
	float pInvXDX[NUM_LAYER * NUM_LAYER * 2];

	MatrixInv(NumLayer, pXDX, pInvXDX);

//	float pXDY[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX * 2];
	float pXDY[NUM_LAYER * NUM_RX_ANTENNA * 2];

//	MatrixProd(NumLayer, 2, NumRxAntenna, pXtDagger, pYt, pXDY);
	MatrixProd(NUM_LAYER, 2, NUM_RX_ANTENNA, pXtDagger, pYt, pXDY);

//	MatrixProd(NumLayer, NumLayer, NumRxAntenna, pInvXDX, pXDY, pHTranspose);
	MatrixProd(NUM_LAYER, NUM_LAYER, NUM_RX_ANTENNA, pInvXDX, pXDY, pHTranspose);
}
Exemple #4
0
/*int main ()
{
	struct colourSystem *cs;
	double XYZ_to_RGB_Matrix[3][3];
	double RGB_to_XYZ_Matrix[3][3];
	int i, j;
	cs = &NTSCsystem;
	GetCTransMatrix (cs, XYZ_to_RGB_Matrix, RGB_to_XYZ_Matrix);
	return 0;
}
*/
void GetCTransMatrix (
	struct colourSystem *cs, 
	double XYZ_to_RGB_Matrix[3][3],
	double RGB_to_XYZ_Matrix[3][3] 
)
{
	int i, j;
	Get_XYZ_to_RGB_Matrix (cs, XYZ_to_RGB_Matrix);
	MatrixInv (XYZ_to_RGB_Matrix, RGB_to_XYZ_Matrix);
/*	printf ("XYZ_to_RGB Matrix = \n");
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			printf ("\t%f", XYZ_to_RGB_Matrix[i][j]);
		}
		printf ("\n");
	}
	printf ("RGB_to_XYZ Matrix = \n");
	for (i = 0; i < 3; i++)
	{
		for (j = 0; j < 3; j++)
		{
			printf ("\t%f", RGB_to_XYZ_Matrix[i][j]);
		}
		printf ("\n");
	}*/
	return;
}
Exemple #5
0
int main(int argc, char ** argv)
{
	char op;
	char mStr[1024];
	matrix ans, m1, m2;
	int sc = 0;

	if(argc > 1){
		op = getOp(argv[1]);
	} else {
		printf("Which operation: ");
		op = getOp(NULL);
	}


	printf("First matrix:\n");
	scanf("%s", mStr);
	m1 = MatrixInit(mStr);

	if(op == 'a' || op == 's' || op == 'm'){
		printf("Second matrix:\n");
		scanf("%s", mStr);
		m2 = MatrixInit(mStr);
	} else if(op == 'c') {
		printf("Scalar multiple:\n");
		scanf("%d", &sc);
	}

	switch(op){
		case 'a':
			ans = MatrixAdd(m1, m2);
			break;
		case 's':
			ans = MatrixSub(m1, m2);
			break;
		case 'm':
			ans = MatrixMul(m1, m2);
			break;
		case 'i':
			ans = MatrixInv(m1);
			break;
		case 'c':
			ans = MatrixSMul(m1, i2f(sc));
			break;
		default:
			printf("Something went very wrong.\n");
			return 1;
	}

	printf("Answer:\n");
	MatrixPrint(ans);

	MatrixFree(m1);
	MatrixFree(ans);
	if(op == 'a' || op == 's' || op == 'm'){
		MatrixFree(m2);
	}

	return 0;
}
task main()
{
  // Initiate BNS Library
  BNS();

  // Create a 3x3 matrix of zeros
  Matrix mat1;
  CreateZerosMatrix(&mat1, 3, 3);

  // Create a 3x3 matrix with some data in it
  // Set location 1 down, 0 across, to be 16
  Matrix mat2;
  CreateMatrix(&mat2, "1.10 3.40 0; 5 3 2; 0 1 1.234");
  SetMatrixAt(&mat2, 1, 0, 16);

  // Creates a 3x3 identity matrix, then multiply it by 11
  Matrix mat3;
  CreateIdentityMatrix(&mat3, 3);
  MatrixMultiplyScalar(&mat3, 11);

  // Print matricies to the debugger console
  PrintMatrix(&mat1);
  PrintMatrix(&mat2);
  PrintMatrix(&mat3);

  // Matrix Examples:

  // Matrix determinant
  float det = MatrixDeterminant(&mat2);
  writeDebugStreamLine("Matrix Det = %f", det);

  // Matrix Inverse
  Matrix inv;
  MatrixInv(&inv, mat2);
  writeDebugStream("Inverse ");
  PrintMatrix(&inv);

  // Matrix Multiplication
  Matrix mult;
  MatrixMult(&mult, mat2, mat3);
  writeDebugStream("Multiply ");
  PrintMatrix(mult);

  // Matrix Addition
  Matrix add;
  MatrixAdd(&add, mat2, mat3);
  writeDebugStream("Add ");
  PrintMatrix(&add);

  // Matrix Subtraction
  Matrix sub;
  MatrixSub(&sub, mat3, mat2);
  writeDebugStream("Subtract ");
  PrintMatrix(&sub);
}
// Kalman Update Step
// We "update" given what we get for data
//   The filter will use the data given to lower our
//   uncertainty (aka. covariance)
void KalmanUpdate(struct KalmanFilter *kal, struct Matrix meas)
{
  struct Matrix y, S, extTran, K, Sinv, x_next, P_next;

  CreateBlankMatrix(y);
  CreateBlankMatrix(S);
  CreateBlankMatrix(extTran);
  CreateBlankMatrix(K);
  CreateBlankMatrix(Sinv);
  CreateBlankMatrix(x_next);
  CreateBlankMatrix(P_next);

  CopyMatrix(&kal->measurementVector, meas);

  // Find the difference between the move (measurement)
  //   and what we predicted (extraction * data)
  MatrixMult(&y, kal->extractionMatrix, kal->meanVector);
  MatrixSub(&y, kal->measurementVector, y);

  // The Covariance of the move
  MatrixMult(&S, kal->extractionMatrix, kal->covarianceMatrixX);
  MatrixTranspose(&extTran, kal->extractionMatrix);
  MatrixMult(&S, S, extTran);
  MatrixAdd(&S, S, kal->covarianceMatrixZ);

  // Kalman Gain
  MatrixInv(&Sinv, S);
  MatrixMult(&K, kal->covarianceMatrixX, extTran);
  MatrixMult(&K, K, Sinv);

  // Figure out mean and covariance results
  MatrixMult(&x_next, K, y);
  MatrixAdd(&x_next, kal->meanVector, x_next);

  MatrixMult(&P_next, kal->covarianceMatrixX, extTran);
  MatrixMult(&P_next, P_next, Sinv);
  MatrixMult(&P_next, P_next, kal->extractionMatrix);
  MatrixMult(&P_next, P_next, kal->covarianceMatrixX);

  MatrixSub(&P_next, kal->covarianceMatrixX, P_next);

  // Copy results to the kalmanfilter class
  CopyMatrixByValue(&kal->meanVector, x_next);
  CopyMatrixByValue(&kal->covarianceMatrixX, P_next);

  // Delete matricies so we don't have memory leaks..
  DeleteMatrix(&y);
  DeleteMatrix(&S);
  DeleteMatrix(&extTran);
  DeleteMatrix(&K);
  DeleteMatrix(&Sinv);
  DeleteMatrix(&x_next);
  DeleteMatrix(&P_next);
}
inline void FDLSEqualization(float *pInpDataReal, float *pInpDataImag,
					  float *pHTransposeReal, float *pHTransposeImag,
					  int m,
					  int NumLayer,
					  int NumRxAntenna,
					  int MDFTPerUser,
					  int NumULSymbSF,
					  float *pOutDataReal, float *pOutDataImag)
{
//	int inp_len = NumLayer * NumULSymbSF * MDFTPerUser;
//	int out_len = NumLayer * (NumULSymbSF - 2) * MDFTPerUser;
//////////////////// Freq Domain Equalize received Data /////////////////
//	int h_len = NumRxAntenna * NumLayer;
//	int hdagger_len = NumLayer * NumRxAntenna;
//	int ht_len = h_len;
	float pHReal[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX];
	float pHImag[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX];
	float pHDaggerReal[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX];
	float pHDaggerImag[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX];
	float pHDHReal[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX];
	float pHDHImag[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX];
	float pInvHDHReal[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX];
	float pInvHDHImag[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX];

	float pHDYReal[LTE_PHY_N_ANT_MAX];
	float pHDYImag[LTE_PHY_N_ANT_MAX];

	for (int nrx = 0; nrx < NumRxAntenna; nrx++)
	{
		for (int layer = 0; layer < NumLayer; layer++)
		{
			//	pH[nrx * NumLayer + layer] = pHTranspose[layer * NumRxAntenna + nrx];
			pHReal[nrx * NumLayer + layer] = pHTransposeReal[layer * NumRxAntenna + nrx];
			pHImag[nrx * NumLayer + layer] = pHTransposeImag[layer * NumRxAntenna + nrx];
			//	pHDagger[layer * NumRxAntenna + nrx] = conj(pHTranspose[layer * NumRxAntenna + nrx]);
			pHDaggerReal[layer * NumRxAntenna + nrx] = pHTransposeReal[layer * NumRxAntenna + nrx];
			pHDaggerImag[layer * NumRxAntenna + nrx] = (-1.0) * pHTransposeImag[layer * NumRxAntenna + nrx];
		}
	}

	MatrixProd(NumLayer, NumRxAntenna, NumLayer, pHDaggerReal, pHDaggerImag, pHReal, pHImag, pHDHReal, pHDHImag);

	MatrixInv(NumLayer, pHDHReal, pHDHImag, pInvHDHReal, pInvHDHImag);

	////////////////// Equalizing Data /////////////////
	for (int nSymb = 0; nSymb < NumULSymbSF - 2; nSymb++)
	{
		//	int y_len = NumRxAntenna;
		float pYDataReal[LTE_PHY_N_ANT_MAX];
		float pYDataImag[LTE_PHY_N_ANT_MAX];

		for (int nrx = 0; nrx < NumRxAntenna; nrx++)
		{
			int IDX = (NumULSymbSF - 2) * nrx + nSymb + 2 * NumRxAntenna;
			//	*(pYData+nrx)=*(*(pInpData+IDX)+m);
			//	pYData[nrx] = pInpData[IDX * MDFTPerUser + m];
			pYDataReal[nrx] = pInpDataReal[IDX * MDFTPerUser + m];
			pYDataImag[nrx] = pInpDataImag[IDX * MDFTPerUser + m];
		}
		
		MatrixProd(NumLayer, NumRxAntenna, 1, pHDaggerReal, pHDaggerImag, pYDataReal, pYDataImag, pHDYReal, pHDYImag);

		//	int x_len = NumLayer;
		float pXDataReal[LTE_PHY_N_ANT_MAX];
		float pXDataImag[LTE_PHY_N_ANT_MAX];
		
		MatrixProd(NumLayer, NumLayer, 1, pInvHDHReal, pInvHDHImag, pHDYReal, pHDYImag, pXDataReal, pXDataImag);
		
		for (int layer = 0; layer < NumLayer; layer++)
		{
			int IDX = (NumULSymbSF - 2) * layer + nSymb;
			
			//	*(*(pOutData+IDX)+m)=*(pXData+layer);
			//	pOutData[IDX * MDFTPerUser + m] = pXData[layer];
			pOutDataReal[IDX * MDFTPerUser + m] = pXDataReal[layer];
			pOutDataImag[IDX * MDFTPerUser + m] = pXDataImag[layer];
		}
	}
}
void FDLSEqualization(float pInpData[/*N_EQ_IN_MAX*/ N_EQ_IN * 2],
					  float pHTranspose[/*LTE_PHY_N_ANT_MAX*/ NUM_LAYER * /*LTE_PHY_N_ANT_MAX*/ NUM_RX_ANTENNA * 2],
					  int m,
					  int NumLayer,
					  int NumRxAntenna,
					  int MDFTPerUser,
					  float pOutData[/*N_EQ_OUT_MAX*/N_EQ_OUT * 2])
{
	int NumULSymbSF = LTE_PHY_N_SYMB_PER_SUBFR;
//////////////////// Freq Domain Equalize received Data /////////////////
	/*
	float pH[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX * 2];
	float pHDagger[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX * 2];
	float pHDH[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX * 2];
	float pInvHDH[LTE_PHY_N_ANT_MAX * LTE_PHY_N_ANT_MAX * 2];

	float pHDY[LTE_PHY_N_ANT_MAX * 2];
	*/

	float pH[NUM_RX_ANTENNA * NUM_LAYER * 2];
	float pHDagger[NUM_LAYER * NUM_RX_ANTENNA * 2];
	float pHDH[NUM_LAYER * NUM_LAYER * 2];
	float pInvHDH[NUM_LAYER * NUM_LAYER * 2];

	float pHDY[NUM_LAYER * 2];

//	printf("FDLSEqualization: %d %d %d\n", NumRxAntenna, NumLayer, NumULSymbSF);
	for (int nrx = 0; nrx < /*NumRxAntenna*/NUM_RX_ANTENNA; nrx++)
	{
		for (int layer = 0; layer < /*NumLayer*/NUM_LAYER; layer++)
		{
//#pragma HLS DEPENDENCE array inter false
//#pragma HLS PIPELINE
			//	pH[nrx * NumLayer + layer] = pHTranspose[layer * NumRxAntenna + nrx];
			pH[2 * (nrx * NumLayer + layer) + 0] = pHTranspose[2 * (layer * NumRxAntenna + nrx) + 0];
			pH[2 * (nrx * NumLayer + layer) + 1] = pHTranspose[2 * (layer * NumRxAntenna + nrx) + 1];
			//	pHDagger[layer * NumRxAntenna + nrx] = conj(pHTranspose[layer * NumRxAntenna + nrx]);
			pHDagger[2 * (layer * NumRxAntenna + nrx) + 0] = pHTranspose[2 * (layer * NumRxAntenna + nrx) + 0];
			pHDagger[2 * (layer * NumRxAntenna + nrx) + 1] = (-1.0) * pHTranspose[2 * (layer * NumRxAntenna + nrx) + 1];
		}
	}

//	MatrixProd(NumLayer, NumRxAntenna, NumLayer, pHDagger, pH, pHDH);
	MatrixProd(NUM_LAYER, NUM_RX_ANTENNA, NUM_LAYER, pHDagger, pH, pHDH);
	MatrixInv(NumLayer, pHDH, pInvHDH);

	////////////////// Equalizing Data /////////////////
	for (int nSymb = 0; nSymb < /*NumULSymbSF*/NUM_UL_SYMB_SF - 2; nSymb++)
	{
	//	float pYData[LTE_PHY_N_ANT_MAX * 2];
		float pYData[NUM_RX_ANTENNA * 2];
		for (int nrx = 0; nrx < /*NumRxAntenna*/ NUM_RX_ANTENNA; nrx++)
		{
//#pragma HLS PIPELINE
			int IDX = (NumULSymbSF - 2) * nrx + nSymb + 2 * NumRxAntenna;
			//	*(pYData+nrx)=*(*(pInpData+IDX)+m);
			//	pYData[nrx] = pInpData[IDX * MDFTPerUser + m];
			pYData[2 * nrx + 0] = pInpData[2 * (IDX * MDFTPerUser + m) + 0];
			pYData[2 * nrx + 1] = pInpData[2 * (IDX * MDFTPerUser + m) + 1];
		}
	//	MatrixProd(NumLayer, NumRxAntenna, 1, pHDagger, pYData, pHDY);
		MatrixProd(NUM_LAYER, NUM_RX_ANTENNA, 1, pHDagger, pYData, pHDY);

	//	float pXData[LTE_PHY_N_ANT_MAX];
		float pXData[NUM_LAYER];
	//	MatrixProd(NumLayer, NumLayer, 1, pInvHDH, pHDY, pXData);
		MatrixProd(NUM_LAYER, NUM_LAYER, 1, pInvHDH, pHDY, pXData);

		for (int layer = 0; layer < /*NumLayer*/ NUM_LAYER; layer++)
		{
//#pragma HLS PIPELINE
//#pragma HLS DEPENDENCE array inter false
			int IDX = (NumULSymbSF - 2) * layer + nSymb;
			
			//	*(*(pOutData+IDX)+m)=*(pXData+layer);
			//	pOutData[IDX * MDFTPerUser + m] = pXData[layer];
			pOutData[2 * (IDX * MDFTPerUser + m) + 0] = pXData[2 * layer + 0];
			pOutData[2 * (IDX * MDFTPerUser + m) + 1] = pXData[2 * layer + 1];
		}
	}
}
Exemple #10
0
Fichier : maw.c Projet : ubsan/MAL
int main(void)
{
    char mStr[1024];
    matrix *ans, *m1, *m2;
    int sc = 0;

    printf("Which operation: ");
    char op = tolower(getchar());

    while(op != '+' || op != '-' || op != '*' || op != '/' || op != 'i') {
        puts(opErr);
        op = tolower(getchar());
    }

    printf("First matrix:\n");
    scanf("%s", mStr);
    m1 = MatrixInit(mStr);
    MatrixPrint(m1);

    if(op == 'a' || op == 's' || op == 'm') {
        printf("Second matrix:\n");
        scanf("%s", mStr);
        m2 = MatrixInit(mStr);
        MatrixPrint(m2);
    } else if(op == 'c') {
        printf("Scalar multiple:\n");
        scanf("%d", &sc);
    }

    switch(op) {
    case 'a':
        ans = MatrixAdd(m1, m2);
        break;
    case 's':
        ans = MatrixSub(m1, m2);
        break;
    case 'm':
        ans = MatrixMul(m1, m2);
        break;
    case 'i':
        ans = MatrixInv(m1);
        break;
    case 'c':
        ans = MatrixSMul(m1, sc);
        break;
    default:
        printf("Something went very wrong.\n");
        return 1;
    }

    printf("Answer:\n");
    MatrixPrint(ans);

    MatrixFree(m1);
    MatrixFree(ans);
    if(op == 'a' || op == 's' || op == 'm') {
        MatrixFree(m2);
    }

    return 0;
}