📄 common.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 + -