NetSim Source Code Help v14.4
All 13 Components
 
Loading...
Searching...
No Matches
SINR-BER.c
1#include <stdio.h>
2#include <stdlib.h>
3#include <math.h>
4#include "main.h"
5#include "Wireless.h"
6#include "ErrorModel.h"
7
8// Data structure for physical layer parameters
10{
11 int MCS;
12 double SINR;
13};
14
15//MCS-SINR Table 802.11b 20MHz
16static struct stru_802_11_BER_Parameters struPhyParameters_802_11b_20MHz[4] =
17{
18 //Below the SINR Value 4 dB, PEP = 1
19 //{MCS, SINR}
20 {0, 4},
21 {1, 7},
22 {2, 11},
23 {3, 16}
24};
25
26//MCS-SINR Table 802.11agp 20MHz
27static struct stru_802_11_BER_Parameters struPhyParameters_802_11ag_20MHz[8] =
28{
29 {0, 2},
30 {1, 4},
31 {2, 5},
32 {3, 9},
33 {4, 11},
34 {5, 15},
35 {6, 18},
36 {7, 20}
37};
38
39//MCS-SINR Table 802.11n 20MHz
40static struct stru_802_11_BER_Parameters struPhyParameters_802_11n_20MHz[8] =
41{
42 {0, 2},
43 {1, 5},
44 {2, 9},
45 {3, 11},
46 {4, 15},
47 {5, 18},
48 {6, 20},
49 {7, 25}
50};
51
52//MCS-SINR Table 802.11n 40MHz
53static struct stru_802_11_BER_Parameters struPhyParameters_802_11n_40MHz[8] =
54{
55 {0, 5},
56 {1, 8},
57 {2, 12},
58 {3, 14},
59 {4, 18},
60 {5, 21},
61 {6, 23},
62 {7, 28}
63};
64
65//MCS-SINR Table 802.11ac 20MHz
66static struct stru_802_11_BER_Parameters struPhyParameters_802_11ac_20MHz[10] = {
67 {0, 2},
68 {1, 5},
69 {2, 9},
70 {3, 11},
71 {4, 15},
72 {5, 18},
73 {6, 20},
74 {7, 25},
75 {8, 29},
76 {9, 31}
77};
78
79//MCS-SINR Table 802.11ac 40MHz
80static struct stru_802_11_BER_Parameters struPhyParameters_802_11ac_40MHz[10] = {
81 {0, 5},
82 {1, 8},
83 {2, 12},
84 {3, 14},
85 {4, 18},
86 {5, 21},
87 {6, 23},
88 {7, 28},
89 {8, 32},
90 {9, 34}
91};
92
93//MCS-SINR Table 802.11ac 80MHz
94static struct stru_802_11_BER_Parameters struPhyParameters_802_11ac_80MHz[10] = {
95 {0, 8},
96 {1, 11},
97 {2, 15},
98 {3, 17},
99 {4, 21},
100 {5, 24},
101 {6, 26},
102 {7, 31},
103 {8, 35},
104 {9, 37}
105};
106
107//MCS-SINR Table 802.11ac 160MHz
108static struct stru_802_11_BER_Parameters struPhyParameters_802_11ac_160MHz[10] = {
109 {0, 11},
110 {1, 14},
111 {2, 18},
112 {3, 20},
113 {4, 24},
114 {5, 27},
115 {6, 29},
116 {7, 34},
117 {8, 38},
118 {9, 40}
119};
120
121
122static struct stru_802_11_BER_Parameters struPhyParameters_802_11ax_20MHz[12] =
123{
124 {0, 2},
125 {1, 5},
126 {2, 9},
127 {3, 11},
128 {4, 15},
129 {5, 18},
130 {6, 20},
131 {7, 25},
132 {8, 29},
133 {9, 31},
134 {10, 35},
135 {11, 37}
136};
137
138
139static struct stru_802_11_BER_Parameters struPhyParameters_802_11ax_40MHz[12] =
140{
141 {0, 5},
142 {1, 8},
143 {2, 12},
144 {3, 14},
145 {4, 18},
146 {5, 21},
147 {6, 23},
148 {7, 28},
149 {8, 32},
150 {9, 34},
151 {10, 38},
152 {11, 40}
153};
154
155
156static struct stru_802_11_BER_Parameters struPhyParameters_802_11ax_80MHz[12] =
157{
158 {0, 8},
159 {1, 11},
160 {2, 15},
161 {3, 17},
162 {4, 21},
163 {5, 24},
164 {6, 26},
165 {7, 31},
166 {8, 35},
167 {9, 37},
168 {10, 41},
169 {11, 43}
170};
171
172
173static struct stru_802_11_BER_Parameters struPhyParameters_802_11ax_160MHz[12] =
174{
175 {0, 11},
176 {1, 14},
177 {2, 18},
178 {3, 20},
179 {4, 24},
180 {5, 27},
181 {6, 29},
182 {7, 34},
183 {8, 38},
184 {9, 40},
185 {10, 44},
186 {11, 46}
187};
188
189double GET_BER_802_11_n(double sinr, double dBandwidth_MHz, int MCS)
190{
191 double BER = 1; // Default PEP value
192
193 switch ((int)dBandwidth_MHz)
194 {
195 case 20:
196 if (MCS >= 0 && MCS < sizeof(struPhyParameters_802_11n_20MHz))
197 {
198 if (sinr >= struPhyParameters_802_11n_20MHz[MCS].SINR)
199 {
200 BER = 0;
201 }
202 }
203 break;
204 case 40:
205 if (MCS >= 0 && MCS < sizeof(struPhyParameters_802_11n_40MHz))
206 {
207 if (sinr >= struPhyParameters_802_11n_40MHz[MCS].SINR)
208 {
209 BER = 0;
210 }
211 }
212 break;
213 default:
214 fnNetSimError("Unknown channel bandwidth %lf in %s\n", dBandwidth_MHz, __FUNCTION__);
215 break;
216 }
217 return BER;
218}
219
220double GET_BER_802_11_ac(double sinr, double dBandwidth_MHz, int MCS)
221{
222 double BER = 1; // Default PEP value
223 switch ((int)dBandwidth_MHz)
224 {
225 case 20:
226 if (MCS >= 0 && MCS < sizeof(struPhyParameters_802_11ac_20MHz))
227 {
228 if (sinr >= struPhyParameters_802_11ac_20MHz[MCS].SINR)
229 {
230 BER = 0;
231 }
232 }
233 break;
234 case 40:
235 if (MCS >= 0 && MCS < sizeof(struPhyParameters_802_11ac_40MHz))
236 {
237 if (sinr >= struPhyParameters_802_11ac_40MHz[MCS].SINR)
238 {
239 BER = 0;
240 }
241 }
242 break;
243 case 80:
244 if (MCS >= 0 && MCS < sizeof(struPhyParameters_802_11ac_80MHz))
245 {
246 if (sinr >= struPhyParameters_802_11ac_80MHz[MCS].SINR)
247 {
248 BER = 0;
249 }
250 }
251 break;
252 case 160:
253 if (MCS >= 0 && MCS < sizeof(struPhyParameters_802_11ac_160MHz))
254 {
255 if (sinr >= struPhyParameters_802_11ac_160MHz[MCS].SINR)
256 {
257 BER = 0;
258 }
259 }
260 break;
261 default:
262 fnNetSimError("Unknown channel bandwidth %lf in %s\n", dBandwidth_MHz, __FUNCTION__);
263 break;
264 }
265 return BER;
266}
267
268
269double GET_BER_802_11_ax(double sinr, double dBandwidth_MHz, int MCS)
270{
271 double BER = 1; // Default PEP value
272
273 switch ((int)dBandwidth_MHz)
274 {
275 case 20:
276 if (MCS >= 0 && MCS < sizeof(struPhyParameters_802_11ax_20MHz))
277 {
278 if (sinr >= struPhyParameters_802_11ax_20MHz[MCS].SINR)
279 {
280 BER = 0;
281 }
282 }
283 break;
284 case 40:
285 if (MCS >= 0 && MCS < sizeof(struPhyParameters_802_11ax_40MHz))
286 {
287 if (sinr >= struPhyParameters_802_11ax_40MHz[MCS].SINR)
288 {
289 BER = 0;
290 }
291 }
292 break;
293 case 80:
294 if (MCS >= 0 && MCS < sizeof(struPhyParameters_802_11ax_80MHz))
295 {
296 if (sinr >= struPhyParameters_802_11ax_80MHz[MCS].SINR)
297 {
298 BER = 0;
299 }
300 }
301 break;
302 case 160:
303 if (MCS >= 0 && MCS < sizeof(struPhyParameters_802_11ax_160MHz))
304 {
305 if (sinr >= struPhyParameters_802_11ax_160MHz[MCS].SINR)
306 {
307 BER = 0;
308 }
309 }
310 break;
311 default:
312 fnNetSimError("Unknown channel bandwidth %lf in %s\n", dBandwidth_MHz, __FUNCTION__);
313 break;
314 }
315 return BER;
316}
317
318double GET_BER(double sinr, int MCS, double dBandwidth_MHz, string protocol)
319{
320 double BER = 1; // Default PEP value
321 if (protocol)
322 {
323 if (!_stricmp(protocol, "IEEE_802_11b"))
324 {
325 if (MCS >= 0 && MCS < sizeof(struPhyParameters_802_11b_20MHz))
326 {
327 if (sinr >= struPhyParameters_802_11b_20MHz[MCS].SINR)
328 {
329 BER = 0;
330 }
331 }
332 }
333 else if ((!_stricmp(protocol, "IEEE_802_11a")) || (!_stricmp(protocol, "IEEE_802_11p")) || (!_stricmp(protocol, "IEEE_802_11g")))
334 {
335 if (MCS >= 0 && MCS < sizeof(struPhyParameters_802_11ag_20MHz))
336 {
337 if (sinr >= struPhyParameters_802_11ag_20MHz[MCS].SINR)
338 {
339 BER = 0;
340 }
341 }
342 }
343 else if (!_stricmp(protocol, "IEEE_802_11n"))
344 BER = GET_BER_802_11_n(sinr, dBandwidth_MHz, MCS);
345 else if (!_stricmp(protocol, "IEEE_802_11ac"))
346 BER = GET_BER_802_11_ac(sinr, dBandwidth_MHz, MCS);
347 else if (!_stricmp(protocol, "IEEE_802_11ax")) //HESUOFDM@IITM
348 BER = GET_BER_802_11_ax(sinr, dBandwidth_MHz, MCS);
349 else
350 {
351 NetSimxmlError("WLAN---PHY Protocol Configuration Unknown PHY STANDARD", NULL,NULL);
352 }
353 }
354 return BER;
355}
356
357/**
358Function to calculate the PEP using SNR-PEP Table
359*/
360_declspec(dllexport) double calculate_BER_Using_Table(PHY_MODULATION modulation,
361 double dReceivedPower_dBm,
362 double dInterferencePower_dBm,
363 double dBandwidth_MHz,
364 int MCS,
365 string Protocol)
366{
367 double ldEbByN0 = calculate_sinr(dReceivedPower_dBm, dInterferencePower_dBm, dBandwidth_MHz);
368 double BER = 0.0;
369 BER = GET_BER(ldEbByN0, MCS, dBandwidth_MHz, Protocol);
370 return BER;
371}