📄 copy of rxmain.c
字号:
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
/*
n=0;
while(n<BUFFSIZE)
{
pfWorkBuf1[n] = (float)(n % 10);
pfWorkBuf2[n] = (float)(n % 10);
n++;
}
MFDemodStat1.uiRcvSigLen = 11;
MFDemodStat1.iStartIndex = 0;
MFDemodStat1.uiNoOfSymb = 0;
MFDemodStat1.uiNextReadSymb = 0;
MFDemodStat1.uiNextWriteSymb = 0;
n = 0;
fCplxWorkBuf1.pIBuffer = &pfWorkBuf1[n];
fCplxWorkBuf1.pQBuffer = &pfWorkBuf2[n];
for(i=0;i<100;i++)
{
downsampling(&MFDemodStat1);
n += MFDemodStat1.uiRcvSigLen;
fCplxWorkBuf1.pIBuffer = &pfWorkBuf1[n];
fCplxWorkBuf1.pQBuffer = &pfWorkBuf2[n];
}
*/
/*
n=0;
while(n<BUFFSIZE)
gBufferRcvPing[n++] = 10000;
n=0;
downconvert(&gBufferRcvPing[n],&fCplxTempBufferFilt1,&fCplxTempBufferFilt2,&DownConvState,100);
n+=100;
fCplxTempBufferFilt1.pIBuffer = &pTempBuffer1I[n/2];
fCplxTempBufferFilt1.pQBuffer = &pTempBuffer1Q[n/2];
fCplxTempBufferFilt2.pIBuffer = &pTempBuffer2I[n/2];
fCplxTempBufferFilt2.pQBuffer = &pTempBuffer2Q[n/2];
downconvert(&gBufferRcvPing[n],&fCplxTempBufferFilt1,&fCplxTempBufferFilt2,&DownConvState,100);
n+=100;
fCplxTempBufferFilt1.pIBuffer = &pTempBuffer1I[n/2];
fCplxTempBufferFilt1.pQBuffer = &pTempBuffer1Q[n/2];
fCplxTempBufferFilt2.pIBuffer = &pTempBuffer2I[n/2];
fCplxTempBufferFilt2.pQBuffer = &pTempBuffer2Q[n/2];
downconvert(&gBufferRcvPing[n],&fCplxTempBufferFilt1,&fCplxTempBufferFilt2,&DownConvState,100);
n+=100;
fCplxTempBufferFilt1.pIBuffer = &pTempBuffer1I[n/2];
fCplxTempBufferFilt1.pQBuffer = &pTempBuffer1Q[n/2];
fCplxTempBufferFilt2.pIBuffer = &pTempBuffer2I[n/2];
fCplxTempBufferFilt2.pQBuffer = &pTempBuffer2Q[n/2];
downconvert(&gBufferRcvPing[n],&fCplxTempBufferFilt1,&fCplxTempBufferFilt2,&DownConvState,100);
n+=100;
fCplxTempBufferFilt1.pIBuffer = &pTempBuffer1I[n/2];
fCplxTempBufferFilt1.pQBuffer = &pTempBuffer1Q[n/2];
fCplxTempBufferFilt2.pIBuffer = &pTempBuffer2I[n/2];
fCplxTempBufferFilt2.pQBuffer = &pTempBuffer2Q[n/2];
downconvert(&gBufferRcvPing[n],&fCplxTempBufferFilt1,&fCplxTempBufferFilt2,&DownConvState,100);
n+=100;
fCplxTempBufferFilt1.pIBuffer = &pTempBuffer1I[n/2];
fCplxTempBufferFilt1.pQBuffer = &pTempBuffer1Q[n/2];
fCplxTempBufferFilt2.pIBuffer = &pTempBuffer2I[n/2];
fCplxTempBufferFilt2.pQBuffer = &pTempBuffer2Q[n/2];
downconvert(&gBufferRcvPing[n],&fCplxTempBufferFilt1,&fCplxTempBufferFilt2,&DownConvState,100);
n+=100;
fCplxTempBufferFilt1.pIBuffer = &pTempBuffer1I[n/2];
fCplxTempBufferFilt1.pQBuffer = &pTempBuffer1Q[n/2];
fCplxTempBufferFilt2.pIBuffer = &pTempBuffer2I[n/2];
fCplxTempBufferFilt2.pQBuffer = &pTempBuffer2Q[n/2];
downconvert(&gBufferRcvPing[n],&fCplxTempBufferFilt1,&fCplxTempBufferFilt2,&DownConvState,100);
n+=100;
fCplxTempBufferFilt1.pIBuffer = &pTempBuffer1I[n/2];
fCplxTempBufferFilt1.pQBuffer = &pTempBuffer1Q[n/2];
fCplxTempBufferFilt2.pIBuffer = &pTempBuffer2I[n/2];
fCplxTempBufferFilt2.pQBuffer = &pTempBuffer2Q[n/2];
downconvert(&gBufferRcvPing[n],&fCplxTempBufferFilt1,&fCplxTempBufferFilt2,&DownConvState,100);
n+=100;
fCplxTempBufferFilt1.pIBuffer = &pTempBuffer1I[n/2];
fCplxTempBufferFilt1.pQBuffer = &pTempBuffer1Q[n/2];
fCplxTempBufferFilt2.pIBuffer = &pTempBuffer2I[n/2];
fCplxTempBufferFilt2.pQBuffer = &pTempBuffer2Q[n/2];
downconvert(&gBufferRcvPing[n],&fCplxTempBufferFilt1,&fCplxTempBufferFilt2,&DownConvState,100);
n+=100;
fCplxTempBufferFilt1.pIBuffer = &pTempBuffer1I[n/2];
fCplxTempBufferFilt1.pQBuffer = &pTempBuffer1Q[n/2];
fCplxTempBufferFilt2.pIBuffer = &pTempBuffer2I[n/2];
fCplxTempBufferFilt2.pQBuffer = &pTempBuffer2Q[n/2];
downconvert(&gBufferRcvPing[n],&fCplxTempBufferFilt1,&fCplxTempBufferFilt2,&DownConvState,100);
n+=100;
fCplxTempBufferFilt1.pIBuffer = &pTempBuffer1I[n/2];
fCplxTempBufferFilt1.pQBuffer = &pTempBuffer1Q[n/2];
fCplxTempBufferFilt2.pIBuffer = &pTempBuffer2I[n/2];
fCplxTempBufferFilt2.pQBuffer = &pTempBuffer2Q[n/2];
*/
}
/* --- 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;
}
/* 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
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -