16#include "IEEE802_11.h"
17#include "IEEE802_11_Phy.h"
26void fn_NetSim_IEEE802_11ax_OFDM_MIMO_init(NETSIM_ID nDeviceId,NETSIM_ID nInterfaceId)
30 PIEEE802_11_PHY_VAR phy = IEEE802_11_PHY(nDeviceId,nInterfaceId);
34 if(phy->dChannelBandwidth == 20)
36 phy->PHY_TYPE.ofdmPhy_11ax.nCH_BANDWIDTH = HE_CBW20;
37 phy->PHY_TYPE.ofdmPhy_11ax.
nNSD = 234;
38 phy->PHY_TYPE.ofdmPhy_11ax.
nNSP = 8;
39 phy->PHY_TYPE.ofdmPhy_11ax.
nNST = 242;
40 phy->PHY_TYPE.ofdmPhy_11ax.
nNSR = 122;
41 phy->PHY_TYPE.ofdmPhy_11ax.
nFFT = 256;
43 else if(phy->dChannelBandwidth == 40)
45 phy->PHY_TYPE.ofdmPhy_11ax.nCH_BANDWIDTH = HE_CBW40;
46 phy->PHY_TYPE.ofdmPhy_11ax.
nNSD = 468;
47 phy->PHY_TYPE.ofdmPhy_11ax.
nNSP = 16;
48 phy->PHY_TYPE.ofdmPhy_11ax.
nNST = 484;
49 phy->PHY_TYPE.ofdmPhy_11ax.
nNSR = 244;
50 phy->PHY_TYPE.ofdmPhy_11ax.
nFFT = 512;
52 else if(phy->dChannelBandwidth == 80)
54 phy->PHY_TYPE.ofdmPhy_11ax.nCH_BANDWIDTH = HE_CBW80;
55 phy->PHY_TYPE.ofdmPhy_11ax.
nNSD = 980;
56 phy->PHY_TYPE.ofdmPhy_11ax.
nNSP = 16;
57 phy->PHY_TYPE.ofdmPhy_11ax.
nNST = 996;
58 phy->PHY_TYPE.ofdmPhy_11ax.
nNSR = 500;
59 phy->PHY_TYPE.ofdmPhy_11ax.
nFFT = 1024;
63 phy->PHY_TYPE.ofdmPhy_11ax.nCH_BANDWIDTH = HE_CBW160;
64 phy->PHY_TYPE.ofdmPhy_11ax.
nNSD = 1960;
65 phy->PHY_TYPE.ofdmPhy_11ax.
nNSP = 32;
66 phy->PHY_TYPE.ofdmPhy_11ax.
nNST = 1992;
67 phy->PHY_TYPE.ofdmPhy_11ax.
nNSR = 1012;
68 phy->PHY_TYPE.ofdmPhy_11ax.
nFFT = 2048;
73 phy->PHY_TYPE.ofdmPhy_11ax.
dDeltaF = phy->dChannelBandwidth/ (phy->PHY_TYPE.ofdmPhy_11ax.
nFFT * 1.0);
75 phy->PHY_TYPE.ofdmPhy_11ax.
dTDFT = 12.8;
77 phy->PHY_TYPE.ofdmPhy_11ax.
dTGIL_LTF = 1.6;
78 phy->PHY_TYPE.ofdmPhy_11ax.
dTGI1 = 0.8;
79 phy->PHY_TYPE.ofdmPhy_11ax.
dTGI2 = 1.6;
80 phy->PHY_TYPE.ofdmPhy_11ax.
dTGI4 = 3.2;
82 if(phy->nGuardInterval == 800)
84 else if(phy->nGuardInterval == 1600)
89 phy->PHY_TYPE.ofdmPhy_11ax.
dTSYM1 = 13.6;
90 phy->PHY_TYPE.ofdmPhy_11ax.
dTSYM2 = 14.4;
91 phy->PHY_TYPE.ofdmPhy_11ax.
dTSYM4 = 16.0;
93 if(phy->nGuardInterval == 800)
94 phy->PHY_TYPE.ofdmPhy_11ax.
dTSYM = phy->PHY_TYPE.ofdmPhy_11ax.
dTSYM1;
95 else if(phy->nGuardInterval == 1600)
96 phy->PHY_TYPE.ofdmPhy_11ax.
dTSYM = phy->PHY_TYPE.ofdmPhy_11ax.
dTSYM2;
98 phy->PHY_TYPE.ofdmPhy_11ax.
dTSYM = phy->PHY_TYPE.ofdmPhy_11ax.
dTSYM4;
100 phy->PHY_TYPE.ofdmPhy_11ax.
nTL_STF = 8;
101 phy->PHY_TYPE.ofdmPhy_11ax.
nTL_LTF = 8;
102 phy->PHY_TYPE.ofdmPhy_11ax.
nTL_SIG = 4;
103 phy->PHY_TYPE.ofdmPhy_11ax.
nTRL_SIG = 4;
104 phy->PHY_TYPE.ofdmPhy_11ax.
nTHE_SIGA = 8;
105 phy->PHY_TYPE.ofdmPhy_11ax.
nTHE_SIGB = 4;
111 if(phy->nGuardInterval == 800)
113 else if(phy->nGuardInterval == 1600)
120 phy->PHY_TYPE.ofdmPhy_11ax.
nTSYML = 4;
121 phy->PHY_TYPE.ofdmPhy_11ax.nTPE = 0;
124 if(phy->nGuardInterval == 800)
125 phy->PHY_TYPE.ofdmPhy_11ax.nGI_TYPE = HE_GI_800NS;
126 else if(phy->nGuardInterval == 1600)
127 phy->PHY_TYPE.ofdmPhy_11ax.nGI_TYPE = HE_GI_1600NS;
129 phy->PHY_TYPE.ofdmPhy_11ax.nGI_TYPE = HE_GI_3200NS;
133 phy->PHY_TYPE.ofdmPhy_11ax.nSTBC = 0;
136 phy->NSS = min((phy->nNTX < phy->nNRX ? phy->nNTX : phy->nNRX), nNSS_MAX);
139 phy->NSTS = phy->NSS;
142 phy->NSTS = min(phy->NSTS, 8);
147 case 1: phy->N_HE_LTF = 1;
break;
148 case 2: phy->N_HE_LTF = 2;
break;
150 case 4: phy->N_HE_LTF = 4;
break;
152 case 6: phy->N_HE_LTF = 6;
break;
154 case 8: phy->N_HE_LTF = 8;
break;
155 default: phy->N_HE_LTF = 1;
break;
158 phy->dControlFrameDataRate = fn_NetSim_IEEE802_11_HEPhy_getCtrlFrameDataRate(phy);
159 phy->dBroadcastFrameDataRate= fn_NetSim_IEEE802_11_HEPhy_getCtrlFrameDataRate(phy);
173double fn_NetSim_IEEE802_11ax_TxTimeCalculation(NetSim_PACKET *pstruPacket, NETSIM_ID nDevId, NETSIM_ID nInterfaceId)
175 double dTxTime = 0.0;
176 double dNSYM, dTempNum = 0.0;
177 int mSTBC = 1, nNDBPS, nNCBPS;
179 PIEEE802_11_PHY_VAR pstruPhy = IEEE802_11_PHY(nDevId,nInterfaceId);
180 double dPacketLength = pstruPacket->pstruPhyData->dPayload;
182 if(isIEEE802_11_CtrlPacket(pstruPacket))
184 nNDBPS = pstruPhy->PHY_TYPE.ofdmPhy_11ax.nNDBPS/pstruPhy->NSS;
185 nNCBPS = pstruPhy->PHY_TYPE.ofdmPhy_11ax.nNCBPS/pstruPhy->NSS;
189 nNDBPS = pstruPhy->PHY_TYPE.ofdmPhy_11ax.nNDBPS;
190 nNCBPS = pstruPhy->PHY_TYPE.ofdmPhy_11ax.nNCBPS;
194 if(pstruPhy->PHY_TYPE.ofdmPhy_11ax.nFEC_CODING == BCC_CODING)
196 dTempNum = (8 * dPacketLength) + 16 + ( 6 * pstruPhy->NESS) ;
197 if(pstruPhy->PHY_TYPE.ofdmPhy_11ax.nSTBC)
200 dTempNum = 8*dPacketLength;
201 dNSYM = mSTBC* ( dTempNum/(mSTBC * nNDBPS));
202 dTxTime = pstruPhy->PHY_TYPE.ofdmPhy_11ax.
dTSYM * dNSYM ;
207 dNSYM = nNavbits * nNCBPS;
208 dTxTime = pstruPhy->PHY_TYPE.ofdmPhy_11ax.
dTSYM * dNSYM ;
213double get_11ax_preamble_time(PIEEE802_11_PHY_VAR phy)
215 double dTGF_HE_PREAMBLE;
216 int nSignalExtension = 0;
218 dTGF_HE_PREAMBLE = phy->PHY_TYPE.ofdmPhy_11ax.
nTRL_SIG \
221 + (phy->N_HE_LTF * phy->PHY_TYPE.ofdmPhy_11ax.
nTHE_LTF_SYM);
double nTHE_LTF_SYM
Duration of each OFDM Symbol with GI in HE LTF THE_LTF + TGI_HE_LTF.
double dTGI_PreHE
Guard interval duration 0.8 = Pre HE TDFT/4.
int nTRL_SIG
Repeated non HT signal field duration 4.
int nTL_STF
Non-HT short training sequence duration 8 = 10*TDFT/4.
double dTGI1
Base Guard interval duration for data field 0.8 us.
int nTHE_STF_NT
HE short training field duration for HE SU PPDU 4 = 5 * 0.8.
int nNSD
NSD Number of data subcarriers per frequency segment.
int nNSR
NSR Highest data subcarrier index per frequency segment.
double dDeltaF
dSubcarrierFrequencySpacing; // 78.125 khz
double nTHE_LTF_2x
Duration of each 2x HE LTF OFDM without GI 6.4.
double dTGI4
Quadruple guard interval 3.2.
double nTHE_LTF
Duration of each OFDM Symbol without GI in HE LTF.
int nTHE_SIGB
HE SIGNAL B field duration TDFT_PreHE + TGI_PreHE = 3.2 + 0.8 = 4.
double dTSYM1
TSYM: Symbol interval 13.6 = TDFT + TGI.
double nTHE_LTF_4x
Duration of each 4x HE LTF OFDM without GI 12.8.
int nNST
NST Total number of subcarriers per frequency segment.
int nNSP
NSP Number of pilot subcarriers per frequency segement.
int nTL_SIG
Non-HT SIGNAL field duration 4.
double dTGI_HE_LTF
Guard interval duration for HE LTF.
double dTDFT_PreHE
IDFT/DFT period for pre HE 3.2.
double dTGIL_LTF
Guard interval duration for Legacy LTF.
double dTSYM4
TSYM: Symbol interval 16 = TDFT + TGI.
double dTSYM
OFDM symbol interval for HE PPDU field.
int nTL_LTF
Non-HT long training field duration 8 =2 * TDFT + TGI2.
double dTDFT
IDFT/DFT period 12.8.
double dDeltaF_PreHE
dSubcarrierFrequencySpacing for Pre HE; //312.5 kHz
double dTSYM2
TSYM: Symbol interval 14.4 = TDFT + TGI.
double dTGI2
Double guard interval 1.6.
int nTSYML
OFDM symbol duration including GI prior to HE STF 4.
int nTHE_SIGA
HE SIGNAL A field duration 8 = 2 * 4.
double nTHE_LTF_1x
Duration of each 1x HE LTF OFDM without GI 3.2.