⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 common.h

📁 B3g_phase2_C语言_Matlab程序及说明
💻 H
字号:
#ifndef _COMMON_H_
#define _COMMON_H_

/************************************************
*Copyright (C) 2004 FUTURE@NCRL SEU
*All Rights Reserved.

*FileName: _COMMON_C_

*Abstract: Used for GMC System.

*Cue.Ver : V4.0
*Author  : Bin Jiang
*Date    : 2004-06-02
*Modify  : New detector:
           SIC with spatial domain filter.

*Pre.Ver : V3.0
*Author  : Bin Jiang
*Date    : 2004-04-08
*Modify  : Add multi-carrier modulation.

*Pre.Ver : V2.0
*Author  : Bin Jiang
*Date    : 2004-03-25
*Modify  : (1) Change the structure of detector.
           (2) Improve the channel estimation.

*Pre.Ver : V1.2
*Author  : Bin Jiang
*Date    : 2003-12-24

*Ref.    : Matlab Program.

************************************************/

//Includes Files
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

//Public Data Declaration
#define	PI	 4*atan(1)
#define FFT	 0
#define IFFT 1

////////////////////////////
///	SYSTEM PARAMETER     ///
////////////////////////////

/* Tx and Rx */
#define	TxANTENNA_NUM	1
#define RxANTENNA_NUM	1

/* MCFB */
#define CARRIER_NUMBER		16
#define USED_CARRIER		14
#define SUBCARRIER_FIRST	1
#define SUBCARRIER_LAST		14
#define UPSAMPLE_FACTOR		18
#define DOWNSAMPLE_FACTOR	18
#define FILTER_LENGTH		217

/* The Channel */
#define PATH_NUM		8
#define PATH_NUM_MC		6
#define Fc				3.2e9
#define VELOCITY		250

//#define MAX_DELAY   90
//static int 			PATH_DELAY[] = {0,18,36,54,72,90};
#define MAX_DELAY   230
static int 			PATH_DELAY[] = {0,46,92,138,184,230};
//static double		PATH_GAIN[]  = {0.96793818225476, 0.24313507865458, 0.06107277050964, 0.01534078635779, 0.00385343131008, 0.00096793818225};
static double		PATH_GAIN[]  = {1,0,0,0,0,0};

/* The detector's structure */
/*
#define MAXSUPDOM	    4
#define INTERP_FACTOR	3
static int SUP_DOM[] = {0,32,112,192,216};
*/


#define MAXSUPDOM	    5
#define INTERP_FACTOR	4
static int SUP_DOM[] = {0, 20, 80, 144, 204, 216};
//static int SUP_DOM[] = {0, 30, 90, 150, 210, 232};

/* The Frame and Slot Structure */
#define	INPUT				1
#define OUTPUT				2 //3
#define CODE_SLOTNUM		4
#define SLOT_LENGTH			2088
#define PILOT_LENGTH		32
#define GUARD_LENGTH 		8
#define SUBSLOT_NUM			8
#define SYMBOL_SLOT			1728
#define SUBSLOT_LENGTH		256
#define SUBSLOTDATA_LENGTH	216	//i.e. (SUBSLOT_LENGTH-PILOT_LENGTH-GUARD_LENGTH)

////////////////////////////////
///   END SYSTEM PARAMETER   ///
////////////////////////////////

//Type Declaration
typedef struct
{
	int FRAME_SLOTNUM;
	int n_CodedBitPerSlot;
	int n_SymbolPerSlot;
	int MODULATOR_STYLE;
}BASEBAND_PARM;

typedef struct
{
	int n_InfoBit_length;
	int n_CodeMemLength;
	int Code_Poly[2];
	int n_puncture;
}CODE_PARAMETER;


//Function Declaration

/* _COMPLEX_H_ */
typedef struct
{
	double real;
	double image;
}COMPLEX;

double	eng_cmx(COMPLEX a);
double  abs_cmx(COMPLEX a);
COMPLEX	conj_cmx(COMPLEX a);
COMPLEX add_cmx(COMPLEX a, COMPLEX b);
COMPLEX sub_cmx(COMPLEX a, COMPLEX b);
COMPLEX mul_cmx(COMPLEX a, COMPLEX b);
COMPLEX div_cmx(COMPLEX a, COMPLEX b);;
COMPLEX mul_cmxreal(COMPLEX a, double b);
COMPLEX div_cmxreal(COMPLEX a, double b);

/* _RANDOM_H_ */
extern  long s1,s2;
double	random_source();
double 	generate_random_source();
double  generate_gaussian_source(double sigma2);
int	    generate_binary_source();

/* _INTERLEAVER_H_ */
double s_random_source(long *s1, long *s2);
void   s_inter_generate(int N, int S, int *inter_index, long ss1, long ss2);
void   s_interleave_int(int * p_block, int N, int * p_InlvTable);
void   s_interleave_double(double * p_block, int N, int * p_InlvTable);
void   s_deinterleave_double(double * p_block, int N, int * p_InlvTable);

/* _MAP_H_ */
static COMPLEX MapMatrix16QAM[] = { 
{-0.31622776601684,-0.31622776601684},{-0.31622776601684,-0.94868329805051},{-0.31622776601684,0.31622776601684},{-0.31622776601684,0.94868329805051},
{-0.94868329805051,-0.31622776601684},{-0.94868329805051,-0.94868329805051},{-0.94868329805051,0.31622776601684},{-0.94868329805051,0.94868329805051},
{ 0.31622776601684,-0.31622776601684},{ 0.31622776601684,-0.94868329805051},{ 0.31622776601684,0.31622776601684},{ 0.31622776601684,0.94868329805051},
{ 0.94868329805051,-0.31622776601684},{ 0.94868329805051,-0.94868329805051},{ 0.94868329805051,0.31622776601684},{ 0.94868329805051,0.94868329805051}};

int GrayMapQAM(int * inBit, int bitlength, COMPLEX * outSymbol, int ModType);
int SoftDemod16QAM(COMPLEX * p_x_Intf, int n_IntfLen, double * p_x_Sigma, double * p_Rou, double * p_CodedBitLLR);


/* _TURBO_IC_H_ */
int Turbo_IC (COMPLEX * p_x_Rake, int n_x_RakeLen, double * p_Rou, COMPLEX * p_Mask, int n_MaskLen, COMPLEX * p_x_mean0, double * p_x_variance0, double Noise_Variance, COMPLEX * p_x_Intf, double * p_x_Sigma, int n_IterNum);
int Turbo_ICC(COMPLEX * p_x_Rake, int n_x_RakeLen, double * p_Rou, COMPLEX * p_Mask, int n_MaskLen, COMPLEX * p_x_mean0, double * p_x_variance0, double Noise_Variance, COMPLEX * p_x_Intf, double * p_x_Sigma);
int MeanVar(double * p_LLR, int n_LLR_len, COMPLEX * p_x_mean0, double * p_x_variance0);
int UpdateMeanVar(COMPLEX * curIntf, double * curSigma, double * curRou, COMPLEX * nextMean, double * nextVar);
int BuiltMeanVar(COMPLEX * p_x_mean0, double * p_x_variance0, COMPLEX * p_x_mean, double * p_x_variance);
int Rou_Mask(COMPLEX * p_h_half, COMPLEX * p_Mask, double * p_Rou, int Ns);
int NewRouMask(COMPLEX * p_h_half, COMPLEX * p_Mask, double * p_Rou, int n_InterpFactor);
int sort(double * in_SNR, int n_length, int * Order);

int GetCurTxMask(COMPLEX * p_CurSdMask, COMPLEX * p_CurWeight, COMPLEX * p_CurTxMask, int n_CurTxAntenna);
int GetWeightMatrix(COMPLEX * p_CurSdCentralMask, COMPLEX * p_VarMatrix, COMPLEX * p_Weight);
int UpdateRou(COMPLEX * p_CurSdCentralMask, COMPLEX * p_Weight, double * p_CurSdRou, double * p_RouNoise);
int GetVarMatrix(COMPLEX * p_CurSdMask, COMPLEX * p_CurSdCentralMask, double * p_VarMean, COMPLEX * p_VarMatrix, double * NoiseVariance);
int Turbo_SF_IC(COMPLEX * p_x_Rake, int n_x_RakeLen, double * p_Rou, COMPLEX * p_Mask, int n_MaskLen, COMPLEX * p_x_mean0, double * p_x_variance0, double NoiseVariance, COMPLEX * p_x_Intf, double * p_x_Sigma, int n_IterNum);
int Turbo_SF_ICC(COMPLEX * p_x_Rake, int n_x_RakeLen, double * p_Rou, COMPLEX * p_Mask, int n_MaskLen, COMPLEX * p_x_mean0, double * p_x_variance0, double NoiseVariance, COMPLEX * p_x_Intf, double * p_x_Sigma);







/* _CODE_H_ */
int TurboEncoder(short * p_InfoBit, int * p_CodedBit, CODE_PARAMETER * p_code_parm, int * p_CodeInlvTable);
int TurboDecoder(double * p_SideLLR, double * p_FullLLR, short * p_DecodedBit, CODE_PARAMETER * p_code_Parm, int * p_COdeInlvTable, int n_IterNum);

int	    dot(g, s, Len);
void 	trel_gen(int g0, int g1, int Mem, int * output_matrix, int * nextstate_matrix, int * laststate_matrix, int * tail_bit);
double 	maximum(double a, double b);
double 	g(double a, double b);
void 	interleave(int* imsg, int* msg, int N, int* interleave_table);
void 	deinterleave(int *imsg, int* msg, int N, int* interleave_table);
void 	interleave_double(double* imsg, double* msg, int N, int* interleave_table);
void 	deinterleave_double(double* imsg, double* msg, int N, int* interleave_table);
void 	rsc_encode(int* msg, int* parity, int size, int termination, int g0, int g1, int Mem);
void 	turbo_encode(int* msg, int* stream, int puncture, int Len, int g0 ,int g1, int Mem, int* interleave_table);
void 	turbo_decode(short * decoded, double *	old_llr, double * new_llr, double * llr_all, double * stream, int puncture, int	Len, int iteration, int * interleave_table, int	g0, int	g1, int	Mem);

static double OFFSET[]=
{
   0.69314718055995,   0.67334716722803,   0.65394696731759,   0.63494610159561,
   0.61634377304074,   0.59813886938159,   0.58032996662643,   0.56291533356035,
   0.54589293718008,   0.52926044903028,   0.51301525239995,   0.49715445033211,
   0.48167487439574,   0.46657309416462,   0.45184542734431,   0.43748795048589,
   0.42349651022253,   0.40986673496366,   0.39659404698022,   0.38367367481449,
   0.37110066594778,   0.35886989966032,   0.34697610001895,   0.33541384892973,
   0.32417759919519,   0.31326168751822,   0.30266034739774,   0.29236772186436,
   0.28237787600798,   0.27268480925264,   0.26328246733803,   0.25416475397075,
   0.24532554211252,   0.23675868487647,   0.22845802600647,   0.22041740991845,
   0.21263069128632,   0.20509174415876,   0.19779447059660,   0.19073280882382,
   0.18390074088834,   0.17729229983146,   0.17090157636787,   0.16472272508021,
   0.15874997013467,   0.15297761052607,   0.14740002486257,   0.14201167570186,
   0.13680711345204,   0.13178097985147,   0.12692801104297,   0.12224304025849,
   0.11772100013096,   0.11335692465064,   0.10914595078340,   0.10508331976870,
   0.10116437811507,   0.09738457831082,   0.09373947926743,   0.09022474651321,
   0.08683615215395,   0.08356957461742,   0.08042099819776,   0.07738651241551,
   0.07446231120843,   0.07164469196767,   0.06893005443330,   0.06631489946258,
   0.06379582768381,   0.06136953804768,   0.05903282628797,   0.05678258330208,
   0.05461579346200,   0.05252953286512,   0.05052096753402,   0.04858735157374,
   0.04672602529427,   0.04493441330575,   0.04321002259307,   0.04155044057628,
   0.03995333316243,   0.03841644279436,   0.03693758650123,   0.03551465395525,
   0.03414560553869,   0.03282847042487,   0.03156134467635,   0.03034238936351,
   0.02916982870590,   0.02804194823898,   0.02695709300821,   0.02591366579231,
   0.02491012535737,   0.02394498474308,   0.02301680958230,   0.02212421645488,
   0.02126587127657,   0.02044048772360,   0.01964682569344,   0.01888368980204,
   0.01814992791781,   0.01744442973234,   0.01676612536801,   0.01611398402222,
   0.01548701264817,   0.01488425467192,   0.01430478874529,   0.01374772753438,
   0.01321221654313,   0.01269743297150,   0.01220258460770,   0.01172690875394,
   0.01126967118506,   0.01083016513946,   0.01040771034162,   0.01000165205565,
   0.00961136016903,   0.00923622830606,   0.00887567297007,   0.00852913271400,
   0.00819606733827,   0.00787595711558,   0.00756830204173,   0.00727262111175,
   0.00698845162084,   0.00671534848912,   0.00645288360981,   0.00620064521996
};

/* MCFB */
void cmx_FFT(COMPLEX * fft_in, COMPLEX * fft_out, int n, int order, int flag);
int  tx_MCSFB(COMPLEX * p_InBuffer, int n_sizeInBuffer, COMPLEX * p_OutBuffer, BASEBAND_PARM * p_Baseband_Parm);
int  rx_MCAFB(COMPLEX * p_InBuffer, int n_sizeInBuffer, COMPLEX * p_OutBuffer, BASEBAND_PARM * p_Baseband_Parm);
int  readfilter(char* sz_filterfile, double* filtercoeff);
/* END MCFB */


/*  _ASSEMBLE_FRAME_ */
int AssembleFrame(COMPLEX * p_ModedSym, COMPLEX * p_txSignal, BASEBAND_PARM * p_Baseband_Parm, int n_TxAntenna);
int GenerateGP(COMPLEX * p_cmx_Pilot, COMPLEX * p_cmx_Guard, int n_TxAntenna);
int GeneratePilotMatrix(COMPLEX * PILOT_MATRIX);

/* _RAKE_CHEST_H_ */
int vec_cyc_cov(COMPLEX * x, int n_Len_x, COMPLEX * h, int n_Len_h, COMPLEX * y);
int vec_self_cov(COMPLEX * h, int n_Len_h, COMPLEX * y, int Ns);
int SpaceTimeCombine(COMPLEX * p_rxSignal, int n_rxSignalLen, COMPLEX * p_RakeSignal, COMPLEX * p_h_half, double * Noise_variance, BASEBAND_PARM * p_Baseband_Parm, COMPLEX * PILOT_MATRIX);

int FirstCHEstimate(COMPLEX * p_rxSignal, int n_rxSignalLen, COMPLEX * p_FirstCHEst, COMPLEX * p_Rhh, COMPLEX * p_Rpp, double * p_PathGainEst, BASEBAND_PARM * p_Baseband_Parm, COMPLEX * PILOT_MATRIX);
int RoughlyChannelEst(COMPLEX * p_rxPilot, int n_length, COMPLEX * p_Fades, COMPLEX * PILOT_MATRIX);
int GetCombineMtx(COMPLEX * p_Rhh, int n_Len1, COMPLEX * p_Rpp, int n_Len2, double * p_PathGainEst, COMPLEX * p_CombineMtx, COMPLEX * p_NextCombineMtx, double * Noise_variance);
int SecondCHEstimate(COMPLEX * p_FirstCHEst, int n_InLen, COMPLEX * p_CombineMtx, COMPLEX * p_NextCombineMtx, COMPLEX * p_CHEstimate, int n_InterpFactor);


/* ABSTRACT MODULE */
int SC_Transmitter(int * p_CodedBit, int n_CodedBitLen, COMPLEX * p_txFrame, BASEBAND_PARM * p_Baseband_Parm);
int MC_Transmitter(short * p_InfoBit, int n_InfoBitLength, COMPLEX * p_txSignal, BASEBAND_PARM * p_Baseband_Parm, CODE_PARAMETER * p_code_parm, int * p_CodeInlvTable, int * p_OuterInlvTable);

int SC_SpaceTimeCombine(COMPLEX * p_rxFrame, int n_rxFrameLen, COMPLEX * p_rakeSignal, COMPLEX * p_h_half, double * NoiseVariance, BASEBAND_PARM * p_Baseband_Parm, COMPLEX * PILOT_MATRIX);
int SC_TurboIC_SoftDemod(COMPLEX * p_rakeSignal, int n_SignalLength, COMPLEX * p_h_half, int n_FadeLength, double * p_CodedBitLLR, BASEBAND_PARM  * p_Baseband_Parm, double Noise_variance, int flag);
int MC_Receiver(COMPLEX * p_rxSignal, int n_rxSignalLen, short * p_DecodedBit, BASEBAND_PARM * p_Baseband_Parm, CODE_PARAMETER * p_code_parm, int * p_CodeInlvTable, int * p_OuterInlvTable, int n_DetectIterNum, COMPLEX * PILOT_MATRIX);
int tmpMC_Receiver(short * p_InfoBit, int n_InfoBitLength, COMPLEX * p_rxSignal, int n_rxSignalLen, short * p_DecodedBit, BASEBAND_PARM * p_Baseband_Parm, CODE_PARAMETER * p_code_parm, int * p_CodeInlvTable, int * p_OuterInlvTable, int n_DetectIterNum, COMPLEX * PILOT_MATRIX);
/* END ABSTRACT MODULE */


/* GENERAL LIBRARY */

//Quick Sort (In descending order).
//Note: The input data would be destroied during the function call.
void QuickSort(double * p_Data, int * p_Order, int Count);
void run(double * p_Data, int * p_Order, int left, int right);

//Solve Hermitian matrix's eigen-problem with Jacobi's method.
int  GetMtxEigValueVector(COMPLEX * p_InMtx, int n_MtxSize, double * p_EigenValue, COMPLEX * p_EigenVector);

//Cubic spline interpolation with not-a-knot end condition.
int  cmx_spline(COMPLEX * p_InData, int n_InLen, COMPLEX * p_OutData, int n_InterpFactor);
int  dbl_spline(double  * p_InData, int n_InLen, double  * p_OutData, int n_InterpFactor);
void GetM(double * d, int N);

//Function: Solve a complex system equation a[x1 x2...]=[b1 b2...].
//	    Use cholsky factorization, where matrix a is a postive define matrix.
//          We assume a has this form: a = H'*H+diag{sigma_0,sigma_1,...,sigma_n-1}.
//Warning:  This function call will destroy the original input a and b! 
//          If a or b is still useful in later, you should save it first.
int cholsky_solve_equation(COMPLEX * a, int n_len_a, COMPLEX * b, int n_len_b, COMPLEX * x);

/* END GENERAL LIBRARY */

#endif

/* END _COMMON_H_ */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -