www.pudn.com > WCDMA.rar > TransmitterClass.h
// TransmitterClass.h: interface for the TransmitterClass class. // // Copyright 2002 The Mobile and Portable Radio Research Group // ////////////////////////////////////////////////////////////////////// #if !defined(AFX_TRANSMITTERCLASS_H__5B796C11_11B3_11D5_817F_B57425EF4323__INCLUDED_) #define AFX_TRANSMITTERCLASS_H__5B796C11_11B3_11D5_817F_B57425EF4323__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #include#include #include #include #include #include //#include "Complex.h" //typedef class ComplexNumbertag //{ //public: // double real; // double imaginary; //} ComplexNumber; #define SEQUENCE_LENGTH 50000 #define CHIPS_PER_FRAME 38400 #define BUFFER_LENGTH 18 #define ARRAY_LENGTH 20 #define SLOTS_PER_FRAME 15 #define LOG2(arg) (log( (double) arg)/log( (double) 2.00)) class DPCH_FormatStructure { public: char format[4]; unsigned BitRate; //in kbps double SymbolRate; //in kSps unsigned SF; //Spreading Factor unsigned BitsPerSlot; //Total number of bits per slot unsigned Ndata1; //Number of data bits per slot in 1st data field unsigned Ndata2; //Number of data bits per slot in 2nd data field unsigned Ntpc; //Number of Transmit Power control bits per slot unsigned Ntfci; //Number of TFCI bits per slot unsigned NPilot; //Number of pilot bits per slot unsigned MinSlotsPerFrame; //Minimum number of slots per frame unsigned MaxSlotsPerFrame; //Maximum number of slots per frame unsigned ActualSlotsPerFrame; //The number of slots actually used -> Filled by user }; class CCPCH_FormatStructure { public: unsigned format; unsigned BitRate; //in kbps double SymbolRate; //in kSps unsigned SF; //Spreading Factor unsigned BitsPerFrame; //Total number of bits per frame unsigned BitsPerSlot; //Total number of bits per slot unsigned Ndata; //Number of data bits per slot in data field unsigned NPilot; //Number of pilot bits per slot unsigned Ntfci; //Number of TFCI bits per slot }; class PDSCH_FormatStructure { public: unsigned format; unsigned BitRate; //in kbps double SymbolRate; //in kSps unsigned SF; //Spreading Factor unsigned BitsPerFrame; //Total number of bits per frame unsigned BitsPerSlot; //Total number of bits per slot unsigned Ndata; //Number of data bits per slot in data field }; class TransmitterConfigClass { public: bool STTDflag; //TRUE of STTD is employed, otherwise FALSE //Desired DPCH DPCH_FormatStructure DesiredDPCHformat; //Format configuration for the desired DPCH int *DesiredChannelCode; //Pointer to the Channelization Code for the desired ComplexNumber *DesiredScrambleCode; //Pointer to the Scramble Code for the desired frame unsigned DesiredTPCcommand; //TPC command: Either a 0 or a 1 //All other DPCHs unsigned NumOtherDPCH; //Number of other (undesired) DPCHs DPCH_FormatStructure *OtherDPCHformat; //Pointer to an array of format configs for the remaining DPCHs int **OtherChannelCodes; //Pointer to an array of pointers, each which points to a different channelization code ComplexNumber **OtherScrambleCodes; //Pointer to an array of pointers, each which points to a different scramble code unsigned OtherTPCcommand; //Each channel has the same TPC command //DPCCHforCPCH unsigned NumDPCCHforCPCH; //Number of channels int **DPCCHforCPCHChanCodes;//Pointer to an array of pointers, each which points to a different channelization code ComplexNumber **DPCCHforCPCHScrambleCodes; //Pointer to an array of pointers, each which points to a different scramble code unsigned DPCCHforCPCH_TPCcommand;//Each channel has the same TPC command //P_CPICH ComplexNumber *P_CPICHScrambleCode; //Pointer to ScrambleCode for P_CPICH //S_CPICH unsigned NumS_CPICH; //Number of channels int **S_CPICHChanCodes; //Pointer to an array of pointers, each which points to a different channelization code ComplexNumber **S_CPICHScramCodes; //Pointer to an array of pointers, each which points to a different scramble code //P_CCPCH int *P_CCPCHChanCode; //Pointer to the array containing the channelization code ComplexNumber *P_CCPCHScramCode; //Pointer to the array containing the scamble code //S_CCPCH CCPCH_FormatStructure S_CCPCHformat; //Format configuratino fo rhte S_CCPCH int *S_CCPCHChanCode; //Pointer to the array containing the channelization code ComplexNumber *S_CCPCHScramCode; //Pointer to the array containing the scamble code //PDSCH PDSCH_FormatStructure PDSCHformat; //Format configuratino fo rhte PDSCH int *PDSCHChanCode; //Pointer to the array containing the channelization code ComplexNumber *PDSCHScramCode; //Pointer to the array containing the scamble code //P_SCH and S_SCH double A; //Modulation Symbol //S_SCH only int *SSC; //Pointer to the Secondary Synchronization Codes unsigned *SSCtoSCHmap; //Pointer to the mapping from the SSC to the S_SCH sequence //Gains double *Gains; //Poiner to the vector that contains all of the gains //TimeOffsets int *TimingOffset; //Pointer to the array that contains the timing offset for each channel }; class PCHFrameClass { public: ComplexNumber *DesiredDPCH; //Pointer to the desired DPCH frame unsigned NumOtherDPCHs; //Number of remaining DPCHs ComplexNumber ** OtherDPCHs; //Array of Pointers to the remaining DPCH frames unsigned NumDPCCHforCPCH; //Number of DPCCH for CPCH frames ComplexNumber **DPCCHforCPCH; //Array of Pointers to the DPCCH for CPCH frames ComplexNumber *P_CPICH; //Pointer to the P_CPICH frame unsigned NumS_CPICH; //Number of S_CPICH frames ComplexNumber **S_CPICH; //Array of Pointers to the S_CPICH frames ComplexNumber *P_CCPCH; //Pointer to the P_CCPCH frame ComplexNumber *S_CCPCH; //Pointer to the S_CCPCH frame ComplexNumber *PDSCH; //Pointer to the PDSCH frame ComplexNumber *P_SCH; //Pointer to the P_SCH frame ComplexNumber *S_SCH; //Pointer to the S_SCH frame int *DataBitsPtr; //Pointer to the desired DataBits PCHFrameClass(); ConfigurePCHframe(TransmitterConfigClass Tx); virtual ~PCHFrameClass(); }; class GainStructure { public: double DesiredDPCH; //Gain for the desired DPCH double *OtherDPCH; //Pointer to the array of gains for the remaining DPCHs double *DPCHforCPCH; //Pointer to the array of gains for the DPCH for CPCH double P_CPICH; //Gain for hte P_CPICH double *S_CPICH; //Pointer to the array of gains for the S_CPICH double P_CCPCH; //Gain for the P_CCPCH double S_CCPCH; //Gain for the S_CCPCH double PDSCH; //Gain for the PDSCH double P_SCH; //Gain for the P_SCH double S_SCH; //Gain for the S_SCH }; class TimingStructure { public: int DesiredDPCH; //Gain for the desired DPCH int *OtherDPCH; //Pointer to the array of gains for the remaining DPCHs int *DPCHforCPCH; //Pointer to the array of gains for the DPCH for CPCH int P_CPICH; //Gain for hte P_CPICH int *S_CPICH; //Pointer to the array of gains for the S_CPICH int P_CCPCH; //Gain for the P_CCPCH int S_CCPCH; //Gain for the S_CCPCH int PDSCH; //Gain for the PDSCH int P_SCH; //Gain for the P_SCH int S_SCH; //Gain for the S_SCH }; class TransmittedFrameClass { public: ComplexNumber *Chips; int *DataBits; }; class TransmitterClass { public: int DumpPCHframe(bool STTDflag); TransmitterClass(SimConfigClass Config); virtual ~TransmitterClass(); TransmitterConfigClass TxConfiguration; TransmittedFrameClass PreviousFrame; TransmittedFrameClass CurrentFrame; TransmittedFrameClass NextFrame; TransmittedFrameClass GenerateFrame(); TransmittedFrameClass GenerateInitialFrame(); private: void CodeManager(unsigned PrimaryScrambleCode, unsigned *SecondaryScrambleCode); void ShiftandAccumulate(int Offset,ComplexNumber *PreviousFrame,ComplexNumber *CurrentFrame,ComplexNumber *NextFrame,double gain,ComplexNumber *RadioFrame); ComplexNumber * GenerateControlFrame(PCHFrameClass *PCHframe); PCHFrameClass PreviousPCHframe; //Pointers to the physical channels associated with the preveious frame PCHFrameClass CurrentPCHframe; //Pointers to the physical channels associated with the current frame PCHFrameClass NextPCHframe; //Pointers to the physical channels associated with the next frame void GeneratePCHframe(TransmitterConfigClass TxConfiguration,PCHFrameClass *RadioFrame); //Generates the PH channels for a particular frame //And stores the pointers in a PCHFrameClass Object int GetTiming(); unsigned * GetSSCtoSCHmap(unsigned ScrambleCodeGroup); ComplexNumber * GenSSC(); int * GetChannelCodeBasePointer(unsigned SF, int **ChanCodeBasePtrs); ComplexNumber * GenP_SCH(double A, bool STTDflag); ComplexNumber * GenS_SCH(ComplexNumber *SSC,unsigned *SSCtoSCHmap, double A, bool STTDflag); ComplexNumber * GenPDSCH(PDSCH_FormatStructure format, int *ChannelCode, ComplexNumber *ScrambleCode, bool STTDflag); ComplexNumber * GenP_CCPCH(int *ChanCode, ComplexNumber *ScrambleCode, bool STTDflag); ComplexNumber * GenS_CCPCH(CCPCH_FormatStructure format,int *ChannelCode, ComplexNumber *ScrambleCode, bool STTDflag); ComplexNumber * GenS_CPICH(bool STTDflag,ComplexNumber *ScrambleCode,int *ChannelCode); ComplexNumber * GenP_CPICH(bool STTDflag,ComplexNumber *ScrambleCode); ComplexNumber *GenDPCCHforCPCH(int *ChanCode,ComplexNumber *ScrambleCode,unsigned TPCCommand,bool STTDflag); ComplexNumber *GenDPCH(DPCH_FormatStructure format,int *ChanCode,ComplexNumber *ScrambleCode,unsigned TPCCommand,bool STTDflag,bool DesiredFrame,int *DesiredData); ComplexNumber *ScrambleCode(unsigned N); int FillDesiredFrame(DPCH_FormatStructure format,int *PilotPtr,unsigned TPCCommand,ComplexNumber *FrameBufferPtr,int *DataBitsPtr,int *DesiredDataPtr); int FillUndesiredFrame(DPCH_FormatStructure format,int *PilotPtr,unsigned TPCCommand,ComplexNumber *FrameBufferPtr,int *DataBitsPtr); double UniformRandomNumberGenerator(int *idum); int * OVSF_Code(unsigned SF); int STTDcodeDPCH(ComplexNumber *FrameBufferPtr,DPCH_FormatStructure format,unsigned SymbolsPerFrame); int *Hadamard( unsigned N ); ComplexNumber *P_SCHptr; ComplexNumber *S_SCHptr; ComplexNumber *ScrambleSequencePtr; int *Chan4,*Chan8,*Chan16,*Chan32,*Chan64,*Chan128,*Chan256,*Chan512; ComplexNumber *P_CPICHptr; GainStructure Gains; TimingStructure Timing,RelativeOffset; }; #endif // !defined(AFX_TRANSMITTERCLASS_H__5B796C11_11B3_11D5_817F_B57425EF4323__INCLUDED_)