320 {-0.21, 0.977701, 0, 0, 0, 0},
321 {-0.48, 0.459445, 0.747335, 0, 0, 0},
322 {-0.05, 0.377927, 0.28416, 0.879729, 0, 0},
323 {-0.02, 0.691213, 0.258017, 0.073265, 0.670734, 0},
324 {-0.31, -0.00521632, -0.115615, 0.0788023, 0.00218104, 0.940368},
329 {-0.25, 0.968246, 0, 0, 0, 0},
330 {-0.52, 0.35115, 0.778648, 0, 0, 0},
331 {-0.04, 0.371806, 0.345008, 0.860889, 0, 0},
332 {0, 0.743613, 0.281102, 0.0424415, 0.605161, 0},
333 {-0.32, 0.0206559, -0.0689057, 0.154832, 0.061865, 0.929852},
338 {-0.21, 0.977701, 0, 0, 0, 0},
339 {-0.52, 0.450853, 0.725487, 0, 0, 0},
340 {-0.04, 0.288023, 0.260989, 0.920504, 0, 0},
341 {0.01, 0.697657, 0.386856, 0.0418183, 0.601472, 0},
342 {-0.33, 0.0416283, -0.0694268, 0.166137, 0.139937, 0.915075},
347 {-0.26, 0.965609, 0, 0, 0, 0},
348 {-0.53, 0.395813, 0.749955, 0, 0, 0},
349 {-0.04, 0.299914, 0.320139, 0.897754, 0, 0},
350 {0.01, 0.696556, 0.372815, 0.0580784, 0.610202, 0},
351 {-0.33, 0.0457742, -0.0173584, 0.154417, 0.129332, 0.920941},
356 {-0.25, 0.968246, 0, 0, 0, 0},
357 {-0.57, 0.420864, 0.705672, 0, 0, 0},
358 {-0.03, 0.229797, 0.235501, 0.943839, 0, 0},
359 {0.03, 0.679063, 0.384466, 0.0681379, 0.6209, 0},
360 {-0.41, -0.147173, -0.229228, 0.270707, 0.293002, 0.773668},
365 {-0.2, 0.979796, 0, 0, 0, 0},
366 {-0.53, 0.473568, 0.703444, 0, 0, 0},
367 {-0.05, 0.204124, 0.109225, 0.971547, 0, 0},
368 {0.03, 0.68994, 0.411073, 0.0676935, 0.591202, 0},
369 {-0.4, -0.224537, -0.292371, 0.275609, 0.301835, 0.732828},
374 {-0.19, 0.981784, 0, 0, 0, 0},
375 {-0.5, 0.524555, 0.689088, 0, 0, 0},
376 {-0.03, 0.228462, 0.18163, 0.955989, 0, 0},
377 {-0.02, 0.637818, 0.428725, 0.00608114, 0.639489, 0},
378 {-0.36, -0.18171, -0.282523, 0.106726, 0.123808, 0.854894},
383 {-0.2, 0.979796, 0, 0, 0, 0},
384 {-0.49, 0.502145, 0.712566, 0, 0, 0},
385 {-0.01, 0.232702, 0.151916, 0.960558, 0, 0},
386 {-0.05, 0.612372, 0.376106, 0.0206792, 0.693265, 0},
387 {-0.37, -0.320475, -0.365405, -0.00376264, 0.0364343, 0.790907},
392 {-0.19, 0.981784, 0, 0, 0, 0},
393 {-0.38, 0.58852, 0.713613, 0, 0, 0},
394 {-0.03, 0.360874, 0.12082, 0.924269, 0, 0},
395 {-0.12, 0.526796, 0.34244, 0.0594196, 0.766348, 0},
396 {-0.33, -0.257389, -0.24372, -0.257035, -0.176521, 0.817451},
467 {-0.36, 0.932952, 0, 0, 0, 0},
468 {0.45, 0.516639, 0.728412, 0, 0, 0},
469 {0.02, 0.329277, 0.371881, 0.867687, 0, 0},
470 {-0.06, 0.59853, 0.436258, -0.0324062, 0.668424, 0},
471 {-0.07, 0.0373009, 0.305087, -0.0280496, -0.225204, 0.921481},
476 {-0.39, 0.920815, 0, 0, 0, 0},
477 {0.52, 0.426579, 0.740021, 0, 0, 0},
478 {0, 0.347518, -0.0381664, 0.936896, 0, 0},
479 {-0.04, 0.710675, 0.172483, 0.116993, 0.670748, 0},
480 {-0.17, -0.0394216, 0.115154, 0.243458, -0.0702635, 0.944498},
485 {-0.41, 0.912086, 0, 0, 0, 0},
486 {0.54, 0.49491, 0.680782, 0, 0, 0},
487 {0, 0.350844, -0.152231, 0.923977, 0, 0},
488 {-0.04, 0.694672, 0.0702137, 0.0832998, 0.709903, 0},
489 {-0.19, -0.0854087, 0.0805978, 0.283811, -0.137441, 0.922318},
494 {-0.37, 0.929032, 0, 0, 0, 0},
495 {0.53, 0.480177, 0.698949, 0, 0, 0},
496 {0.01, 0.434538, 0.00864797, 0.900556, 0, 0},
497 {-0.05, 0.765851, -0.0303947, 0.0421641, 0.63896, 0},
498 {-0.17, -0.16458, 0.0989022, 0.158081, -0.150425, 0.941602},
503 {-0.4, 0.916515, 0, 0, 0, 0},
504 {0.55, 0.403703, 0.731111, 0, 0, 0},
505 {0.02, 0.499719, -0.0721341, 0.862947, 0, 0},
506 {-0.06, 0.835775, -0.156481, 0.0373835, 0.521534, 0},
507 {-0.19, -0.301141, 0.145082, 0.144564, -0.0238067, 0.911427},
512 {-0.41, 0.912086, 0, 0, 0, 0},
513 {0.56, 0.339442, 0.755764, 0, 0, 0},
514 {0.02, 0.436582, -0.0256617, 0.899076, 0, 0},
515 {-0.07, 0.856608, -0.12116, 0.0715303, 0.491453, 0},
516 {-0.2, -0.331109, 0.15136, 0.036082, 0.031313, 0.908391},
521 {-0.4, 0.916515, 0, 0, 0, 0},
522 {0.56, 0.386246, 0.732949, 0, 0, 0},
523 {0.04, 0.573913, -0.0601289, 0.815726, 0, 0},
524 {-0.11, 0.813953, -0.0720183, 0.0281118, 0.565158, 0},
525 {-0.19, -0.432071, 0.236423, -0.0247788, -0.0557206, 0.847113},
530 {-0.46, 0.887919, 0, 0, 0, 0},
531 {0.58, 0.469412, 0.665772, 0, 0, 0},
532 {0.01, 0.309262, -0.286842, 0.90663, 0, 0},
533 {-0.05, 0.762457, -0.268721, -0.0467443, 0.584605, 0},
534 {-0.23, -0.580909, 0.399665, 0.0403629, 0.326208, 0.584698},
539 {-0.3, 0.953939, 0, 0, 0, 0},
540 {0.47, 0.81871, 0.329868, 0, 0, 0},
541 {0.06, 0.0712834, -0.595875, 0.797654, 0, 0},
542 {-0.1, 0.408831, -0.0233859, 0.0412736, 0.905873, 0},
543 {-0.13, -0.407783, 0.439436, -0.0768289, -0.212875, 0.756631},
562 {-0.36, 0.932952, 0, 0, 0, 0},
563 {0.45, 0.527358, 0.72069, 0, 0, 0},
564 {0.02, 0.350715, 0.355282, 0.866241, 0, 0},
565 {-0.07, 0.562515, 0.478504, 0.0162932, 0.670406, 0},
566 {-0.06, 0.0411597, 0.270982, 0.0121094, -0.159927, 0.946336},
571 {-0.38, 0.924986, 0, 0, 0, 0},
572 {0.52, 0.473088, 0.711188, 0, 0, 0},
573 {0, 0.367573, -0.0617198, 0.927944, 0, 0},
574 {-0.04, 0.68628, 0.149228, 0.115257, 0.701332, 0},
575 {-0.16, -0.0441088, 0.118207, 0.251641, -0.0752458, 0.943131},
580 {-0.42, 0.907524, 0, 0, 0, 0},
581 {0.54, 0.48131, 0.690464, 0, 0, 0},
582 {0, 0.363627, -0.137613, 0.921324, 0, 0},
583 {-0.04, 0.686704, 0.117433, 0.104693, 0.708581, 0},
584 {-0.19, -0.0438556, 0.0922685, 0.269877, -0.136292, 0.928469},
589 {-0.36, 0.932952, 0, 0, 0, 0},
590 {0.53, 0.483197, 0.696865, 0, 0, 0},
591 {0.01, 0.464761, -0.0285153, 0.88492, 0, 0},
592 {-0.05, 0.763169, 0.140255, 0.0562856, 0.626286, 0},
593 {-0.16, -0.126051, 0.0942905, 0.195354, -0.217188, 0.92967},
598 {-0.39, 0.920815, 0, 0, 0, 0},
599 {0.55, 0.406705, 0.729446, 0, 0, 0},
600 {0.01, 0.503793, -0.123923, 0.854831, 0, 0},
601 {-0.06, 0.821664, -0.207246, 0.0245302, 0.526988, 0},
602 {-0.19, -0.254231, 0.10679, 0.190931, -0.0665276, 0.920316},
607 {-0.42, 0.907524, 0, 0, 0, 0},
608 {0.56, 0.391395, 0.730213, 0, 0, 0},
609 {0.02, 0.427978, -0.0393147, 0.902712, 0, 0},
610 {-0.06, 0.820694, -0.119986, 0.105509, 0.545281, 0},
611 {-0.2, -0.279882, 0.180145, 0.0563477, -0.0121631, 0.919723},
616 {-0.36, 0.932952, 0, 0, 0, 0},
617 {0.54, 0.519212, 0.662434, 0, 0, 0},
618 {0.04, 0.412025, -0.0234416, 0.909992, 0, 0},
619 {-0.09, 0.758452, -0.0682296, 0.0214276, 0.64151, 0},
620 {-0.17, -0.387158, 0.306169, -0.0291255, -0.109344, 0.845378},
625 {-0.44, 0.897998, 0, 0, 0, 0},
626 {0.57, 0.43519, 0.696928, 0, 0, 0},
627 {0.01, 0.316705, -0.248988, 0.915207, 0, 0},
628 {-0.06, 0.805793, -0.296262, -0.0419182, 0.507514, 0},
629 {-0.22, -0.497551, 0.289742, 0.0785823, 0.328773, 0.711214},
634 {-0.27, 0.96286, 0, 0, 0, 0},
635 {0.46, 0.741748, 0.488067, 0, 0, 0},
636 {0.04, 0.0735309, -0.374828, 0.923308, 0, 0},
637 {-0.08, 0.517624, 0.128779, 0.0795063, 0.838308, 0},
638 {-0.11, -0.321646, 0.0802763, -0.131981, -0.193429, 0.907285},
680 {10, {-7.12, 0.8, -3.06, 0.48, 0.94, 0.7, 0.82, 0.03, -2.52, 0.5, 4.4,
681 3.3, 2.5, 24.4, 3.8, 3.0, 20.0, 3.9, 0.0, 11.0, 7.0, 3.0}},
682 {20, {-7.28, 0.67, -2.68, 0.36, 0.87, 0.66, 0.5, 0.09, -2.29, 0.53, 9.0,
683 6.6, 2.5, 23.6, 4.7, 3.0, 20.0, 3.9, 0.0, 11.0, 7.0, 3.0}},
684 {30, {-7.45, 0.68, -2.51, 0.38, 0.92, 0.68, 0.82, 0.05, -2.19, 0.58, 9.3,
685 6.1, 2.5, 23.2, 4.6, 3.0, 20.0, 3.9, 0.0, 11.0, 7.0, 3.0}},
686 {40, {-7.73, 0.66, -2.4, 0.32, 0.79, 0.64, 1.23, 0.03, -2.24, 0.51, 7.9,
687 4.0, 2.5, 22.6, 4.9, 3.0, 20.0, 3.9, 0.0, 11.0, 7.0, 3.0}},
688 {50, {-7.91, 0.62, -2.31, 0.33, 0.72, 0.63, 1.43, 0.06, -2.3, 0.46, 7.4,
689 3.0, 2.5, 21.8, 5.7, 3.0, 20.0, 3.9, 0.0, 11.0, 7.0, 3.0}},
690 {60, {-8.14, 0.51, -2.2, 0.39, 0.6, 0.54, 1.56, 0.05, -2.48, 0.35, 7.0,
691 2.6, 2.5, 20.5, 6.9, 3.0, 20.0, 3.9, 0.0, 11.0, 7.0, 3.0}},
692 {70, {-8.23, 0.45, -2.0, 0.4, 0.55, 0.52, 1.66, 0.05, -2.64, 0.31, 6.9,
693 2.2, 2.5, 19.3, 8.1, 3.0, 20.0, 3.9, 0.0, 11.0, 7.0, 3.0}},
694 {80, {-8.28, 0.31, -1.64, 0.32, 0.71, 0.53, 1.73, 0.02, -2.68, 0.39, 6.5,
695 2.1, 2.5, 17.4, 10.3, 3.0, 20.0, 3.9, 0.0, 11.0, 7.0, 3.0}},
696 {90, {-8.36, 0.08, -0.63, 0.53, 0.81, 0.62, 1.79, 0.01, -2.61, 0.28, 6.8,
697 1.9, 2.5, 12.3, 15.2, 3.0, 20.0, 3.9, 0.0, 11.0, 7.0, 3.0}},
701 {10, {-7.43, 0.9, -3.43, 0.54, 0.65, 0.82, 0.82, 0.05, -2.75, 0.55, 6.1,
702 2.6, 2.5, 24.7, 2.1, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
703 {20, {-7.62, 0.78, -3.06, 0.41, 0.53, 0.78, 0.47, 0.11, -2.64, 0.64, 13.7,
704 6.8, 2.5, 24.4, 2.8, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
705 {30, {-7.76, 0.8, -2.91, 0.42, 0.6, 0.83, 0.8, 0.05, -2.49, 0.69, 12.9,
706 6.0, 2.5, 24.4, 2.7, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
707 {40, {-8.02, 0.72, -2.81, 0.34, 0.43, 0.78, 1.23, 0.04, -2.51, 0.57, 10.3,
708 3.3, 2.5, 24.2, 2.7, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
709 {50, {-8.13, 0.61, -2.74, 0.34, 0.36, 0.77, 1.42, 0.1, -2.54, 0.5, 9.2,
710 2.2, 2.5, 23.9, 3.1, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
711 {60, {-8.3, 0.47, -2.72, 0.7, 0.16, 0.84, 1.56, 0.06, -2.71, 0.37, 8.4,
712 1.9, 2.5, 23.3, 3.9, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
713 {70, {-8.34, 0.39, -2.46, 0.4, 0.18, 0.64, 1.65, 0.07, -2.85, 0.31, 8.0,
714 1.5, 2.5, 22.6, 4.8, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
715 {80, {-8.39, 0.26, -2.3, 0.78, 0.24, 0.81, 1.73, 0.02, -3.01, 0.45, 7.4,
716 1.6, 2.5, 21.2, 6.8, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
717 {90, {-8.45, 0.01, -1.11, 0.51, 0.36, 0.65, 1.79, 0.01, -3.08, 0.27, 7.6,
718 1.3, 2.5, 17.6, 12.7, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
731 {10, {-6.84, 0.82, -2.08, 0.87, 1.0, 1.6, 1.0, 0.63, -2.08, 0.58, 0.0,
732 0.0, 2.3, 23.8, 4.4, 4.0, 20.0, 3.9, 0.0, 15.0, 7.0, 3.0}},
733 {20, {-6.81, 0.61, -1.68, 0.73, 1.44, 0.87, 0.94, 0.65, -1.66, 0.5, 0.0,
734 0.0, 2.3, 21.9, 6.3, 4.0, 20.0, 3.9, 0.0, 15.0, 7.0, 3.0}},
735 {30, {-6.94, 0.49, -1.46, 0.53, 1.54, 0.64, 1.15, 0.42, -1.48, 0.4, 0.0,
736 0.0, 2.3, 19.7, 8.1, 4.0, 20.0, 3.9, 0.0, 15.0, 7.0, 3.0}},
737 {40, {-7.14, 0.49, -1.43, 0.5, 1.53, 0.56, 1.35, 0.28, -1.46, 0.37, 0.0,
738 0.0, 2.3, 18.1, 9.3, 4.0, 20.0, 3.9, 0.0, 15.0, 7.0, 3.0}},
739 {50, {-7.34, 0.51, -1.44, 0.58, 1.48, 0.54, 1.44, 0.25, -1.53, 0.47, 0.0,
740 0.0, 2.3, 16.3, 11.5, 4.0, 20.0, 3.9, 0.0, 15.0, 7.0, 3.0}},
741 {60, {-7.53, 0.47, -1.33, 0.49, 1.39, 0.68, 1.56, 0.16, -1.61, 0.43, 0.0,
742 0.0, 2.3, 14.0, 13.3, 4.0, 20.0, 3.9, 0.0, 15.0, 7.0, 3.0}},
743 {70, {-7.67, 0.44, -1.31, 0.65, 1.42, 0.55, 1.64, 0.18, -1.77, 0.5, 0.0,
744 0.0, 2.3, 12.1, 14.9, 4.0, 20.0, 3.9, 0.0, 15.0, 7.0, 3.0}},
745 {80, {-7.82, 0.42, -1.11, 0.69, 1.38, 0.6, 1.7, 0.09, -1.9, 0.42, 0.0,
746 0.0, 2.3, 8.7, 17.0, 4.0, 20.0, 3.9, 0.0, 15.0, 7.0, 3.0}},
747 {90, {-7.84, 0.55, -0.11, 0.53, 1.23, 0.6, 1.7, 0.17, -1.99, 0.5, 0.0,
748 0.0, 2.3, 6.4, 12.3, 4.0, 20.0, 3.9, 0.0, 15.0, 7.0, 3.0}},
752 {10, {-6.86, 0.81, -2.12, 0.94, 1.02, 1.44, 1.01, 0.56, -2.11, 0.59, 0.0,
753 0.0, 2.3, 23.7, 4.5, 4.0, 20.0, 3.9, 0.0, 15.0, 7.0, 3.0}},
754 {20, {-6.84, 0.61, -1.74, 0.79, 1.44, 0.77, 0.96, 0.55, -1.69, 0.51, 0.0,
755 0.0, 2.3, 21.8, 6.3, 4.0, 20.0, 3.9, 0.0, 15.0, 7.0, 3.0}},
756 {30, {-7.0, 0.56, -1.56, 0.66, 1.48, 0.7, 1.13, 0.43, -1.52, 0.46, 0.0,
757 0.0, 2.3, 19.6, 8.2, 4.0, 20.0, 3.9, 0.0, 15.0, 7.0, 3.0}},
758 {40, {-7.21, 0.56, -1.54, 0.63, 1.46, 0.6, 1.3, 0.37, -1.51, 0.43, 0.0,
759 0.0, 2.3, 18.0, 9.4, 4.0, 20.0, 3.9, 0.0, 15.0, 7.0, 3.0}},
760 {50, {-7.42, 0.57, -1.45, 0.56, 1.4, 0.59, 1.4, 0.32, -1.54, 0.45, 0.0,
761 0.0, 2.3, 16.3, 11.5, 4.0, 20.0, 3.9, 0.0, 15.0, 7.0, 3.0}},
762 {60, {-7.86, 0.55, -1.64, 0.78, 0.97, 1.27, 1.41, 0.45, -1.84, 0.63, 0.0,
763 0.0, 2.3, 15.9, 12.4, 4.0, 20.0, 3.9, 0.0, 15.0, 7.0, 3.0}},
764 {70, {-7.76, 0.47, -1.37, 0.56, 1.33, 0.56, 1.63, 0.17, -1.86, 0.51, 0.0,
765 0.0, 2.3, 12.3, 15.0, 4.0, 20.0, 3.9, 0.0, 15.0, 7.0, 3.0}},
766 {80, {-8.07, 0.42, -1.29, 0.76, 1.12, 1.04, 1.68, 0.14, -2.16, 0.74, 0.0,
767 0.0, 2.3, 10.5, 15.7, 4.0, 20.0, 3.9, 0.0, 15.0, 7.0, 3.0}},
768 {90, {-7.95, 0.59, -0.41, 0.59, 1.04, 0.63, 1.7, 0.17, -2.21, 0.61, 0.0,
769 0.0, 2.3, 10.5, 15.7, 4.0, 20.0, 3.9, 0.0, 15.0, 7.0, 3.0}},
779static const std::map<std::string, std::map<int, std::array<float, 22>>>
NTNUrbanLOS{
782 {10, {-7.97, 1.0, -2.6, 0.79, 0.18, 0.74, -0.63, 2.6, -2.54, 2.62, 31.83,
783 13.84, 2.5, 8.0, 4.0, 4.0, 20.0, 3.9, 0.09, 12.55, 1.25, 3.0}},
784 {20, {-8.12, 0.83, -2.48, 0.8, 0.42, 0.9, -0.15, 3.31, -2.67, 2.96, 18.78,
785 13.78, 2.5, 8.0, 4.0, 3.0, 20.0, 3.9, 0.09, 12.76, 3.23, 3.0}},
786 {30, {-8.21, 0.68, -2.44, 0.91, 0.41, 1.3, 0.54, 1.1, -2.03, 0.86, 10.49,
787 10.42, 2.5, 8.0, 4.0, 3.0, 20.0, 3.9, 0.12, 14.36, 4.39, 3.0}},
788 {40, {-8.31, 0.48, -2.6, 1.02, 0.18, 1.69, 0.35, 1.59, -2.28, 1.19, 7.46,
789 8.01, 2.5, 8.0, 4.0, 3.0, 20.0, 3.9, 0.16, 16.42, 5.72, 3.0}},
790 {50, {-8.37, 0.38, -2.71, 1.17, -0.07, 2.04, 0.27, 1.62, -2.48, 1.4, 6.52,
791 8.27, 2.5, 8.0, 4.0, 3.0, 20.0, 3.9, 0.2, 17.13, 6.17, 3.0}},
792 {60, {-8.39, 0.24, -2.76, 1.17, -0.43, 2.54, 0.26, 0.97, -2.56, 0.85, 5.47,
793 7.26, 2.5, 8.0, 4.0, 3.0, 20.0, 3.9, 0.28, 19.01, 7.36, 3.0}},
794 {70, {-8.38, 0.18, -2.78, 1.2, -0.64, 2.47, -0.12, 1.99, -2.96, 1.61, 4.54,
795 5.53, 2.5, 8.0, 4.0, 3.0, 20.0, 3.9, 0.44, 19.31, 7.3, 3.0}},
796 {80, {-8.35, 0.13, -2.65, 1.45, -0.91, 2.69, -0.21, 1.82, -3.08, 1.49, 4.03,
797 4.49, 2.5, 8.0, 4.0, 3.0, 20.0, 3.9, 0.9, 22.39, 7.7, 3.0}},
798 {90, {-8.34, 0.09, -2.27, 1.85, -0.54, 1.66, -0.07, 1.43, -3.0, 1.09, 3.68,
799 3.14, 2.5, 8.0, 4.0, 3.0, 20.0, 3.9, 2.87, 27.8, 9.25, 3.0}},
803 {10, {-8.52, 0.92, -3.18, 0.79, -0.4, 0.77, -0.67, 2.22, -2.61, 2.41, 40.18,
804 16.99, 2.5, 8.0, 4.0, 4.0, 20.0, 1.6, 0.09, 11.8, 1.14, 3.0}},
805 {20, {-8.59, 0.79, -3.05, 0.87, -0.15, 0.97, -0.34, 3.04, -2.82, 2.59, 23.62,
806 18.96, 2.5, 8.0, 4.0, 3.0, 20.0, 1.6, 0.09, 11.6, 2.78, 3.0}},
807 {30, {-8.51, 0.65, -2.98, 1.04, -0.18, 1.58, 0.07, 1.33, -2.48, 1.02, 12.48,
808 14.23, 2.5, 8.0, 4.0, 3.0, 20.0, 1.6, 0.11, 13.05, 3.87, 3.0}},
809 {40, {-8.49, 0.48, -3.11, 1.06, -0.31, 1.69, -0.08, 1.45, -2.76, 1.27, 8.56,
810 11.06, 2.5, 8.0, 4.0, 3.0, 20.0, 1.6, 0.15, 14.56, 4.94, 3.0}},
811 {50, {-8.48, 0.46, -3.19, 1.12, -0.58, 2.13, -0.21, 1.62, -2.93, 1.38, 7.42,
812 11.21, 2.5, 8.0, 4.0, 3.0, 20.0, 1.6, 0.18, 15.35, 5.41, 3.0}},
813 {60, {-8.44, 0.34, -3.25, 1.14, -0.9, 2.51, -0.25, 1.06, -3.05, 0.96, 5.97,
814 9.47, 2.5, 8.0, 4.0, 3.0, 20.0, 1.6, 0.27, 16.97, 6.31, 3.0}},
815 {70, {-8.4, 0.27, -3.33, 1.25, -1.16, 2.47, -0.61, 1.88, -3.45, 1.51, 4.88,
816 7.24, 2.5, 8.0, 4.0, 3.0, 20.0, 1.6, 0.42, 17.96, 6.66, 3.0}},
817 {80, {-8.37, 0.19, -3.22, 1.35, -1.48, 2.61, -0.79, 1.87, -3.66, 1.49, 4.22,
818 5.79, 2.5, 8.0, 4.0, 3.0, 20.0, 1.6, 0.86, 20.68, 7.31, 3.0}},
819 {90, {-8.35, 0.14, -2.83, 1.62, -1.14, 1.7, -0.58, 1.19, -3.56, 0.89, 3.81,
820 4.25, 2.5, 8.0, 4.0, 3.0, 20.0, 1.6, 2.55, 25.08, 9.23, 3.0}},
830static const std::map<std::string, std::map<int, std::array<float, 22>>>
NTNUrbanNLOS{
833 {10, {-7.24, 1.26, -1.58, 0.89, 0.13, 2.99, -1.13, 2.66, -2.87, 2.76, 0.0,
834 0.0, 2.3, 7.0, 3.0, 3.0, 20.0, 1.6, 0.08, 14.72, 1.57, 3.0}},
835 {20, {-7.7, 0.99, -1.67, 0.89, 0.19, 3.12, 0.49, 2.03, -2.68, 2.76, 0.0,
836 0.0, 2.3, 7.0, 3.0, 3.0, 20.0, 1.6, 0.1, 14.62, 4.3, 3.0}},
837 {30, {-7.82, 0.86, -1.84, 1.3, 0.44, 2.69, 0.95, 1.54, -2.12, 1.54, 0.0,
838 0.0, 2.3, 7.0, 3.0, 3.0, 20.0, 1.6, 0.14, 16.4, 6.64, 3.0}},
839 {40, {-8.04, 0.75, -2.02, 1.15, 0.48, 2.45, 1.15, 1.02, -2.27, 1.77, 0.0,
840 0.0, 2.3, 7.0, 3.0, 3.0, 20.0, 1.6, 0.22, 17.86, 9.21, 3.0}},
841 {50, {-8.08, 0.77, -2.06, 1.23, 0.56, 2.17, 1.14, 1.61, -2.5, 2.36, 0.0,
842 0.0, 2.3, 7.0, 3.0, 3.0, 20.0, 1.6, 0.31, 19.74, 10.32, 3.0}},
843 {60, {-8.1, 0.76, -1.99, 1.02, 0.55, 1.93, 1.13, 1.84, -2.47, 2.33, 0.0,
844 0.0, 2.3, 7.0, 3.0, 3.0, 20.0, 1.6, 0.49, 19.73, 10.3, 3.0}},
845 {70, {-8.16, 0.73, -2.19, 1.78, 0.48, 1.72, 1.16, 1.81, -2.83, 2.84, 0.0,
846 0.0, 2.3, 7.0, 3.0, 2.0, 20.0, 1.6, 0.97, 20.5, 10.2, 3.0}},
847 {80, {-8.03, 0.79, -1.88, 1.55, 0.53, 1.51, 1.28, 1.35, -2.82, 2.87, 0.0,
848 0.0, 2.3, 7.0, 3.0, 2.0, 20.0, 1.6, 1.52, 26.16, 12.27, 3.0}},
849 {90, {-8.33, 0.7, -2.0, 1.4, 0.32, 1.2, 1.42, 0.6, -4.55, 4.27, 0.0,
850 0.0, 2.3, 7.0, 3.0, 2.0, 20.0, 1.6, 5.36, 25.83, 12.75, 3.0}},
854 {10, {-7.24, 1.26, -1.58, 0.89, 0.13, 2.99, -1.13, 2.66, -2.87, 2.76, 0.0,
855 0.0, 2.3, 7.0, 3.0, 3.0, 20.0, 1.6, 0.08, 14.72, 1.57, 3.0}},
856 {20, {-7.7, 0.99, -1.67, 0.89, 0.19, 3.12, 0.49, 2.03, -2.68, 2.76, 0.0,
857 0.0, 2.3, 7.0, 3.0, 3.0, 20.0, 1.6, 0.1, 14.62, 4.3, 3.0}},
858 {30, {-7.82, 0.86, -1.84, 1.3, 0.44, 2.69, 0.95, 1.54, -2.12, 1.54, 0.0,
859 0.0, 2.3, 7.0, 3.0, 3.0, 20.0, 1.6, 0.14, 16.4, 6.64, 3.0}},
860 {40, {-8.04, 0.75, -2.02, 1.15, 0.48, 2.45, 1.15, 1.02, -2.27, 1.77, 0.0,
861 0.0, 2.3, 7.0, 3.0, 3.0, 20.0, 1.6, 0.22, 17.86, 9.21, 3.0}},
862 {50, {-8.08, 0.77, -2.06, 1.23, 0.56, 2.17, 1.14, 1.61, -2.5, 2.36, 0.0,
863 0.0, 2.3, 7.0, 3.0, 3.0, 20.0, 1.6, 0.31, 19.74, 10.32, 3.0}},
864 {60, {-8.1, 0.76, -1.99, 1.02, 0.55, 1.93, 1.13, 1.84, -2.47, 2.33, 0.0,
865 0.0, 2.3, 7.0, 3.0, 3.0, 20.0, 1.6, 0.49, 19.73, 10.3, 3.0}},
866 {70, {-8.16, 0.73, -2.19, 1.78, 0.48, 1.72, 1.16, 1.81, -2.83, 2.84, 0.0,
867 0.0, 2.3, 7.0, 3.0, 2.0, 20.0, 1.6, 0.97, 20.5, 10.2, 3.0}},
868 {80, {-8.03, 0.79, -1.88, 1.55, 0.53, 1.51, 1.28, 1.35, -2.82, 2.87, 0.0,
869 0.0, 2.3, 7.0, 3.0, 2.0, 20.0, 1.6, 1.52, 26.16, 12.27, 3.0}},
870 {90, {-8.33, 0.7, -2.0, 1.4, 0.32, 1.2, 1.42, 0.6, -4.55, 4.27, 0.0,
871 0.0, 2.3, 7.0, 3.0, 2.0, 20.0, 1.6, 5.36, 25.83, 12.75, 3.0}},
881static const std::map<std::string, std::map<int, std::array<float, 22>>>
NTNSuburbanLOS{
884 {10, {-8.16, 0.99, -3.57, 1.62, 0.05, 1.84, -1.78, 0.62, -1.06, 0.96, 11.4,
885 6.26, 2.2, 21.3, 7.6, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
886 {20, {-8.56, 0.96, -3.8, 1.74, -0.38, 1.94, -1.84, 0.81, -1.21, 0.95, 19.45,
887 10.32, 3.36, 21.0, 8.9, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
888 {30, {-8.72, 0.79, -3.77, 1.72, -0.56, 1.75, -1.67, 0.57, -1.28, 0.49, 20.8,
889 16.34, 3.5, 21.2, 8.5, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
890 {40, {-8.71, 0.81, -3.57, 1.6, -0.59, 1.82, -1.59, 0.86, -1.32, 0.79, 21.2,
891 15.63, 2.81, 21.1, 8.4, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
892 {50, {-8.72, 1.12, -3.42, 1.49, -0.58, 1.87, -1.55, 1.05, -1.39, 0.97, 21.6,
893 14.22, 2.39, 20.7, 9.2, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
894 {60, {-8.66, 1.23, -3.27, 1.43, -0.55, 1.92, -1.51, 1.23, -1.36, 1.17, 19.75,
895 14.19, 2.73, 20.6, 9.8, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
896 {70, {-8.38, 0.55, -3.08, 1.36, -0.28, 1.16, -1.27, 0.54, -1.08, 0.62, 12.0,
897 5.7, 2.07, 20.3, 10.8, 2.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
898 {80, {-8.34, 0.63, -2.75, 1.26, -0.17, 1.09, -1.28, 0.67, -1.31, 0.76, 12.85,
899 9.91, 2.04, 19.8, 12.2, 2.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
900 {90, {-8.34, 0.63, -2.75, 1.26, -0.17, 1.09, -1.28, 0.67, -1.31, 0.76, 12.85,
901 9.91, 2.04, 19.1, 13.0, 2.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
905 {10, {-8.07, 0.46, -3.55, 0.48, 0.89, 0.67, 0.63, 0.35, -3.37, 0.28, 8.9,
906 4.4, 2.5, 23.2, 5.0, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
907 {20, {-8.61, 0.45, -3.69, 0.41, 0.31, 0.78, 0.76, 0.3, -3.28, 0.27, 14.0,
908 4.6, 2.5, 23.6, 4.5, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
909 {30, {-8.72, 0.28, -3.59, 0.41, 0.02, 0.75, 1.11, 0.28, -3.04, 0.26, 11.3,
910 3.7, 2.5, 23.5, 4.7, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
911 {40, {-8.63, 0.17, -3.38, 0.35, -0.1, 0.65, 1.37, 0.23, -2.88, 0.21, 9.0,
912 3.5, 2.5, 23.4, 5.2, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
913 {50, {-8.54, 0.14, -3.23, 0.35, -0.19, 0.55, 1.53, 0.23, -2.83, 0.18, 7.5,
914 3.0, 2.5, 23.2, 5.7, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
915 {60, {-8.48, 0.15, -3.19, 0.43, -0.54, 0.96, 1.65, 0.17, -2.86, 0.17, 6.6,
916 2.6, 2.5, 23.3, 5.9, 3.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
917 {70, {-8.42, 0.09, -2.83, 0.33, -0.24, 0.43, 1.74, 0.11, -2.95, 0.1, 5.9,
918 1.7, 2.5, 23.4, 6.2, 2.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
919 {80, {-8.39, 0.05, -2.66, 0.44, -0.52, 0.93, 1.82, 0.05, -3.21, 0.07, 5.5,
920 0.7, 2.5, 23.2, 7.0, 2.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
921 {90, {-8.37, 0.02, -1.22, 0.31, -0.15, 0.44, 1.87, 0.02, -3.49, 0.24, 5.4,
922 0.3, 2.5, 23.1, 7.6, 2.0, 20.0, 1.6, 0.0, 11.0, 7.0, 3.0}},
932static const std::map<std::string, std::map<int, std::array<float, 22>>>
NTNSuburbanNLOS{
935 {10, {-7.43, 0.5, -2.89, 0.41, 1.49, 0.4, 0.81, 0.36, -3.09, 0.32, 0.0,
936 0.0, 2.3, 22.5, 5.0, 4.0, 20.0, 1.6, 0.0, 15.0, 7.0, 3.0}},
937 {20, {-7.63, 0.61, -2.76, 0.41, 1.24, 0.82, 1.06, 0.41, -2.93, 0.47, 0.0,
938 0.0, 2.3, 19.4, 8.5, 4.0, 20.0, 1.6, 0.0, 15.0, 7.0, 3.0}},
939 {30, {-7.86, 0.56, -2.64, 0.41, 1.06, 0.71, 1.12, 0.4, -2.91, 0.46, 0.0,
940 0.0, 2.3, 15.5, 10.0, 4.0, 20.0, 1.6, 0.0, 15.0, 7.0, 3.0}},
941 {40, {-7.96, 0.58, -2.41, 0.52, 0.91, 0.55, 1.14, 0.39, -2.78, 0.54, 0.0,
942 0.0, 2.3, 13.9, 10.6, 4.0, 20.0, 1.6, 0.0, 15.0, 7.0, 3.0}},
943 {50, {-7.98, 0.59, -2.42, 0.7, 0.98, 0.58, 1.29, 0.35, -2.7, 0.45, 0.0,
944 0.0, 2.3, 11.7, 10.0, 4.0, 20.0, 1.6, 0.0, 15.0, 7.0, 3.0}},
945 {60, {-8.45, 0.47, -2.53, 0.5, 0.49, 1.37, 1.38, 0.36, -3.03, 0.36, 0.0,
946 0.0, 2.3, 9.8, 9.1, 3.0, 20.0, 1.6, 0.0, 15.0, 7.0, 3.0}},
947 {70, {-8.21, 0.36, -2.35, 0.58, 0.73, 0.49, 1.36, 0.29, -2.9, 0.42, 0.0,
948 0.0, 2.3, 10.3, 9.1, 3.0, 20.0, 1.6, 0.0, 15.0, 7.0, 3.0}},
949 {80, {-8.69, 0.29, -2.31, 0.73, -0.04, 1.48, 1.38, 0.2, -3.2, 0.3, 0.0,
950 0.0, 2.3, 15.6, 9.1, 3.0, 20.0, 1.6, 0.0, 15.0, 7.0, 3.0}},
951 {90, {-8.69, 0.29, -2.31, 0.73, -0.04, 1.48, 1.38, 0.2, -3.2, 0.3, 0.0,
952 0.0, 2.3, 15.6, 9.1, 3.0, 20.0, 1.6, 0.0, 15.0, 7.0, 3.0}},
956 {10, {-7.43, 0.5, -2.89, 0.41, 1.49, 0.4, 0.81, 0.36, -3.09, 0.32, 0.0,
957 0.0, 2.3, 22.5, 5.0, 4.0, 20.0, 1.6, 0.0, 15.0, 7.0, 3.0}},
958 {20, {-7.63, 0.61, -2.76, 0.41, 1.24, 0.82, 1.06, 0.41, -2.93, 0.47, 0.0,
959 0.0, 2.3, 19.4, 8.5, 4.0, 20.0, 1.6, 0.0, 15.0, 7.0, 3.0}},
960 {30, {-7.86, 0.56, -2.64, 0.41, 1.06, 0.71, 1.12, 0.4, -2.91, 0.46, 0.0,
961 0.0, 2.3, 15.5, 10.0, 4.0, 20.0, 1.6, 0.0, 15.0, 7.0, 3.0}},
962 {40, {-7.96, 0.58, -2.41, 0.52, 0.91, 0.55, 1.14, 0.39, -2.78, 0.54, 0.0,
963 0.0, 2.3, 13.9, 10.6, 4.0, 20.0, 1.6, 0.0, 15.0, 7.0, 3.0}},
964 {50, {-7.98, 0.59, -2.42, 0.7, 0.98, 0.58, 1.29, 0.35, -2.7, 0.45, 0.0,
965 0.0, 2.3, 11.7, 10.0, 4.0, 20.0, 1.6, 0.0, 15.0, 7.0, 3.0}},
966 {60, {-8.45, 0.47, -2.53, 0.5, 0.49, 1.37, 1.38, 0.36, -3.03, 0.36, 0.0,
967 0.0, 2.3, 9.8, 9.1, 3.0, 20.0, 1.6, 0.0, 15.0, 7.0, 3.0}},
968 {70, {-8.21, 0.36, -2.35, 0.58, 0.73, 0.49, 1.36, 0.29, -2.9, 0.42, 0.0,
969 0.0, 2.3, 10.3, 9.1, 3.0, 20.0, 1.6, 0.0, 15.0, 7.0, 3.0}},
970 {80, {-8.69, 0.29, -2.31, 0.73, -0.04, 1.48, 1.38, 0.2, -3.2, 0.3, 0.0,
971 0.0, 2.3, 15.6, 9.1, 3.0, 20.0, 1.6, 0.0, 15.0, 7.0, 3.0}},
972 {90, {-8.69, 0.29, -2.31, 0.73, -0.04, 1.48, 1.38, 0.2, -3.2, 0.3, 0.0,
973 0.0, 2.3, 15.6, 9.1, 3.0, 20.0, 1.6, 0.0, 15.0, 7.0, 3.0}},
983static const std::map<std::string, std::map<int, std::array<float, 22>>>
NTNRuralLOS{
986 {10, {-9.55, 0.66, -3.42, 0.89, -9.45, 7.83, -4.2, 6.3, -6.03, 5.19, 24.72,
987 5.07, 3.8, 12.0, 4.0, 2.0, 20.0, 0.0, 0.39, 10.81, 1.94, 3.0}},
988 {20, {-8.68, 0.44, -3.0, 0.63, -4.45, 6.86, -2.31, 5.04, -4.31, 4.18, 12.31,
989 5.75, 3.8, 12.0, 4.0, 2.0, 20.0, 0.0, 0.31, 8.09, 1.83, 3.0}},
990 {30, {-8.46, 0.28, -2.86, 0.52, -2.39, 5.14, -0.28, 0.81, -2.57, 0.61, 8.05,
991 5.46, 3.8, 12.0, 4.0, 2.0, 20.0, 0.0, 0.29, 13.7, 2.28, 3.0}},
992 {40, {-8.36, 0.19, -2.78, 0.45, -1.28, 3.44, -0.38, 1.16, -2.59, 0.79, 6.21,
993 5.23, 3.8, 12.0, 4.0, 2.0, 20.0, 0.0, 0.37, 20.05, 2.93, 3.0}},
994 {50, {-8.29, 0.14, -2.7, 0.42, -0.99, 2.59, -0.38, 0.82, -2.59, 0.65, 5.04,
995 3.95, 3.8, 12.0, 4.0, 2.0, 20.0, 0.0, 0.61, 24.51, 2.84, 3.0}},
996 {60, {-8.26, 0.1, -2.66, 0.41, -1.05, 2.42, -0.46, 0.67, -2.65, 0.52, 4.42,
997 3.75, 3.8, 12.0, 4.0, 2.0, 20.0, 0.0, 0.9, 26.35, 3.17, 3.0}},
998 {70, {-8.22, 0.1, -2.53, 0.42, -0.9, 1.78, -0.49, 1.0, -2.69, 0.78, 3.92,
999 2.56, 3.8, 12.0, 4.0, 2.0, 20.0, 0.0, 1.43, 31.84, 3.88, 3.0}},
1000 {80, {-8.2, 0.05, -2.21, 0.5, -0.89, 1.65, -0.53, 1.18, -2.65, 1.01, 3.65,
1001 1.77, 3.8, 12.0, 4.0, 2.0, 20.0, 0.0, 2.87, 36.62, 4.17, 3.0}},
1002 {90, {-8.19, 0.06, -1.78, 0.91, -0.81, 1.26, -0.46, 0.91, -2.65, 0.71, 3.59,
1003 1.77, 3.8, 12.0, 4.0, 2.0, 20.0, 0.0, 5.48, 36.77, 4.29, 3.0}},
1007 {10, {-9.68, 0.46, -4.03, 0.91, -9.74, 7.52, -5.85, 6.51, -7.45, 5.3, 25.43,
1008 7.04, 3.8, 12.0, 4.0, 2.0, 20.0, 0.0, 0.36, 4.63, 0.75, 3.0}},
1009 {20, {-8.86, 0.29, -3.55, 0.7, -4.88, 6.67, -3.27, 5.36, -5.25, 4.42, 12.72,
1010 7.47, 3.8, 12.0, 4.0, 2.0, 20.0, 0.0, 0.3, 6.83, 1.25, 3.0}},
1011 {30, {-8.59, 0.18, -3.45, 0.55, -2.6, 4.63, -0.88, 0.93, -3.16, 0.68, 8.4,
1012 7.18, 3.8, 12.0, 4.0, 2.0, 20.0, 0.0, 0.25, 12.91, 1.93, 3.0}},
1013 {40, {-8.46, 0.19, -3.38, 0.52, -1.92, 3.45, -0.93, 0.96, -3.15, 0.73, 6.52,
1014 6.88, 3.8, 12.0, 4.0, 2.0, 20.0, 0.0, 0.35, 18.9, 2.37, 3.0}},
1015 {50, {-8.36, 0.14, -3.33, 0.46, -1.56, 2.44, -0.99, 0.97, -3.2, 0.77, 5.24,
1016 5.28, 3.8, 12.0, 4.0, 2.0, 20.0, 0.0, 0.53, 22.44, 2.66, 3.0}},
1017 {60, {-8.3, 0.15, -3.29, 0.43, -1.66, 2.38, -1.04, 0.83, -3.27, 0.61, 4.57,
1018 4.92, 3.8, 12.0, 4.0, 2.0, 20.0, 0.0, 0.88, 25.69, 3.23, 3.0}},
1019 {70, {-8.26, 0.13, -3.24, 0.46, -1.59, 1.67, -1.17, 1.01, -3.42, 0.74, 4.02,
1020 3.4, 3.8, 12.0, 4.0, 2.0, 20.0, 0.0, 1.39, 27.95, 3.71, 3.0}},
1021 {80, {-8.22, 0.03, -2.9, 0.44, -1.58, 1.44, -1.19, 1.01, -3.36, 0.79, 3.7,
1022 2.22, 3.8, 12.0, 4.0, 2.0, 20.0, 0.0, 2.7, 31.45, 4.17, 3.0}},
1023 {90, {-8.21, 0.07, -2.5, 0.82, -1.51, 1.13, -1.13, 0.85, -3.35, 0.65, 3.62,
1024 2.28, 3.8, 12.0, 4.0, 2.0, 20.0, 0.0, 4.97, 28.01, 4.14, 3.0}},
1034static const std::map<std::string, std::map<int, std::array<float, 22>>>
NTNRuralNLOS{
1037 {10, {-9.01, 1.59, -2.9, 1.34, -3.33, 6.22, -0.88, 3.26, -4.92, 3.96, 0.0,
1038 0.0, 1.7, 7.0, 3.0, 3.0, 20.0, 0.0, 0.03, 18.16, 2.32, 3.0}},
1039 {20, {-8.37, 0.95, -2.5, 1.18, -0.74, 4.22, -0.07, 3.29, -4.06, 4.07, 0.0,
1040 0.0, 1.7, 7.0, 3.0, 3.0, 20.0, 0.0, 0.05, 26.82, 7.34, 3.0}},
1041 {30, {-8.05, 0.92, -2.12, 1.08, 0.08, 3.02, 0.75, 1.92, -2.33, 1.7, 0.0,
1042 0.0, 1.7, 7.0, 3.0, 2.0, 20.0, 0.0, 0.07, 21.99, 8.28, 3.0}},
1043 {40, {-7.92, 0.92, -1.99, 1.06, 0.32, 2.45, 0.72, 1.92, -2.24, 2.01, 0.0,
1044 0.0, 1.7, 7.0, 3.0, 2.0, 20.0, 0.0, 0.1, 22.86, 8.76, 3.0}},
1045 {50, {-7.92, 0.87, -1.9, 1.05, 0.53, 1.63, 0.95, 1.45, -2.24, 2.0, 0.0,
1046 0.0, 1.7, 7.0, 3.0, 2.0, 20.0, 0.0, 0.15, 25.93, 9.68, 3.0}},
1047 {60, {-7.96, 0.87, -1.85, 1.06, 0.33, 2.08, 0.97, 1.62, -2.22, 1.82, 0.0,
1048 0.0, 1.7, 7.0, 3.0, 2.0, 20.0, 0.0, 0.22, 27.79, 9.94, 3.0}},
1049 {70, {-7.91, 0.82, -1.69, 1.14, 0.55, 1.58, 1.1, 1.43, -2.19, 1.66, 0.0,
1050 0.0, 1.7, 7.0, 3.0, 2.0, 20.0, 0.0, 0.5, 28.5, 8.9, 3.0}},
1051 {80, {-7.79, 0.86, -1.46, 1.16, 0.45, 2.01, 0.97, 1.88, -2.41, 2.58, 0.0,
1052 0.0, 1.7, 7.0, 3.0, 2.0, 20.0, 0.0, 1.04, 37.53, 13.74, 3.0}},
1053 {90, {-7.74, 0.81, -1.32, 1.3, 0.4, 2.19, 1.35, 0.62, -2.45, 2.52, 0.0,
1054 0.0, 1.7, 7.0, 3.0, 2.0, 20.0, 0.0, 2.11, 29.23, 12.16, 3.0}},
1058 {10, {-9.13, 1.91, -2.9, 1.32, -3.4, 6.28, -1.19, 3.81, -5.47, 4.39, 0.0,
1059 0.0, 1.7, 7.0, 3.0, 3.0, 20.0, 0.0, 0.03, 18.21, 2.13, 3.0}},
1060 {20, {-8.39, 0.94, -2.53, 1.18, -0.51, 3.75, -0.11, 3.33, -4.06, 4.04, 0.0,
1061 0.0, 1.7, 7.0, 3.0, 3.0, 20.0, 0.0, 0.05, 24.08, 6.52, 3.0}},
1062 {30, {-8.1, 0.92, -2.16, 1.08, 0.06, 2.95, 0.72, 1.93, -2.32, 1.54, 0.0,
1063 0.0, 1.7, 7.0, 3.0, 2.0, 20.0, 0.0, 0.07, 22.06, 7.72, 3.0}},
1064 {40, {-7.96, 0.94, -2.04, 1.09, 0.2, 2.65, 0.69, 1.91, -2.19, 1.73, 0.0,
1065 0.0, 1.7, 7.0, 3.0, 2.0, 20.0, 0.0, 0.09, 21.4, 8.45, 3.0}},
1066 {50, {-7.99, 0.89, -1.99, 1.08, 0.4, 1.85, 0.84, 1.7, -2.16, 1.5, 0.0,
1067 0.0, 1.7, 7.0, 3.0, 2.0, 20.0, 0.0, 0.16, 24.26, 8.92, 3.0}},
1068 {60, {-8.05, 0.87, -1.95, 1.06, 0.32, 1.83, 0.99, 1.27, -2.24, 1.64, 0.0,
1069 0.0, 1.7, 7.0, 3.0, 2.0, 20.0, 0.0, 0.22, 24.15, 8.76, 3.0}},
1070 {70, {-8.01, 0.82, -1.81, 1.17, 0.46, 1.57, 0.95, 1.86, -2.29, 1.66, 0.0,
1071 0.0, 1.7, 7.0, 3.0, 2.0, 20.0, 0.0, 0.51, 25.99, 9.0, 3.0}},
1072 {80, {-8.05, 1.65, -1.56, 1.2, 0.33, 1.99, 0.92, 1.84, -2.65, 2.86, 0.0,
1073 0.0, 1.7, 7.0, 3.0, 2.0, 20.0, 0.0, 0.89, 36.07, 13.6, 3.0}},
1074 {90, {-7.91, 0.76, -1.53, 1.27, 0.24, 2.18, 1.29, 0.59, -2.23, 1.12, 0.0,
1075 0.0, 1.7, 7.0, 3.0, 2.0, 20.0, 0.0, 1.68, 24.51, 10.56, 3.0}},
1277 double hUT = std::min(aMob->GetPosition().z, bMob->GetPosition().z);
1278 double hBS = std::max(aMob->GetPosition().z, bMob->GetPosition().z);
1280 double distance2D = sqrt(pow(aMob->GetPosition().x - bMob->GetPosition().x, 2) +
1281 pow(aMob->GetPosition().y - bMob->GetPosition().y, 2));
1290 bool los = channelCondition->IsLos();
1291 bool o2i = channelCondition->IsO2i();
1300 table3gpp->m_numOfCluster = 11;
1301 table3gpp->m_raysPerCluster = 20;
1302 table3gpp->m_uLgDS = -7.49;
1303 table3gpp->m_sigLgDS = 0.55;
1304 table3gpp->m_uLgASD = 0.90;
1305 table3gpp->m_sigLgASD = 0.38;
1306 table3gpp->m_uLgASA = 1.52;
1307 table3gpp->m_sigLgASA = 0.24;
1308 table3gpp->m_uLgZSA = 0.47;
1309 table3gpp->m_sigLgZSA = 0.40;
1310 table3gpp->m_uLgZSD = 0.34;
1311 table3gpp->m_sigLgZSD =
1312 std::max(-1.0, -0.17 * (distance2D / 1000.0) - 0.01 * (hUT - 1.5) + 0.22);
1313 table3gpp->m_offsetZOD = 0;
1314 table3gpp->m_cDS = 3.91e-9;
1315 table3gpp->m_cASD = 2;
1316 table3gpp->m_cASA = 3;
1317 table3gpp->m_cZSA = 3;
1318 table3gpp->m_uK = 7;
1319 table3gpp->m_sigK = 4;
1320 table3gpp->m_rTau = 3.8;
1321 table3gpp->m_uXpr = 12;
1322 table3gpp->m_sigXpr = 4;
1323 table3gpp->m_perClusterShadowingStd = 3;
1324 table3gpp->m_perClusterRayDcorDistance = 50;
1325 table3gpp->m_blockerDcorDistance = 10;
1327 for (uint8_t row = 0; row < 7; row++)
1329 for (uint8_t column = 0; column < 7; column++)
1331 table3gpp->m_sqrtC[row][column] =
sqrtC_RMa_LOS[row][column];
1335 else if (!los && !o2i)
1337 table3gpp->m_numOfCluster = 10;
1338 table3gpp->m_raysPerCluster = 20;
1339 table3gpp->m_uLgDS = -7.43;
1340 table3gpp->m_sigLgDS = 0.48;
1341 table3gpp->m_uLgASD = 0.95;
1342 table3gpp->m_sigLgASD = 0.45;
1343 table3gpp->m_uLgASA = 1.52;
1344 table3gpp->m_sigLgASA = 0.13;
1345 table3gpp->m_uLgZSA = 0.58;
1346 table3gpp->m_sigLgZSA = 0.37;
1347 table3gpp->m_uLgZSD =
1348 std::max(-1.0, -0.19 * (distance2D / 1000.0) - 0.01 * (hUT - 1.5) + 0.28);
1349 table3gpp->m_sigLgZSD = 0.30;
1350 table3gpp->m_offsetZOD = atan((35 - 3.5) / distance2D) - atan((35 - 1.5) / distance2D);
1351 table3gpp->m_cDS = 3.91e-9;
1352 table3gpp->m_cASD = 2;
1353 table3gpp->m_cASA = 3;
1354 table3gpp->m_cZSA = 3;
1355 table3gpp->m_uK = 0;
1356 table3gpp->m_sigK = 0;
1357 table3gpp->m_rTau = 1.7;
1358 table3gpp->m_uXpr = 7;
1359 table3gpp->m_sigXpr = 3;
1360 table3gpp->m_perClusterShadowingStd = 3;
1361 table3gpp->m_perClusterRayDcorDistance = 60;
1362 table3gpp->m_blockerDcorDistance = 10;
1364 for (uint8_t row = 0; row < 6; row++)
1366 for (uint8_t column = 0; column < 6; column++)
1374 table3gpp->m_numOfCluster = 10;
1375 table3gpp->m_raysPerCluster = 20;
1376 table3gpp->m_uLgDS = -7.47;
1377 table3gpp->m_sigLgDS = 0.24;
1378 table3gpp->m_uLgASD = 0.67;
1379 table3gpp->m_sigLgASD = 0.18;
1380 table3gpp->m_uLgASA = 1.66;
1381 table3gpp->m_sigLgASA = 0.21;
1382 table3gpp->m_uLgZSA = 0.93;
1383 table3gpp->m_sigLgZSA = 0.22;
1384 table3gpp->m_uLgZSD =
1385 std::max(-1.0, -0.19 * (distance2D / 1000.0) - 0.01 * (hUT - 1.5) + 0.28);
1386 table3gpp->m_sigLgZSD = 0.30;
1387 table3gpp->m_offsetZOD = atan((35 - 3.5) / distance2D) - atan((35 - 1.5) / distance2D);
1388 table3gpp->m_cDS = 3.91e-9;
1389 table3gpp->m_cASD = 2;
1390 table3gpp->m_cASA = 3;
1391 table3gpp->m_cZSA = 3;
1392 table3gpp->m_uK = 0;
1393 table3gpp->m_sigK = 0;
1394 table3gpp->m_rTau = 1.7;
1395 table3gpp->m_uXpr = 7;
1396 table3gpp->m_sigXpr = 3;
1397 table3gpp->m_perClusterShadowingStd = 3;
1398 table3gpp->m_perClusterRayDcorDistance = 15;
1399 table3gpp->m_blockerDcorDistance = 5;
1401 for (uint8_t row = 0; row < 6; row++)
1403 for (uint8_t column = 0; column < 6; column++)
1405 table3gpp->m_sqrtC[row][column] =
sqrtC_RMa_O2I[row][column];
1414 table3gpp->m_numOfCluster = 12;
1415 table3gpp->m_raysPerCluster = 20;
1416 table3gpp->m_uLgDS = -6.955 - 0.0963 * log10(fcGHz);
1417 table3gpp->m_sigLgDS = 0.66;
1418 table3gpp->m_uLgASD = 1.06 + 0.1114 * log10(fcGHz);
1419 table3gpp->m_sigLgASD = 0.28;
1420 table3gpp->m_uLgASA = 1.81;
1421 table3gpp->m_sigLgASA = 0.20;
1422 table3gpp->m_uLgZSA = 0.95;
1423 table3gpp->m_sigLgZSA = 0.16;
1424 table3gpp->m_uLgZSD =
1425 std::max(-0.5, -2.1 * distance2D / 1000.0 - 0.01 * (hUT - 1.5) + 0.75);
1426 table3gpp->m_sigLgZSD = 0.40;
1427 table3gpp->m_offsetZOD = 0;
1428 table3gpp->m_cDS = std::max(0.25, -3.4084 * log10(fcGHz) + 6.5622) * 1e-9;
1429 table3gpp->m_cASD = 5;
1430 table3gpp->m_cASA = 11;
1431 table3gpp->m_cZSA = 7;
1432 table3gpp->m_uK = 9;
1433 table3gpp->m_sigK = 3.5;
1434 table3gpp->m_rTau = 2.5;
1435 table3gpp->m_uXpr = 8;
1436 table3gpp->m_sigXpr = 4;
1437 table3gpp->m_perClusterShadowingStd = 3;
1438 table3gpp->m_perClusterRayDcorDistance = 40;
1439 table3gpp->m_blockerDcorDistance = 10;
1441 for (uint8_t row = 0; row < 7; row++)
1443 for (uint8_t column = 0; column < 7; column++)
1445 table3gpp->m_sqrtC[row][column] =
sqrtC_UMa_LOS[row][column];
1451 double uLgZSD = std::max(-0.5, -2.1 * distance2D / 1000.0 - 0.01 * (hUT - 1.5) + 0.9);
1453 double afc = 0.208 * log10(fcGHz) - 0.782;
1455 double cfc = -0.13 * log10(fcGHz) + 2.03;
1456 double efc = 7.66 * log10(fcGHz) - 5.96;
1458 double offsetZOD = efc - std::pow(10, afc * log10(std::max(bfc, distance2D)) + cfc);
1462 table3gpp->m_numOfCluster = 20;
1463 table3gpp->m_raysPerCluster = 20;
1464 table3gpp->m_uLgDS = -6.28 - 0.204 * log10(fcGHz);
1465 table3gpp->m_sigLgDS = 0.39;
1466 table3gpp->m_uLgASD = 1.5 - 0.1144 * log10(fcGHz);
1467 table3gpp->m_sigLgASD = 0.28;
1468 table3gpp->m_uLgASA = 2.08 - 0.27 * log10(fcGHz);
1469 table3gpp->m_sigLgASA = 0.11;
1470 table3gpp->m_uLgZSA = -0.3236 * log10(fcGHz) + 1.512;
1471 table3gpp->m_sigLgZSA = 0.16;
1472 table3gpp->m_uLgZSD =
uLgZSD;
1473 table3gpp->m_sigLgZSD = 0.49;
1474 table3gpp->m_offsetZOD = offsetZOD;
1475 table3gpp->m_cDS = std::max(0.25, -3.4084 * log10(fcGHz) + 6.5622) * 1e-9;
1476 table3gpp->m_cASD = 2;
1477 table3gpp->m_cASA = 15;
1478 table3gpp->m_cZSA = 7;
1479 table3gpp->m_uK = 0;
1480 table3gpp->m_sigK = 0;
1481 table3gpp->m_rTau = 2.3;
1482 table3gpp->m_uXpr = 7;
1483 table3gpp->m_sigXpr = 3;
1484 table3gpp->m_perClusterShadowingStd = 3;
1485 table3gpp->m_perClusterRayDcorDistance = 50;
1486 table3gpp->m_blockerDcorDistance = 10;
1488 for (uint8_t row = 0; row < 6; row++)
1490 for (uint8_t column = 0; column < 6; column++)
1498 table3gpp->m_numOfCluster = 12;
1499 table3gpp->m_raysPerCluster = 20;
1500 table3gpp->m_uLgDS = -6.62;
1501 table3gpp->m_sigLgDS = 0.32;
1502 table3gpp->m_uLgASD = 1.25;
1503 table3gpp->m_sigLgASD = 0.42;
1504 table3gpp->m_uLgASA = 1.76;
1505 table3gpp->m_sigLgASA = 0.16;
1506 table3gpp->m_uLgZSA = 1.01;
1507 table3gpp->m_sigLgZSA = 0.43;
1508 table3gpp->m_uLgZSD =
uLgZSD;
1509 table3gpp->m_sigLgZSD = 0.49;
1510 table3gpp->m_offsetZOD = offsetZOD;
1511 table3gpp->m_cDS = 11e-9;
1512 table3gpp->m_cASD = 5;
1513 table3gpp->m_cASA = 8;
1514 table3gpp->m_cZSA = 3;
1515 table3gpp->m_uK = 0;
1516 table3gpp->m_sigK = 0;
1517 table3gpp->m_rTau = 2.2;
1518 table3gpp->m_uXpr = 9;
1519 table3gpp->m_sigXpr = 5;
1520 table3gpp->m_perClusterShadowingStd = 4;
1521 table3gpp->m_perClusterRayDcorDistance = 15;
1522 table3gpp->m_blockerDcorDistance = 5;
1524 for (uint8_t row = 0; row < 6; row++)
1526 for (uint8_t column = 0; column < 6; column++)
1528 table3gpp->m_sqrtC[row][column] =
sqrtC_UMa_O2I[row][column];
1538 table3gpp->m_numOfCluster = 12;
1539 table3gpp->m_raysPerCluster = 20;
1540 table3gpp->m_uLgDS = -0.24 * log10(1 + fcGHz) - 7.14;
1541 table3gpp->m_sigLgDS = 0.38;
1542 table3gpp->m_uLgASD = -0.05 * log10(1 + fcGHz) + 1.21;
1543 table3gpp->m_sigLgASD = 0.41;
1544 table3gpp->m_uLgASA = -0.08 * log10(1 + fcGHz) + 1.73;
1545 table3gpp->m_sigLgASA = 0.014 * log10(1 + fcGHz) + 0.28;
1546 table3gpp->m_uLgZSA = -0.1 * log10(1 + fcGHz) + 0.73;
1547 table3gpp->m_sigLgZSA = -0.04 * log10(1 + fcGHz) + 0.34;
1548 table3gpp->m_uLgZSD =
1549 std::max(-0.21, -14.8 * distance2D / 1000.0 + 0.01 * std::abs(hUT - hBS) + 0.83);
1550 table3gpp->m_sigLgZSD = 0.35;
1551 table3gpp->m_offsetZOD = 0;
1552 table3gpp->m_cDS = 5e-9;
1553 table3gpp->m_cASD = 3;
1554 table3gpp->m_cASA = 17;
1555 table3gpp->m_cZSA = 7;
1556 table3gpp->m_uK = 9;
1557 table3gpp->m_sigK = 5;
1558 table3gpp->m_rTau = 3;
1559 table3gpp->m_uXpr = 9;
1560 table3gpp->m_sigXpr = 3;
1561 table3gpp->m_perClusterShadowingStd = 3;
1562 table3gpp->m_perClusterRayDcorDistance = 12;
1563 table3gpp->m_blockerDcorDistance = 10;
1565 for (uint8_t row = 0; row < 7; row++)
1567 for (uint8_t column = 0; column < 7; column++)
1569 table3gpp->m_sqrtC[row][column] =
sqrtC_UMi_LOS[row][column];
1576 std::max(-0.5, -3.1 * distance2D / 1000.0 + 0.01 * std::max(hUT - hBS, 0.0) + 0.2);
1577 double offsetZOD = -1 * std::pow(10, -1.5 * log10(std::max(10.0, distance2D)) + 3.3);
1580 table3gpp->m_numOfCluster = 19;
1581 table3gpp->m_raysPerCluster = 20;
1582 table3gpp->m_uLgDS = -0.24 * log10(1 + fcGHz) - 6.83;
1583 table3gpp->m_sigLgDS = 0.16 * log10(1 + fcGHz) + 0.28;
1584 table3gpp->m_uLgASD = -0.23 * log10(1 + fcGHz) + 1.53;
1585 table3gpp->m_sigLgASD = 0.11 * log10(1 + fcGHz) + 0.33;
1586 table3gpp->m_uLgASA = -0.08 * log10(1 + fcGHz) + 1.81;
1587 table3gpp->m_sigLgASA = 0.05 * log10(1 + fcGHz) + 0.3;
1588 table3gpp->m_uLgZSA = -0.04 * log10(1 + fcGHz) + 0.92;
1589 table3gpp->m_sigLgZSA = -0.07 * log10(1 + fcGHz) + 0.41;
1590 table3gpp->m_uLgZSD =
uLgZSD;
1591 table3gpp->m_sigLgZSD = 0.35;
1592 table3gpp->m_offsetZOD = offsetZOD;
1593 table3gpp->m_cDS = 11e-9;
1594 table3gpp->m_cASD = 10;
1595 table3gpp->m_cASA = 22;
1596 table3gpp->m_cZSA = 7;
1597 table3gpp->m_uK = 0;
1598 table3gpp->m_sigK = 0;
1599 table3gpp->m_rTau = 2.1;
1600 table3gpp->m_uXpr = 8;
1601 table3gpp->m_sigXpr = 3;
1602 table3gpp->m_perClusterShadowingStd = 3;
1603 table3gpp->m_perClusterRayDcorDistance = 15;
1604 table3gpp->m_blockerDcorDistance = 10;
1606 for (uint8_t row = 0; row < 6; row++)
1608 for (uint8_t column = 0; column < 6; column++)
1616 table3gpp->m_numOfCluster = 12;
1617 table3gpp->m_raysPerCluster = 20;
1618 table3gpp->m_uLgDS = -6.62;
1619 table3gpp->m_sigLgDS = 0.32;
1620 table3gpp->m_uLgASD = 1.25;
1621 table3gpp->m_sigLgASD = 0.42;
1622 table3gpp->m_uLgASA = 1.76;
1623 table3gpp->m_sigLgASA = 0.16;
1624 table3gpp->m_uLgZSA = 1.01;
1625 table3gpp->m_sigLgZSA = 0.43;
1626 table3gpp->m_uLgZSD =
uLgZSD;
1627 table3gpp->m_sigLgZSD = 0.35;
1628 table3gpp->m_offsetZOD = offsetZOD;
1629 table3gpp->m_cDS = 11e-9;
1630 table3gpp->m_cASD = 5;
1631 table3gpp->m_cASA = 8;
1632 table3gpp->m_cZSA = 3;
1633 table3gpp->m_uK = 0;
1634 table3gpp->m_sigK = 0;
1635 table3gpp->m_rTau = 2.2;
1636 table3gpp->m_uXpr = 9;
1637 table3gpp->m_sigXpr = 5;
1638 table3gpp->m_perClusterShadowingStd = 4;
1639 table3gpp->m_perClusterRayDcorDistance = 15;
1640 table3gpp->m_blockerDcorDistance = 5;
1642 for (uint8_t row = 0; row < 6; row++)
1644 for (uint8_t column = 0; column < 6; column++)
1646 table3gpp->m_sqrtC[row][column] =
sqrtC_UMi_O2I[row][column];
1654 NS_ASSERT_MSG(!o2i,
"The indoor scenario does out support outdoor to indoor");
1657 table3gpp->m_numOfCluster = 15;
1658 table3gpp->m_raysPerCluster = 20;
1659 table3gpp->m_uLgDS = -0.01 * log10(1 + fcGHz) - 7.692;
1660 table3gpp->m_sigLgDS = 0.18;
1661 table3gpp->m_uLgASD = 1.60;
1662 table3gpp->m_sigLgASD = 0.18;
1663 table3gpp->m_uLgASA = -0.19 * log10(1 + fcGHz) + 1.781;
1664 table3gpp->m_sigLgASA = 0.12 * log10(1 + fcGHz) + 0.119;
1665 table3gpp->m_uLgZSA = -0.26 * log10(1 + fcGHz) + 1.44;
1666 table3gpp->m_sigLgZSA = -0.04 * log10(1 + fcGHz) + 0.264;
1667 table3gpp->m_uLgZSD = -1.43 * log10(1 + fcGHz) + 2.228;
1668 table3gpp->m_sigLgZSD = 0.13 * log10(1 + fcGHz) + 0.30;
1669 table3gpp->m_offsetZOD = 0;
1670 table3gpp->m_cDS = 3.91e-9;
1671 table3gpp->m_cASD = 5;
1672 table3gpp->m_cASA = 8;
1673 table3gpp->m_cZSA = 9;
1674 table3gpp->m_uK = 7;
1675 table3gpp->m_sigK = 4;
1676 table3gpp->m_rTau = 3.6;
1677 table3gpp->m_uXpr = 11;
1678 table3gpp->m_sigXpr = 4;
1679 table3gpp->m_perClusterShadowingStd = 6;
1680 table3gpp->m_perClusterRayDcorDistance = 10;
1681 table3gpp->m_blockerDcorDistance = 5;
1683 for (uint8_t row = 0; row < 7; row++)
1685 for (uint8_t column = 0; column < 7; column++)
1693 table3gpp->m_numOfCluster = 19;
1694 table3gpp->m_raysPerCluster = 20;
1695 table3gpp->m_uLgDS = -0.28 * log10(1 + fcGHz) - 7.173;
1696 table3gpp->m_sigLgDS = 0.1 * log10(1 + fcGHz) + 0.055;
1697 table3gpp->m_uLgASD = 1.62;
1698 table3gpp->m_sigLgASD = 0.25;
1699 table3gpp->m_uLgASA = -0.11 * log10(1 + fcGHz) + 1.863;
1700 table3gpp->m_sigLgASA = 0.12 * log10(1 + fcGHz) + 0.059;
1701 table3gpp->m_uLgZSA = -0.15 * log10(1 + fcGHz) + 1.387;
1702 table3gpp->m_sigLgZSA = -0.09 * log10(1 + fcGHz) + 0.746;
1703 table3gpp->m_uLgZSD = 1.08;
1704 table3gpp->m_sigLgZSD = 0.36;
1705 table3gpp->m_offsetZOD = 0;
1706 table3gpp->m_cDS = 3.91e-9;
1707 table3gpp->m_cASD = 5;
1708 table3gpp->m_cASA = 11;
1709 table3gpp->m_cZSA = 9;
1710 table3gpp->m_uK = 0;
1711 table3gpp->m_sigK = 0;
1712 table3gpp->m_rTau = 3;
1713 table3gpp->m_uXpr = 10;
1714 table3gpp->m_sigXpr = 4;
1715 table3gpp->m_perClusterShadowingStd = 3;
1716 table3gpp->m_perClusterRayDcorDistance = 10;
1717 table3gpp->m_blockerDcorDistance = 5;
1719 for (uint8_t row = 0; row < 6; row++)
1721 for (uint8_t column = 0; column < 6; column++)
1730 if (channelCondition->IsLos())
1734 table3gpp->m_numOfCluster = 12;
1735 table3gpp->m_raysPerCluster = 20;
1736 table3gpp->m_uLgDS = -0.2 * log10(1 + fcGHz) - 7.5;
1737 table3gpp->m_sigLgDS = 0.1;
1738 table3gpp->m_uLgASD = -0.1 * log10(1 + fcGHz) + 1.6;
1739 table3gpp->m_sigLgASD = 0.1;
1740 table3gpp->m_uLgASA = -0.1 * log10(1 + fcGHz) + 1.6;
1741 table3gpp->m_sigLgASA = 0.1;
1742 table3gpp->m_uLgZSA = -0.1 * log10(1 + fcGHz) + 0.73;
1743 table3gpp->m_sigLgZSA = -0.04 * log10(1 + fcGHz) + 0.34;
1744 table3gpp->m_uLgZSD = -0.1 * log10(1 + fcGHz) + 0.73;
1745 table3gpp->m_sigLgZSD = -0.04 * log10(1 + fcGHz) + 0.34;
1746 table3gpp->m_offsetZOD = 0;
1747 table3gpp->m_cDS = 5 * 1e-9;
1748 table3gpp->m_cASD = 17;
1749 table3gpp->m_cASA = 17;
1750 table3gpp->m_cZSA = 7;
1751 table3gpp->m_uK = 3.48;
1752 table3gpp->m_sigK = 2;
1753 table3gpp->m_rTau = 3;
1754 table3gpp->m_uXpr = 9;
1755 table3gpp->m_sigXpr = 3;
1756 table3gpp->m_perClusterShadowingStd = 4;
1758 for (uint8_t row = 0; row < 7; row++)
1760 for (uint8_t column = 0; column < 7; column++)
1762 table3gpp->m_sqrtC[row][column] =
sqrtC_UMi_LOS[row][column];
1766 else if (channelCondition->IsNlos())
1768 table3gpp->m_numOfCluster = 19;
1769 table3gpp->m_raysPerCluster = 20;
1770 table3gpp->m_uLgDS = -0.3 * log10(1 + fcGHz) - 7;
1771 table3gpp->m_sigLgDS = 0.28;
1772 table3gpp->m_uLgASD = -0.08 * log10(1 + fcGHz) + 1.81;
1773 table3gpp->m_sigLgASD = 0.05 * log10(1 + fcGHz) + 0.3;
1774 table3gpp->m_uLgASA = -0.08 * log10(1 + fcGHz) + 1.81;
1775 table3gpp->m_sigLgASA = 0.05 * log10(1 + fcGHz) + 0.3;
1776 table3gpp->m_uLgZSA = -0.04 * log10(1 + fcGHz) + 0.92;
1777 table3gpp->m_sigLgZSA = -0.07 * log10(1 + fcGHz) + 0.41;
1778 table3gpp->m_uLgZSD = -0.04 * log10(1 + fcGHz) + 0.92;
1779 table3gpp->m_sigLgZSD = -0.07 * log10(1 + fcGHz) + 0.41;
1780 table3gpp->m_offsetZOD = 0;
1781 table3gpp->m_cDS = 11 * 1e-9;
1782 table3gpp->m_cASD = 22;
1783 table3gpp->m_cASA = 22;
1784 table3gpp->m_cZSA = 7;
1785 table3gpp->m_uK = 0;
1786 table3gpp->m_sigK = 0;
1787 table3gpp->m_rTau = 2.1;
1788 table3gpp->m_uXpr = 8;
1789 table3gpp->m_sigXpr = 3;
1790 table3gpp->m_perClusterShadowingStd = 4;
1792 for (uint8_t row = 0; row < 6; row++)
1794 for (uint8_t column = 0; column < 6; column++)
1800 else if (channelCondition->IsNlosv())
1802 table3gpp->m_numOfCluster = 19;
1803 table3gpp->m_raysPerCluster = 20;
1804 table3gpp->m_uLgDS = -0.4 * log10(1 + fcGHz) - 7;
1805 table3gpp->m_sigLgDS = 0.1;
1806 table3gpp->m_uLgASD = -0.1 * log10(1 + fcGHz) + 1.7;
1807 table3gpp->m_sigLgASD = 0.1;
1808 table3gpp->m_uLgASA = -0.1 * log10(1 + fcGHz) + 1.7;
1809 table3gpp->m_sigLgASA = 0.1;
1810 table3gpp->m_uLgZSA = -0.04 * log10(1 + fcGHz) + 0.92;
1811 table3gpp->m_sigLgZSA = -0.07 * log10(1 + fcGHz) + 0.41;
1812 table3gpp->m_uLgZSD = -0.04 * log10(1 + fcGHz) + 0.92;
1813 table3gpp->m_sigLgZSD = -0.07 * log10(1 + fcGHz) + 0.41;
1814 table3gpp->m_offsetZOD = 0;
1815 table3gpp->m_cDS = 11 * 1e-9;
1816 table3gpp->m_cASD = 22;
1817 table3gpp->m_cASA = 22;
1818 table3gpp->m_cZSA = 7;
1819 table3gpp->m_uK = 0;
1820 table3gpp->m_sigK = 4.5;
1821 table3gpp->m_rTau = 2.1;
1822 table3gpp->m_uXpr = 8;
1823 table3gpp->m_sigXpr = 3;
1824 table3gpp->m_perClusterShadowingStd = 4;
1826 for (uint8_t row = 0; row < 6; row++)
1828 for (uint8_t column = 0; column < 6; column++)
1830 table3gpp->m_sqrtC[row][column] =
sqrtC_UMi_LOS[row][column];
1841 if (channelCondition->IsLos())
1843 table3gpp->m_numOfCluster = 12;
1844 table3gpp->m_raysPerCluster = 20;
1845 table3gpp->m_uLgDS = -8.3;
1846 table3gpp->m_sigLgDS = 0.2;
1847 table3gpp->m_uLgASD = 1.4;
1848 table3gpp->m_sigLgASD = 0.1;
1849 table3gpp->m_uLgASA = 1.4;
1850 table3gpp->m_sigLgASA = 0.1;
1851 table3gpp->m_uLgZSA = -0.1 * log10(1 + fcGHz) + 0.73;
1852 table3gpp->m_sigLgZSA = -0.04 * log10(1 + fcGHz) + 0.34;
1853 table3gpp->m_uLgZSD = -0.1 * log10(1 + fcGHz) + 0.73;
1854 table3gpp->m_sigLgZSD = -0.04 * log10(1 + fcGHz) + 0.34;
1855 table3gpp->m_offsetZOD = 0;
1856 table3gpp->m_cDS = 5 * 1e-9;
1857 table3gpp->m_cASD = 17;
1858 table3gpp->m_cASA = 17;
1859 table3gpp->m_cZSA = 7;
1860 table3gpp->m_uK = 9;
1861 table3gpp->m_sigK = 3.5;
1862 table3gpp->m_rTau = 3;
1863 table3gpp->m_uXpr = 9;
1864 table3gpp->m_sigXpr = 3;
1865 table3gpp->m_perClusterShadowingStd = 4;
1867 for (uint8_t row = 0; row < 7; row++)
1869 for (uint8_t column = 0; column < 7; column++)
1871 table3gpp->m_sqrtC[row][column] =
sqrtC_UMi_LOS[row][column];
1875 else if (channelCondition->IsNlosv())
1877 table3gpp->m_numOfCluster = 19;
1878 table3gpp->m_raysPerCluster = 20;
1879 table3gpp->m_uLgDS = -8.3;
1880 table3gpp->m_sigLgDS = 0.3;
1881 table3gpp->m_uLgASD = 1.5;
1882 table3gpp->m_sigLgASD = 0.1;
1883 table3gpp->m_uLgASA = 1.5;
1884 table3gpp->m_sigLgASA = 0.1;
1885 table3gpp->m_uLgZSA = -0.04 * log10(1 + fcGHz) + 0.92;
1886 table3gpp->m_sigLgZSA = -0.07 * log10(1 + fcGHz) + 0.41;
1887 table3gpp->m_uLgZSD = -0.04 * log10(1 + fcGHz) + 0.92;
1888 table3gpp->m_sigLgZSD = -0.07 * log10(1 + fcGHz) + 0.41;
1889 table3gpp->m_offsetZOD = 0;
1890 table3gpp->m_cDS = 11 * 1e-9;
1891 table3gpp->m_cASD = 22;
1892 table3gpp->m_cASA = 22;
1893 table3gpp->m_cZSA = 7;
1894 table3gpp->m_uK = 0;
1895 table3gpp->m_sigK = 4.5;
1896 table3gpp->m_rTau = 2.1;
1897 table3gpp->m_uXpr = 8.0;
1898 table3gpp->m_sigXpr = 3;
1899 table3gpp->m_perClusterShadowingStd = 4;
1901 for (uint8_t row = 0; row < 6; row++)
1903 for (uint8_t column = 0; column < 6; column++)
1905 table3gpp->m_sqrtC[row][column] =
sqrtC_UMi_LOS[row][column];
1909 else if (channelCondition->IsNlos())
1912 "The fast fading parameters for the NLOS condition in the Highway scenario are not "
1913 "defined in TR 37.885, use the ones defined in TDoc R1-1803671 instead");
1915 table3gpp->m_numOfCluster = 19;
1916 table3gpp->m_raysPerCluster = 20;
1917 table3gpp->m_uLgDS = -0.3 * log10(1 + fcGHz) - 7;
1918 table3gpp->m_sigLgDS = 0.28;
1919 table3gpp->m_uLgASD = -0.08 * log10(1 + fcGHz) + 1.81;
1920 table3gpp->m_sigLgASD = 0.05 * log10(1 + fcGHz) + 0.3;
1921 table3gpp->m_uLgASA = -0.08 * log10(1 + fcGHz) + 1.81;
1922 table3gpp->m_sigLgASA = 0.05 * log10(1 + fcGHz) + 0.3;
1923 table3gpp->m_uLgZSA = -0.04 * log10(1 + fcGHz) + 0.92;
1924 table3gpp->m_sigLgZSA = -0.07 * log10(1 + fcGHz) + 0.41;
1925 table3gpp->m_uLgZSD = -0.04 * log10(1 + fcGHz) + 0.92;
1926 table3gpp->m_sigLgZSD = -0.07 * log10(1 + fcGHz) + 0.41;
1927 table3gpp->m_offsetZOD = 0;
1928 table3gpp->m_cDS = 11 * 1e-9;
1929 table3gpp->m_cASD = 22;
1930 table3gpp->m_cASA = 22;
1931 table3gpp->m_cZSA = 7;
1932 table3gpp->m_uK = 0;
1933 table3gpp->m_sigK = 0;
1934 table3gpp->m_rTau = 2.1;
1935 table3gpp->m_uXpr = 8;
1936 table3gpp->m_sigXpr = 3;
1937 table3gpp->m_perClusterShadowingStd = 4;
1939 for (uint8_t row = 0; row < 6; row++)
1941 for (uint8_t column = 0; column < 6; column++)
1954 std::string freqBand = fcGHz < 13 ?
"S" :
"Ka";
1956 double elevAngle = 0;
1957 bool isSatellite =
false;
1975 if (aNTNMob->GetGeographicPosition().z <
1976 bNTNMob->GetGeographicPosition().z)
1978 elevAngle = aNTNMob->GetElevationAngle(bNTNMob);
1979 if (bNTNMob->GetGeographicPosition().z > 50000)
1986 elevAngle = bNTNMob->GetElevationAngle(aNTNMob);
1987 if (aNTNMob->GetGeographicPosition().z > 50000)
1995 NS_FATAL_ERROR(
"Mobility Models needs to be of type Geocentric for NTN scenarios");
1999 int elevAngleQuantized = elevAngle < 10 ? 10 : round(elevAngle / 10) * 10;
2003 if (channelCondition->IsLos())
2006 table3gpp->m_sigLgDS =
2012 table3gpp->m_sigLgASD =
2016 table3gpp->m_sigLgASA =
2019 table3gpp->m_sigLgZSA =
2025 table3gpp->m_sigLgZSD =
2033 table3gpp->m_numOfCluster =
2035 table3gpp->m_raysPerCluster =
2041 table3gpp->m_perClusterShadowingStd =
2044 for (uint8_t row = 0; row < 7; row++)
2046 for (uint8_t column = 0; column < 7; column++)
2052 else if (channelCondition->IsNlos())
2056 table3gpp->m_sigLgDS =
2059 table3gpp->m_sigLgASD =
2062 table3gpp->m_sigLgASA =
2065 table3gpp->m_sigLgZSA =
2068 table3gpp->m_sigLgZSD =
2073 table3gpp->m_numOfCluster =
2075 table3gpp->m_raysPerCluster =
2082 table3gpp->m_perClusterShadowingStd =
2085 for (uint8_t row = 0; row < 6; row++)
2087 for (uint8_t column = 0; column < 6; column++)
2096 if (channelCondition->IsLos())
2098 table3gpp->m_uLgDS =
NTNUrbanLOS.at(freqBand).at(elevAngleQuantized)[
uLgDS];
2108 table3gpp->m_uK =
NTNUrbanLOS.at(freqBand).at(elevAngleQuantized)[
uK];
2109 table3gpp->m_sigK =
NTNUrbanLOS.at(freqBand).at(elevAngleQuantized)[
sigK];
2110 table3gpp->m_rTau =
NTNUrbanLOS.at(freqBand).at(elevAngleQuantized)[
rTau];
2111 table3gpp->m_uXpr =
NTNUrbanLOS.at(freqBand).at(elevAngleQuantized)[
uXpr];
2113 table3gpp->m_numOfCluster =
2115 table3gpp->m_raysPerCluster =
2117 table3gpp->m_cDS =
NTNUrbanLOS.at(freqBand).at(elevAngleQuantized)[
cDS] * 1e-9;
2118 table3gpp->m_cASD =
NTNUrbanLOS.at(freqBand).at(elevAngleQuantized)[
cASD];
2119 table3gpp->m_cASA =
NTNUrbanLOS.at(freqBand).at(elevAngleQuantized)[
cASA];
2120 table3gpp->m_cZSA =
NTNUrbanLOS.at(freqBand).at(elevAngleQuantized)[
cZSA];
2121 table3gpp->m_perClusterShadowingStd =
2124 for (uint8_t row = 0; row < 7; row++)
2126 for (uint8_t column = 0; column < 7; column++)
2132 else if (channelCondition->IsNlos())
2144 table3gpp->m_uK =
NTNUrbanNLOS.at(freqBand).at(elevAngleQuantized)[
uK];
2145 table3gpp->m_sigK =
NTNUrbanNLOS.at(freqBand).at(elevAngleQuantized)[
sigK];
2146 table3gpp->m_rTau =
NTNUrbanNLOS.at(freqBand).at(elevAngleQuantized)[
rTau];
2147 table3gpp->m_uXpr =
NTNUrbanNLOS.at(freqBand).at(elevAngleQuantized)[
uXpr];
2149 table3gpp->m_numOfCluster =
2151 table3gpp->m_raysPerCluster =
2153 table3gpp->m_cDS =
NTNUrbanNLOS.at(freqBand).at(elevAngleQuantized)[
cDS] * 1e-9;
2154 table3gpp->m_cASD =
NTNUrbanNLOS.at(freqBand).at(elevAngleQuantized)[
cASD];
2155 table3gpp->m_cASA =
NTNUrbanNLOS.at(freqBand).at(elevAngleQuantized)[
cASA];
2156 table3gpp->m_cZSA =
NTNUrbanNLOS.at(freqBand).at(elevAngleQuantized)[
cZSA];
2157 table3gpp->m_perClusterShadowingStd =
2160 for (uint8_t row = 0; row < 6; row++)
2162 for (uint8_t column = 0; column < 6; column++)
2164 table3gpp->m_sqrtC[row][column] =
2172 if (channelCondition->IsLos())
2177 table3gpp->m_sigLgASD =
2180 table3gpp->m_sigLgASA =
2183 table3gpp->m_sigLgZSA =
2186 table3gpp->m_sigLgZSD =
2193 table3gpp->m_numOfCluster =
2195 table3gpp->m_raysPerCluster =
2197 table3gpp->m_cDS =
NTNSuburbanLOS.at(freqBand).at(elevAngleQuantized)[
cDS] * 1e-9;
2201 table3gpp->m_perClusterShadowingStd =
2204 for (uint8_t row = 0; row < 7; row++)
2206 for (uint8_t column = 0; column < 7; column++)
2212 else if (channelCondition->IsNlos())
2217 table3gpp->m_sigLgASD =
2220 table3gpp->m_sigLgASA =
2223 table3gpp->m_sigLgZSA =
2226 table3gpp->m_sigLgZSD =
2233 table3gpp->m_numOfCluster =
2235 table3gpp->m_raysPerCluster =
2241 table3gpp->m_perClusterShadowingStd =
2244 for (uint8_t row = 0; row < 6; row++)
2246 for (uint8_t column = 0; column < 6; column++)
2255 if (channelCondition->IsLos())
2257 table3gpp->m_uLgDS =
NTNRuralLOS.at(freqBand).at(elevAngleQuantized)[
uLgDS];
2267 table3gpp->m_uK =
NTNRuralLOS.at(freqBand).at(elevAngleQuantized)[
uK];
2268 table3gpp->m_sigK =
NTNRuralLOS.at(freqBand).at(elevAngleQuantized)[
sigK];
2269 table3gpp->m_rTau =
NTNRuralLOS.at(freqBand).at(elevAngleQuantized)[
rTau];
2270 table3gpp->m_uXpr =
NTNRuralLOS.at(freqBand).at(elevAngleQuantized)[
uXpr];
2272 table3gpp->m_numOfCluster =
2274 table3gpp->m_raysPerCluster =
2276 table3gpp->m_cDS =
NTNRuralLOS.at(freqBand).at(elevAngleQuantized)[
cDS] * 1e-9;
2277 table3gpp->m_cASD =
NTNRuralLOS.at(freqBand).at(elevAngleQuantized)[
cASD];
2278 table3gpp->m_cASA =
NTNRuralLOS.at(freqBand).at(elevAngleQuantized)[
cASA];
2279 table3gpp->m_cZSA =
NTNRuralLOS.at(freqBand).at(elevAngleQuantized)[
cZSA];
2280 table3gpp->m_perClusterShadowingStd =
2283 for (uint8_t row = 0; row < 7; row++)
2285 for (uint8_t column = 0; column < 7; column++)
2291 else if (channelCondition->IsNlos())
2303 table3gpp->m_uK =
NTNRuralNLOS.at(freqBand).at(elevAngleQuantized)[
uK];
2304 table3gpp->m_sigK =
NTNRuralNLOS.at(freqBand).at(elevAngleQuantized)[
sigK];
2305 table3gpp->m_rTau =
NTNRuralNLOS.at(freqBand).at(elevAngleQuantized)[
rTau];
2306 table3gpp->m_uXpr =
NTNRuralNLOS.at(freqBand).at(elevAngleQuantized)[
uXpr];
2308 table3gpp->m_numOfCluster =
2310 table3gpp->m_raysPerCluster =
2312 table3gpp->m_cDS =
NTNRuralNLOS.at(freqBand).at(elevAngleQuantized)[
cDS] * 1e-9;
2313 table3gpp->m_cASD =
NTNRuralNLOS.at(freqBand).at(elevAngleQuantized)[
cASD];
2314 table3gpp->m_cASA =
NTNRuralNLOS.at(freqBand).at(elevAngleQuantized)[
cASA];
2315 table3gpp->m_cZSA =
NTNRuralNLOS.at(freqBand).at(elevAngleQuantized)[
cZSA];
2316 table3gpp->m_perClusterShadowingStd =
2319 if (freqBand ==
"S")
2321 for (uint8_t row = 0; row < 6; row++)
2323 for (uint8_t column = 0; column < 6; column++)
2325 table3gpp->m_sqrtC[row][column] =
2330 else if (freqBand ==
"Ka")
2332 for (uint8_t row = 0; row < 6; row++)
2334 for (uint8_t column = 0; column < 6; column++)
2336 table3gpp->m_sqrtC[row][column] =
2347 table3gpp->m_uLgASD = std::numeric_limits<double>::min();
2348 table3gpp->m_sigLgASD = 0;
2349 table3gpp->m_uLgZSD = std::numeric_limits<double>::min();
2350 table3gpp->m_sigLgZSD = 0;
3976 NS_ASSERT_MSG(channelParams !=
nullptr,
"Channel parameters cannot be null");
3977 NS_ASSERT_MSG(sMob !=
nullptr && uMob !=
nullptr,
"Mobility models cannot be null");
3978 NS_ASSERT_MSG(sAntenna !=
nullptr && uAntenna !=
nullptr,
"Antennas cannot be null");
3979 const auto callIds =
3981 const auto reversedIds = std::make_pair(callIds.second, callIds.first);
3982 NS_ASSERT_MSG(channelParams->m_nodeIds == callIds || channelParams->m_nodeIds == reversedIds,
3983 "Channel params node ids do not match this link");
3989 channelMatrix->m_nodeIds =
3992 bool isSameDirection = channelParams->m_nodeIds == channelMatrix->m_nodeIds;
3993 channelMatrix->m_antennaPair =
3994 std::make_pair(sAntenna->GetId(),
4006 if (isSameDirection)
4008 rayAodRadian = channelParams->m_rayAodRadian;
4009 rayAoaRadian = channelParams->m_rayAoaRadian;
4010 rayZodRadian = channelParams->m_rayZodRadian;
4011 rayZoaRadian = channelParams->m_rayZoaRadian;
4015 rayAodRadian = channelParams->m_rayAoaRadian;
4016 rayAoaRadian = channelParams->m_rayAodRadian;
4017 rayZodRadian = channelParams->m_rayZoaRadian;
4018 rayZoaRadian = channelParams->m_rayZodRadian;
4024 size_t uSize = uAntenna->GetNumElems();
4025 size_t sSize = sAntenna->GetNumElems();
4031 uint16_t numOverallCluster = channelParams->m_cluster1st != channelParams->m_cluster2nd
4032 ? channelParams->m_reducedClusterNumber + 4
4033 : channelParams->m_reducedClusterNumber + 2;
4035 NS_ASSERT(channelParams->m_reducedClusterNumber <= channelParams->m_clusterPhase.size());
4036 NS_ASSERT(channelParams->m_reducedClusterNumber <= channelParams->m_clusterPower.size());
4037 NS_ASSERT(channelParams->m_reducedClusterNumber <=
4038 channelParams->m_crossPolarizationPowerRatios.size());
4039 NS_ASSERT(channelParams->m_reducedClusterNumber <= rayZoaRadian.size());
4040 NS_ASSERT(channelParams->m_reducedClusterNumber <= rayZodRadian.size());
4041 NS_ASSERT(channelParams->m_reducedClusterNumber <= rayAoaRadian.size());
4042 NS_ASSERT(channelParams->m_reducedClusterNumber <= rayAodRadian.size());
4043 NS_ASSERT(table3gpp->m_raysPerCluster <= channelParams->m_clusterPhase[0].size());
4044 NS_ASSERT(table3gpp->m_raysPerCluster <=
4045 channelParams->m_crossPolarizationPowerRatios[0].size());
4046 NS_ASSERT(table3gpp->m_raysPerCluster <= rayZoaRadian[0].size());
4047 NS_ASSERT(table3gpp->m_raysPerCluster <= rayZodRadian[0].size());
4048 NS_ASSERT(table3gpp->m_raysPerCluster <= rayAoaRadian[0].size());
4049 NS_ASSERT(table3gpp->m_raysPerCluster <= rayAodRadian[0].size());
4051 double distance3D = channelParams->m_dis3D;
4053 Angles sAngle(uMob->GetPosition(), sMob->GetPosition());
4054 Angles uAngle(sMob->GetPosition(), uMob->GetPosition());
4066 for (
size_t polSa = 0; polSa < sAntenna->GetNumPols(); ++polSa)
4068 for (
size_t polUa = 0; polUa < uAntenna->GetNumPols(); ++polUa)
4070 raysPreComp[std::make_pair(polSa, polUa)] =
4071 Complex2DVector(channelParams->m_reducedClusterNumber, table3gpp->m_raysPerCluster);
4076 sinCosA.resize(channelParams->m_reducedClusterNumber);
4077 sinSinA.resize(channelParams->m_reducedClusterNumber);
4078 cosZoA.resize(channelParams->m_reducedClusterNumber);
4079 sinCosD.resize(channelParams->m_reducedClusterNumber);
4080 sinSinD.resize(channelParams->m_reducedClusterNumber);
4081 cosZoD.resize(channelParams->m_reducedClusterNumber);
4082 for (uint8_t nIndex = 0; nIndex < channelParams->m_reducedClusterNumber; nIndex++)
4084 sinCosA[nIndex].resize(table3gpp->m_raysPerCluster);
4085 sinSinA[nIndex].resize(table3gpp->m_raysPerCluster);
4086 cosZoA[nIndex].resize(table3gpp->m_raysPerCluster);
4087 sinCosD[nIndex].resize(table3gpp->m_raysPerCluster);
4088 sinSinD[nIndex].resize(table3gpp->m_raysPerCluster);
4089 cosZoD[nIndex].resize(table3gpp->m_raysPerCluster);
4092 for (uint8_t nIndex = 0; nIndex < channelParams->m_reducedClusterNumber; nIndex++)
4094 for (uint8_t mIndex = 0; mIndex < table3gpp->m_raysPerCluster; mIndex++)
4096 DoubleVector initialPhase = channelParams->m_clusterPhase[nIndex][mIndex];
4098 double k = channelParams->m_crossPolarizationPowerRatios[nIndex][mIndex];
4102 for (uint8_t polUa = 0; polUa < uAntenna->GetNumPols(); ++polUa)
4104 auto [rxFieldPatternPhi, rxFieldPatternTheta] = uAntenna->GetElementFieldPattern(
4105 Angles(channelParams->m_rayAoaRadian[nIndex][mIndex],
4106 channelParams->m_rayZoaRadian[nIndex][mIndex]),
4108 for (uint8_t polSa = 0; polSa < sAntenna->GetNumPols(); ++polSa)
4110 auto [txFieldPatternPhi, txFieldPatternTheta] =
4111 sAntenna->GetElementFieldPattern(
4112 Angles(channelParams->m_rayAodRadian[nIndex][mIndex],
4113 channelParams->m_rayZodRadian[nIndex][mIndex]),
4115 raysPreComp[std::make_pair(polSa, polUa)](nIndex, mIndex) =
4116 std::complex(cos(initialPhase[0]), sin(initialPhase[0])) *
4117 rxFieldPatternTheta * txFieldPatternTheta +
4118 std::complex(cos(initialPhase[1]), sin(initialPhase[1])) *
4119 std::sqrt(1.0 / k) * rxFieldPatternTheta * txFieldPatternPhi +
4120 std::complex(cos(initialPhase[2]), sin(initialPhase[2])) *
4121 std::sqrt(1.0 / k) * rxFieldPatternPhi * txFieldPatternTheta +
4122 std::complex(cos(initialPhase[3]), sin(initialPhase[3])) *
4123 rxFieldPatternPhi * txFieldPatternPhi;
4129 double sinRayZoa = sin(rayZoaRadian[nIndex][mIndex]);
4130 double sinRayAoa = sin(rayAoaRadian[nIndex][mIndex]);
4131 double cosRayAoa = cos(rayAoaRadian[nIndex][mIndex]);
4132 sinCosA[nIndex][mIndex] = sinRayZoa * cosRayAoa;
4133 sinSinA[nIndex][mIndex] = sinRayZoa * sinRayAoa;
4134 cosZoA[nIndex][mIndex] = cos(rayZoaRadian[nIndex][mIndex]);
4138 double sinRayZod = sin(rayZodRadian[nIndex][mIndex]);
4139 double sinRayAod = sin(rayAodRadian[nIndex][mIndex]);
4140 double cosRayAod = cos(rayAodRadian[nIndex][mIndex]);
4141 sinCosD[nIndex][mIndex] = sinRayZod * cosRayAod;
4142 sinSinD[nIndex][mIndex] = sinRayZod * sinRayAod;
4143 cosZoD[nIndex][mIndex] = cos(rayZodRadian[nIndex][mIndex]);
4149 uint8_t numSubClustersAdded = 0;
4150 for (uint8_t nIndex = 0; nIndex < channelParams->m_reducedClusterNumber; nIndex++)
4152 for (
size_t uIndex = 0; uIndex < uSize; uIndex++)
4154 Vector uLoc = uAntenna->GetElementLocation(uIndex);
4156 for (
size_t sIndex = 0; sIndex < sSize; sIndex++)
4158 Vector sLoc = sAntenna->GetElementLocation(sIndex);
4161 if (nIndex != channelParams->m_cluster1st && nIndex != channelParams->m_cluster2nd)
4163 std::complex<double> rays(0, 0);
4164 for (uint8_t mIndex = 0; mIndex < table3gpp->m_raysPerCluster; mIndex++)
4167 double rxPhaseDiff =
4169 (sinCosA[nIndex][mIndex] * uLoc.x + sinSinA[nIndex][mIndex] * uLoc.y +
4170 cosZoA[nIndex][mIndex] * uLoc.z);
4172 double txPhaseDiff =
4174 (sinCosD[nIndex][mIndex] * sLoc.x + sinSinD[nIndex][mIndex] * sLoc.y +
4175 cosZoD[nIndex][mIndex] * sLoc.z);
4178 rays += raysPreComp[std::make_pair(sAntenna->GetElemPol(sIndex),
4179 uAntenna->GetElemPol(uIndex))](nIndex,
4181 std::complex(cos(rxPhaseDiff), sin(rxPhaseDiff)) *
4182 std::complex(cos(txPhaseDiff), sin(txPhaseDiff));
4185 sqrt(channelParams->m_clusterPower[nIndex] / table3gpp->m_raysPerCluster);
4186 hUsn(uIndex, sIndex, nIndex) = rays;
4190 std::complex<double> raysSub1(0, 0);
4191 std::complex<double> raysSub2(0, 0);
4192 std::complex<double> raysSub3(0, 0);
4194 for (uint8_t mIndex = 0; mIndex < table3gpp->m_raysPerCluster; mIndex++)
4198 double rxPhaseDiff =
4200 (sinCosA[nIndex][mIndex] * uLoc.x + sinSinA[nIndex][mIndex] * uLoc.y +
4201 cosZoA[nIndex][mIndex] * uLoc.z);
4203 double txPhaseDiff =
4205 (sinCosD[nIndex][mIndex] * sLoc.x + sinSinD[nIndex][mIndex] * sLoc.y +
4206 cosZoD[nIndex][mIndex] * sLoc.z);
4208 std::complex<double> raySub =
4209 raysPreComp[std::make_pair(sAntenna->GetElemPol(sIndex),
4210 uAntenna->GetElemPol(uIndex))](nIndex,
4212 std::complex(cos(rxPhaseDiff), sin(rxPhaseDiff)) *
4213 std::complex(cos(txPhaseDiff), sin(txPhaseDiff));
4237 sqrt(channelParams->m_clusterPower[nIndex] / table3gpp->m_raysPerCluster);
4239 sqrt(channelParams->m_clusterPower[nIndex] / table3gpp->m_raysPerCluster);
4241 sqrt(channelParams->m_clusterPower[nIndex] / table3gpp->m_raysPerCluster);
4242 hUsn(uIndex, sIndex, nIndex) = raysSub1;
4245 channelParams->m_reducedClusterNumber + numSubClustersAdded) = raysSub2;
4248 channelParams->m_reducedClusterNumber + numSubClustersAdded + 1) =
4253 if (nIndex == channelParams->m_cluster1st || nIndex == channelParams->m_cluster2nd)
4255 numSubClustersAdded += 2;
4262 std::complex phaseDiffDueToDistance(cos(-2 * M_PI * distance3D / lambda),
4263 sin(-2 * M_PI * distance3D / lambda));
4267 const double sinUAngleAz = sin(uAngle.
GetAzimuth());
4268 const double cosUAngleAz = cos(uAngle.
GetAzimuth());
4271 const double sinSAngleAz = sin(sAngle.
GetAzimuth());
4272 const double cosSAngleAz = cos(sAngle.
GetAzimuth());
4274 for (
size_t uIndex = 0; uIndex < uSize; uIndex++)
4276 Vector uLoc = uAntenna->GetElementLocation(uIndex);
4277 double rxPhaseDiff = 2 * M_PI *
4278 (sinUAngleIncl * cosUAngleAz * uLoc.x +
4279 sinUAngleIncl * sinUAngleAz * uLoc.y + cosUAngleIncl * uLoc.z);
4281 for (
size_t sIndex = 0; sIndex < sSize; sIndex++)
4283 Vector sLoc = sAntenna->GetElementLocation(sIndex);
4284 std::complex<double> ray(0, 0);
4285 double txPhaseDiff =
4287 (sinSAngleIncl * cosSAngleAz * sLoc.x + sinSAngleIncl * sinSAngleAz * sLoc.y +
4288 cosSAngleIncl * sLoc.z);
4290 auto [rxFieldPatternPhi, rxFieldPatternTheta] = uAntenna->GetElementFieldPattern(
4292 uAntenna->GetElemPol(uIndex));
4293 auto [txFieldPatternPhi, txFieldPatternTheta] = sAntenna->GetElementFieldPattern(
4295 sAntenna->GetElemPol(sIndex));
4297 ray = (rxFieldPatternTheta * txFieldPatternTheta -
4298 rxFieldPatternPhi * txFieldPatternPhi) *
4299 phaseDiffDueToDistance * std::complex(cos(rxPhaseDiff), sin(rxPhaseDiff)) *
4300 std::complex(cos(txPhaseDiff), sin(txPhaseDiff));
4302 double kLinear = pow(10, channelParams->m_K_factor / 10.0);
4304 hUsn(uIndex, sIndex, 0) =
4305 sqrt(1.0 / (kLinear + 1)) * hUsn(uIndex, sIndex, 0) +
4306 sqrt(kLinear / (1 + kLinear)) * ray /
4308 channelParams->m_attenuation_dB[0] / 10.0);
4309 for (
size_t nIndex = 1; nIndex < hUsn.
GetNumPages(); nIndex++)
4311 hUsn(uIndex, sIndex, nIndex) *=
4312 sqrt(1.0 / (kLinear + 1));
4318 std::ostringstream oss;
4319 oss <<
"Husn (sAntenna, uAntenna): " << sAntenna->GetId() <<
", " << uAntenna->GetId()
4323 for (
size_t cIndex = 0; cIndex < hUsn.
GetNumPages(); ++cIndex)
4325 for (
size_t rowIdx = 0; rowIdx < hUsn.
GetNumRows(); ++rowIdx)
4327 for (
size_t colIdx = 0; colIdx < hUsn.
GetNumCols(); ++colIdx)
4334 oss << hUsn(rowIdx, colIdx, cIndex);
4342 NS_LOG_INFO(
"size of coefficient matrix (rows, columns, clusters) = ("
4345 channelMatrix->m_channel = hUsn;
4346 return channelMatrix;