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

📄 rxmain.c

📁 MIMO 2x2接收端选择全系统仿真代码
💻 C
📖 第 1 页 / 共 4 页
字号:
#endif

	/* Initialize the pointers */
	fCplxTempBufferFilt1.pIBuffer = pTempBuffer1I;
	fCplxTempBufferFilt1.pQBuffer = pTempBuffer1Q;
	fCplxTempBufferFilt2.pIBuffer = pTempBuffer2I;
	fCplxTempBufferFilt2.pQBuffer = pTempBuffer2Q;

	fCplxTempBuffer1.pIBuffer = &pTempBuffer1I[MFFILTLEN-1];
	fCplxTempBuffer1.pQBuffer = &pTempBuffer1Q[MFFILTLEN-1];
	fCplxTempBuffer2.pIBuffer = &pTempBuffer2I[MFFILTLEN-1];
	fCplxTempBuffer2.pQBuffer = &pTempBuffer2Q[MFFILTLEN-1];
	
	fCplxSymbolBuffer1.pIBuffer = pfSymbolBuffer1I;
	fCplxSymbolBuffer1.pQBuffer = pfSymbolBuffer1Q;
	fCplxSymbolBuffer2.pIBuffer = pfSymbolBuffer2I;
	fCplxSymbolBuffer2.pQBuffer = pfSymbolBuffer2Q;
	
	fCplxWorkBuf1.pIBuffer = pfWorkBuf1;
	fCplxWorkBuf1.pQBuffer = pfWorkBuf2;
	fCplxWorkBuf2.pIBuffer = pfWorkBuf3;
	fCplxWorkBuf2.pQBuffer = pfWorkBuf4;

	/* Initialize receiver states */
	ReceiverState.RcvState = eRX_RCVIDLE;
	ReceiverState.iSyncRep = 1;
	ReceiverState.uiStartIndex = 0;
	ReceiverState.uFileSize = 0;
	ReceiverState.uNoOfBlocks = 0;

	/* Initialize the states for the downconversion */
	DownConvState.fInterFreq = INTERFREQ;
	DownConvState.unPhaseIndex = 0;
	DownConvState.fPhaseDeci = 0.0f;

	/* Initialize the states for the energy detection */
	// init with a negative value so that it will collect statistics first
	EnergyDetState.fEnergyThrs = -1.0f;
	EnergyDetState.fNoisePower1 = -1.0f;
	EnergyDetState.fNoisePower2 = -1.0f;
	EnergyDetState.unEnergyBlock = ENERGYBLOCK;
	EnergyDetState.iStartIndex = -1;

	/* Initialize the PLL parameters */
	PLLparam.alpha = 0.8f;
	PLLparam.beta = 0.2f;
	PLLparam.delta_avg = 0.0f;
	PLLparam.delta = 0.0f;
	PLLparam.loop_gain = 0.11f;
	PLLparam.theta = 0.0f;

	/* Initialize the switch states */
	SwitchState.uiAnteSelType = eAnteMMNP;
	SwitchState.uiPosSwitch1 = eSWITCH1;
	SwitchState.uiPosSwitch2 = eSWITCH3;
	// the uiPosXSetSwitchY states are initialized in the RxState eRX_INIT

	//MFDemodStat1.uiSymbBuffLen = sizeof(pfSymbolBuffer1I)/sizeof(&pfSymbolBuffer1I[0]);
	/* Initialize the demodulator (matched filter and downsampling) states */
	MFDemodStat1.pCplxInBuff = &fCplxTempBufferFilt1;
	MFDemodStat1.uiRcvSigLen = 0;
	MFDemodStat1.pfCplxOutBuff = &fCplxWorkBuf1;
	MFDemodStat1.iStartIndex = 0;
//	MFDemodStat1.uiNextWriteSamp = 0;
	MFDemodStat1.pfCplxSymbBuff = &fCplxSymbolBuffer1;
	MFDemodStat1.uiNoOfSymb = 0;
	MFDemodStat1.uiNextReadSymb = 0;
	MFDemodStat1.uiNextWriteSymb = 0;
	MFDemodStat1.uibuflen = SYMBOLBUFFLEN;
	MFDemodStat2.pCplxInBuff = &fCplxTempBufferFilt2;
	MFDemodStat2.uiRcvSigLen = 0;
	MFDemodStat2.pfCplxOutBuff = &fCplxWorkBuf2;
	MFDemodStat2.iStartIndex = 0;
//	MFDemodStat2.uiNextWriteSamp = 0;
	MFDemodStat2.pfCplxSymbBuff = &fCplxSymbolBuffer2;
	MFDemodStat2.uiNoOfSymb = 0;
	MFDemodStat2.uiNextReadSymb = 0;
	MFDemodStat2.uiNextWriteSymb = 0;
	MFDemodStat2.uibuflen = SYMBOLBUFFLEN;

	/* Initialize the syncronization states */
	SyncState.pfRcv1I = pfWorkBuf1;
	SyncState.pfRcv1Q = pfWorkBuf2;
	SyncState.pfRcv2I = pfWorkBuf3;
	SyncState.pfRcv2Q = pfWorkBuf4;
	SyncState.uiRcvBuffLen = 0;
	SyncState.iSyncIndex = 0.0f;

	/* Initialize the channel estimation states */
	ChannelState.alpha = 0.0f; //0.5f;
	ChannelState.Ch1Switch = eSWITCH1;
	ChannelState.Ch2Switch = eSWITCH3;
	ChannelState.pfCplxSymbBuff1 = &fCplxChSymbBuff1;
	fCplxChSymbBuff1.pIBuffer = pfSymbolBuffer1I;
	fCplxChSymbBuff1.pQBuffer = pfSymbolBuffer1Q;
	ChannelState.pfCplxSymbBuff2 = &fCplxChSymbBuff2;
	fCplxChSymbBuff2.pIBuffer = pfSymbolBuffer2I;
	fCplxChSymbBuff2.pQBuffer = pfSymbolBuffer2Q;
	ChannelState.ioffset = 0;
	ChannelState.ibuflen = SYMBOLBUFFLEN;
	memset(pH_pre_r, 0, 8*sizeof(float));
	memset(pH_pre_i, 0, 8*sizeof(float));

	/* Initialize the detector states */
    DetectorStat.pcDataBuff = pDataBuff;
    DetectorStat.pfCplxSymbBuff_1 = &fCplxSymbolBuffer1;
    DetectorStat.pfCplxSymbBuff_2 = &fCplxSymbolBuffer2;
    DetectorStat.uiNoOfSymb = 0;
    DetectorStat.uiNextSymb = 0;
    DetectorStat.iWhichByte = 0;
    DetectorStat.uiNextWriteByte = 0;
    DetectorStat.nibble = 0;
    // possible choices for the detector type: eRX_ML, eRX_ZF, eRX_JMMSE
    DetectorStat.detect_type = eRX_ZF;
    DetectorStat.uiBytesWritten = 0;
    DetectorStat.uiBufLen = SYMBOLBUFFLEN;

	/* Initialize the HostComm*/


	HostCommState.pRxState = &(ReceiverState.RcvState);
	HostCommState.puiFileSizeHat = &(ReceiverState.uFileSize);
	HostCommState.pTxMode = &(ReceiverState.RxMethod);
	HostCommState.puiFrameNbr = &(ReceiverState.uFrameNo);
	HostCommState.piSyncRep = &(ReceiverState.iSyncRep);
	HostCommState.puiNoOfBlocks = &(ReceiverState.uNoOfBlocks);
	HostCommState.puiDetector = &(DetectorStat.detect_type);
	HostCommState.puiAntennaSelection= &(SwitchState.uiAnteSelType); 
	HostCommState.puiPosSwitch1 = &(SwitchState.uiPos2SetSwitch1);
	HostCommState.puiPosSwitch2 = &(SwitchState.uiPos2SetSwitch2);

	startEdma();			   // Setup and enable EDMA transfer
	tskHostCommInitialize();  

	#ifdef _DEBUGLOG
    	LOG_printf(&trace,"Initialization finished");
	#endif
}


/* --- Threads ------------------------------------------------------------ */

/****************************************************************************
  Function    : processBuffer()
 ****************************************************************************

  Description : Preprocesses the samples (energy computation, downconverstion,
  				demodulation).

  Inputs      : none

  Outputs     : none

  By          : 2005-04-18 Adrian Schumacher, created
  				2005-05-04 Adrian Schumacher, setup of the frame-work
  				2005-05-17 Adrian Schumacher, lots of modifications, moved
  						   parts of the state machine to the newly introduced
  						   receiver task.

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

void processBuffer(void)
{
    Uint32 pingPong;
    unsigned int uiTemp;
    static int iWeakSignal;
    //static int iStartIndex;
    //static unsigned int uiFracFrame;
    //static unsigned int uTimeIndex;
    
    /* Get contents of mailbox posted by edmaHwi */
    pingPong =  SWI_getmbox();

#ifdef _DEBUG
	if (BufferLock <= 0) {
		BufferLock++;
#endif
    /* check which buffer has to be filled */
    if (pingPong == PING) {
    	/* PING */
    	pBufferXmt = gBufferXmtPing;
    	pBufferRcv = gBufferRcvPing;
    } else {
    	/* PONG */
    	pBufferXmt = gBufferXmtPong;
    	pBufferRcv = gBufferRcvPong;
    }
#ifdef _DEBUGLOG
//	LOG_printf("Rcv: p%, Xmt: p%", pBufferRcv, pBufferXmt);
//	LOG_printf("s: d%, e: d%", (int)pBufferRcv[0], (int)pBufferRcv[BUFFSIZE-1]);
#endif

    /* Switch on LED #0 as a visual cue */
    //DSK6713_LED_on(0);
    //DSK6713_LED_toggle(0);
	switch(RxState){
		case eRX_INIT:
			// initialize variables
			uiBuffCount = 0;
			iWeakSignal = 0;
			iSampIdxError = 0;
			RxState = eRX_FINDSTART;
            ReceiverState.iSyncStarted = FALSE;
			// for the first frame we are not able to switch accurately, therefore we use fixed channels
			SwitchState.uiPos1SetSwitch1 = eSWITCH1;
			SwitchState.uiPos1SetSwitch2 = eSWITCH3;
			SwitchState.uiPos2SetSwitch1 = eSWITCH1;
			SwitchState.uiPos2SetSwitch2 = eSWITCH3;
			// reset switch
			memset(pBufferXmt,0,BUFFSIZE*sizeof(Int16));
			// no brake here!
		case eRX_FINDSTART:
			// idle state: wait and search for the start of a transmission
			computeEnergy(pBufferRcv,BUFFSIZE,&EnergyDetState);
			if (EnergyDetState.iStartIndex >= 0)
			{
				// signal found, assume start of a transmission
				iWeakSignal = 0;
				uiTemp = BUFFSIZE;
				if (uiBuffCount == 0)
				{
					uiTemp = BUFFSIZE - EnergyDetState.iStartIndex;
					uiBuffIndex = 0;
					ReceiverState.uiStartIndex = (unsigned int)EnergyDetState.iStartIndex; //EnergyDetState.iStartIndex will always be >=0 here
				}
				// copy the already received samples into the working buffer (converted to float) which will be used by the pll
				CpyConvInt2Float(&pBufferRcv[EnergyDetState.iStartIndex],&pfWorkingBuffer[uiBuffIndex/2],uiTemp/2);
				uiBuffIndex += uiTemp;
				uiBuffCount++;
				if (uiBuffIndex > IFSYNCSAMP*2)
				{
					// enough samples collected for PLL synchronization
					ReceiverState.RcvState = eRX_RUNPLL;
					SEM_post(&rxsem); // post a semaphore to resume the receiver task
					// change the state
					RxState = eRX_RECSYNC;
					#ifdef _DEBUGLOG
						LOG_printf(&trace,"change state to eRX_RECSYNC (line %d)",__LINE__);
					#endif
				}
			}
			else
			{
				// energy
				iWeakSignal++;
				if (iWeakSignal > 5)
				{
					// reset states (reset reception)
					uiBuffCount = 0;
				}
			}
			/*#ifdef _DEBUGLOG
				//LOG_printf(&trace,"state eRX_FINDSTART");
				LOG_printf(&trace,"noise power 1: %g, noise power 2: %g",EnergyDetState.fNoisePower1,EnergyDetState.fNoisePower2);
				LOG_printf(&trace,"threshold: %g, start index: %d",EnergyDetState.fEnergyThrs,EnergyDetState.iStartIndex);
			#endif*/
			break;
		case eRX_RECSYNC: // process received streams
			// downconvert, filter, and split channels
			downconvert(pBufferRcv,&fCplxTempBuffer1,&fCplxTempBuffer2,&DownConvState,BUFFSIZE);
			// run matched filter on channel 1
			MFDemodStat1.uiRcvSigLen += BUFFSIZE/2;
			matchedFilter(&MFDemodStat1);
			// run matched filter on channel 2
			MFDemodStat2.uiRcvSigLen += BUFFSIZE/2;
			matchedFilter(&MFDemodStat2);
            if (ReceiverState.iSyncStarted == TRUE)
            {
                // update the switch control
//                switch_control(pBufferXmt, BUFFSIZE, FRAMESAMPLENGTH, &SwitchState, ReceiverState.iSyncRep, iSyncCtrl);
            }
			// post a semaphore to resume the receiver task
			SEM_post(&rxsem);
      		break;
		case eRX_RECEIVE: // process received streams
			// downconvert, filter, and split channels
			downconvert(pBufferRcv,&fCplxTempBuffer1,&fCplxTempBuffer2,&DownConvState,BUFFSIZE);
			// run matched filter on channel 1
			MFDemodStat1.uiRcvSigLen = BUFFSIZE/2;
			matchedFilter(&MFDemodStat1);
			// run matched filter on channel 2
			MFDemodStat2.uiRcvSigLen = BUFFSIZE/2;
			matchedFilter(&MFDemodStat2);
		    // demodulate/downsample channel 1
		    downsampling(&MFDemodStat1);
		    // demodulate/downsample channel 2
		    downsampling(&MFDemodStat2);
            if (ReceiverState.iSyncStarted == TRUE)
            {
                // update the switch control
//                switch_control(pBufferXmt, BUFFSIZE, FRAMESAMPLENGTH, &SwitchState, ReceiverState.iSyncRep, iSyncCtrl);

⌨️ 快捷键说明

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