📄 dqpsktransmitter.cpp
字号:
/********************************************************************
* DQPSKtransmitter -- processed and transmits discrete samples *
* Functions -- SetParameters, transmit *
* Inputs -- number of symbols and training symbols *
* Returns -- void *
* Note: default number of symbols are 100 where all are training *
* symbols, also there is NO timing offset in TX. *
********************************************************************/
/* user included files. Each file represents one class definition */
#include "SignalGenerator.cpp"
#include "DiffEncoder.cpp"
#include "ImpulseGenerator.cpp"
#include "RRcFilter.cpp"
#include "modulator.cpp"
/* #include "DAconverter.cpp" */ /* used when D/A board is presented */
class DQPSKtransmitter {
private:
long int NumSymbols; /* number of symbols to be sent */
int TrainingSymbols; /* number of symbols used in training mode */
double PhaseShift; /* carrier phase shift in radians */
double symbol; /* temparory storage */
double CosRailSymbol,SinRailSymbol; /* symbol to be processed */
double CosRailSample,SinRailSample; /* sample to be processed */
double ChannelSample;
/* Object definition */
SignalGenerator SG;
DiffEncoder DE;
ImpulseGenerator IG1; /* for cos rail */
ImpulseGenerator IG2; /* for sin rail */
RRcFilter RRCF1; /* filter for cos(or I) rail */
RRcFilter RRCF2; /* filter for sin(or Q) rail */
modulator MR; /* 2 times base band signalfreq. phase shift=0(rad) */
/* DAconverter DA; /* software interface to D/A board */
public:
DQPSKtransmitter()
{ NumSymbols=100; TrainingSymbols=100; PhaseShift=0; }
void SetParameters(long int NumSym, int TrainSym, double phase)
{ NumSymbols=NumSym; TrainingSymbols=TrainSym; PhaseShift=phase;}
void transmit(char ChannelFileName[],char DataFileName[]);
};
/******************************************************************
* This function transmits a specific number of symbols including *
* training symbols and writes to a file specified by the user. *
******************************************************************/
void DQPSKtransmitter::transmit(char ChannelFileName[],char DataFileName[])
{ ofstream WriteChannelFile(ChannelFileName,ios::out);
ofstream WriteDataFile(DataFileName,ios::out);
cout<<"Transmitting "<<2*NumSymbols<<"("<<2*TrainingSymbols<<" for training)";
cout<<"bits..."<<endl;
/* only one sample is processed for each loop time */
for (int i=0; i<(NumSymbols*8); ++i)
{ if (((i%8)==0)&&(i<TrainingSymbols*8)) /* training mode */
{ if (i>=((TrainingSymbols-5)*8)) /* 10 zeros for data mode */
symbol=DE.EncodeSymbol(SG.GenZero(),SG.GenZero());
else
symbol=DE.EncodeSymbol(SG.GenOne(),SG.GenOne());
CosRailSymbol=cos(symbol);
SinRailSymbol=sin(symbol);
MR.ShiftPhase(PhaseShift,0); /* default phase shift is zero */
}
if (((i%8)==0)&&(i>=(TrainingSymbols*8))) /* data mode */
{ int temp1,temp2;
temp1=SG.GenRandomBit(); temp2=SG.GenRandomBit();
symbol=DE.EncodeSymbol(temp1,temp2);
CosRailSymbol=cos(symbol);
SinRailSymbol=sin(symbol);
MR.ShiftPhase(PhaseShift,0); /* default phase shift is zero */
WriteDataFile<<temp1<<endl<<temp2<<endl;
}
CosRailSample=IG1.GenImpulse(CosRailSymbol); /* Generate Impulse */
SinRailSample=IG2.GenImpulse(SinRailSymbol);
ChannelSample=MR.CosModulation(RRCF1.conv(CosRailSample))-
MR.SinModulation(RRCF2.conv(SinRailSample));
// if ((i%50000)!=0) /* timing drift */
WriteChannelFile<<ChannelSample<<endl;
/* Send sample to D/A board. Used when D/A board is presented. */
/* DA.SendSample(DA.MapSample(ChannelSample)); */
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -