15#include "IEEE802_11.h"
16#include "IEEE802_11_Phy.h"
25void fn_NetSim_IEEE802_11ac_OFDM_MIMO_init(NETSIM_ID nDeviceId,NETSIM_ID nInterfaceId)
29 PIEEE802_11_PHY_VAR phy = IEEE802_11_PHY(nDeviceId,nInterfaceId);
33 if(phy->dChannelBandwidth == 20)
35 phy->PHY_TYPE.ofdmPhy_11ac.nCH_BANDWIDTH = HT_CBW20;
36 phy->PHY_TYPE.ofdmPhy_11ac.
nNSD = 52;
37 phy->PHY_TYPE.ofdmPhy_11ac.
nNSP = 4;
38 phy->PHY_TYPE.ofdmPhy_11ac.
nNST = 56;
39 phy->PHY_TYPE.ofdmPhy_11ac.
nNSR = 28;
40 phy->PHY_TYPE.ofdmPhy_11ac.
nFFT = 64;
42 else if(phy->dChannelBandwidth == 40)
44 phy->PHY_TYPE.ofdmPhy_11ac.nCH_BANDWIDTH = HT_CBW40;
45 phy->PHY_TYPE.ofdmPhy_11ac.
nNSD = 108;
46 phy->PHY_TYPE.ofdmPhy_11ac.
nNSP = 6;
47 phy->PHY_TYPE.ofdmPhy_11ac.
nNST = 114;
48 phy->PHY_TYPE.ofdmPhy_11ac.
nNSR = 58;
49 phy->PHY_TYPE.ofdmPhy_11ac.
nFFT = 128;
51 else if(phy->dChannelBandwidth == 80)
53 phy->PHY_TYPE.ofdmPhy_11ac.nCH_BANDWIDTH = VHT_CBW80;
54 phy->PHY_TYPE.ofdmPhy_11ac.
nNSD = 234;
55 phy->PHY_TYPE.ofdmPhy_11ac.
nNSP = 8;
56 phy->PHY_TYPE.ofdmPhy_11ac.
nNST = 242;
57 phy->PHY_TYPE.ofdmPhy_11ac.
nNSR = 122;
58 phy->PHY_TYPE.ofdmPhy_11ac.
nFFT = 256;
60 else if(phy->dChannelBandwidth == 160)
62 phy->PHY_TYPE.ofdmPhy_11ac.nCH_BANDWIDTH = VHT_CBW160;
63 phy->PHY_TYPE.ofdmPhy_11ac.
nNSD = 468;
64 phy->PHY_TYPE.ofdmPhy_11ac.
nNSP = 16;
65 phy->PHY_TYPE.ofdmPhy_11ac.
nNST = 484;
66 phy->PHY_TYPE.ofdmPhy_11ac.
nNSR = 250;
67 phy->PHY_TYPE.ofdmPhy_11ac.
nFFT = 512;
71 phy->PHY_TYPE.ofdmPhy_11ac.
dDeltaF = phy->dChannelBandwidth / (phy->PHY_TYPE.ofdmPhy_11ac.
nFFT * 1.0);
72 phy->PHY_TYPE.ofdmPhy_11ac.
dTDFT = 3.2;
73 phy->PHY_TYPE.ofdmPhy_11ac.
dTGI = phy->PHY_TYPE.ofdmPhy_11ac.
dTDFT/4;
74 phy->PHY_TYPE.ofdmPhy_11ac.
dTGI2 = phy->PHY_TYPE.ofdmPhy_11ac.
dTGI * 2;
75 phy->PHY_TYPE.ofdmPhy_11ac.
dTGIS = phy->PHY_TYPE.ofdmPhy_11ac.
dTDFT/8;
76 phy->PHY_TYPE.ofdmPhy_11ac.
nTL_STF = 8;
78 phy->PHY_TYPE.ofdmPhy_11ac.
nTL_LTF = 8;
79 phy->PHY_TYPE.ofdmPhy_11ac.
dTSYM = 4.0;
80 phy->PHY_TYPE.ofdmPhy_11ac.
dTSYMS = 3.6;
81 phy->PHY_TYPE.ofdmPhy_11ac.
nTL_SIG = 4;
84 phy->PHY_TYPE.ofdmPhy_11ac.
nTHT_STF = 4;
87 if(phy->nGuardInterval == 400)
88 phy->PHY_TYPE.ofdmPhy_11ac.nGI_TYPE = SHORT_GI;
90 phy->PHY_TYPE.ofdmPhy_11ac.nGI_TYPE = LONG_GI;
93 phy->PHY_TYPE.ofdmPhy_11n.nSTBC = 0;
96 phy->NSS = min((phy->nNTX < phy->nNRX ? phy->nNTX: phy->nNRX),nNSS_MAX);
99 phy->NSTS = min(phy->NSS + phy->PHY_TYPE.ofdmPhy_11n.nSTBC,nNSTS_MAX);
102 phy->N_HT_ELTF = phy->NESS;
107 phy->N_HT_LTF = phy->N_HT_DLTF + phy->N_HT_ELTF;
108 if(phy->N_HT_LTF > 9)
111 phy->dControlFrameDataRate = fn_NetSim_IEEE802_11_HTPhy_getCtrlFrameDataRate(phy);
112 phy->dBroadcastFrameDataRate= fn_NetSim_IEEE802_11_HTPhy_getCtrlFrameDataRate(phy);
141double fn_NetSim_IEEE802_11ac_TxTimeCalculation(NetSim_PACKET *pstruPacket, NETSIM_ID nDevId, NETSIM_ID nInterfaceId)
143 double dTxTime = 0.0;
144 double dNSYM, dTempNum = 0.0;
145 int mSTBC = 1, nNDBPS, nNCBPS;
147 PIEEE802_11_PHY_VAR pstruPhy = IEEE802_11_PHY(nDevId,nInterfaceId);
148 double dPacketLength = pstruPacket->pstruPhyData->dPayload;
150 if(isIEEE802_11_CtrlPacket(pstruPacket))
152 nNDBPS = pstruPhy->PHY_TYPE.ofdmPhy_11ac.nNDBPS/pstruPhy->NSS;
153 nNCBPS = pstruPhy->PHY_TYPE.ofdmPhy_11ac.nNCBPS/pstruPhy->NSS;
157 nNDBPS = pstruPhy->PHY_TYPE.ofdmPhy_11ac.nNDBPS;
158 nNCBPS = pstruPhy->PHY_TYPE.ofdmPhy_11ac.nNCBPS;
162 if(pstruPhy->PHY_TYPE.ofdmPhy_11ac.nFEC_CODING == BCC_CODING)
164 dTempNum = (8 * dPacketLength) + 16 + ( 6 * pstruPhy->NESS) ;
165 if(pstruPhy->PHY_TYPE.ofdmPhy_11ac.nSTBC)
168 dTempNum = 8*dPacketLength;
169 dNSYM = mSTBC* ( dTempNum/(mSTBC * nNDBPS));
170 dTxTime = pstruPhy->PHY_TYPE.ofdmPhy_11ac.
dTSYMS * dNSYM ;
175 dNSYM = nNavbits * nNCBPS;
176 dTxTime = pstruPhy->PHY_TYPE.ofdmPhy_11ac.
dTSYMS * dNSYM ;
181double get_11ac_preamble_time(PIEEE802_11_PHY_VAR phy)
183 double dTGF_HT_PREAMBLE;
184 int nSignalExtension = 0;
186 dTGF_HT_PREAMBLE = phy->PHY_TYPE.ofdmPhy_11ac.
nTHT_GF_STF \
188 + phy->PHY_TYPE.ofdmPhy_11ac.
nTHT_STF
189 + phy->PHY_TYPE.ofdmPhy_11ac.
nTL_SIG;
191 return dTGF_HT_PREAMBLE +
int nTHT_STF
HT short training field duration 4.
int nTVHT_SIGA
HT SIGNAL field duration = 2TSYM = 8.
int nNSR
NSR Highest data subcarrier index.
double dTGI2
Double guard interval 1.6.
int nTHT_LTF1
First HT long training field duration 4 in HT-mixed format, 8 in HTgreenfield format.
double dTGI
Guard interval duration 0.8 = TDFT/4.
double dTSYM
TSYM: Symbol interval 4 = TDFT + TGI.
int nNSD
NSD Number of complex data numbers.
int nNST
NST Total number of subcarriers.
int nTVHT_SIGB
HT SIGNAL field duration = TSYM = 4.
double dDeltaF
dSubcarrierFrequencySpacing; // 312.5KHz (20 MHz/64) or (40 MHz/128)
int nTL_STF
Non-HT short training sequence duration 8 = 10*TDFT/4.
int nNSP
NSP Number of pilot values.
double dTGIS
Short guard interval duration dDFT/8 0.4.
double dTSYMS
dShortGIsymbolInterval; // TSYMS: Short GI symbol interval N/A 3.6 = TDFT+TGIS 3.6
int nTHT_GF_STF
HT-greenfield short training field duration 8 =10* TDFT/4.
int nTL_LTF
Non-HT long training field duration 8 =2 * TDFT + TGI2.
double dTDFT
IDFT/DFT period 3.2.
int nTL_SIG
Non-HT SIGNAL field duration 4.