├── test ├── __init__.py ├── .coverage ├── __pycache__ │ ├── __init__.cpython-39.pyc │ ├── inc_dec.cpython-39.pyc │ ├── step_1_test.cpython-310.pyc │ ├── step_1_test.cpython-311.pyc │ ├── step_1_test.cpython-39.pyc │ ├── step_2_test.cpython-310.pyc │ ├── step_2_test.cpython-311.pyc │ ├── step_2_test.cpython-39.pyc │ ├── step_3_test.cpython-310.pyc │ ├── step_3_test.cpython-311.pyc │ ├── step_3_test.cpython-39.pyc │ ├── step_4_test.cpython-39.pyc │ ├── step_5_test.cpython-310.pyc │ ├── step_5_test.cpython-311.pyc │ ├── step_5_test.cpython-39.pyc │ ├── step_6_test.cpython-310.pyc │ ├── step_6_test.cpython-311.pyc │ ├── step_6_test.cpython-39.pyc │ ├── step_9_XPR_test.cpython-39.pyc │ ├── Link_Budget_test.cpython-310.pyc │ ├── Link_Budget_test.cpython-311.pyc │ ├── Link_Budget_test.cpython-39.pyc │ ├── coupling_loss_test.cpython-39.pyc │ ├── step_4_par_corr_test.cpython-39.pyc │ ├── step_10_randPhases_test.cpython-39.pyc │ ├── step_4_par_corr_test.cpython-310.pyc │ ├── step_4_par_corr_test.cpython-311.pyc │ ├── step_5_cluster_del_test.cpython-39.pyc │ ├── step_4_spatial_corr_test.cpython-310.pyc │ ├── step_4_spatial_corr_test.cpython-311.pyc │ ├── step_4_spatial_corr_test.cpython-39.pyc │ ├── step_8_anglecoupling_test.cpython-39.pyc │ ├── test_pytest.cpython-39-pytest-7.4.0.pyc │ ├── step_4_lsp_generation_test.cpython-310.pyc │ ├── step_4_lsp_generation_test.cpython-311.pyc │ ├── step_4_lsp_generation_test.cpython-39.pyc │ ├── test_unittest.cpython-39-pytest-7.4.0.pyc │ ├── Link_Budget_test.cpython-39-pytest-7.4.0.pyc │ └── LEO_Link_Budget_test.cpython-39-pytest-7.4.0.pyc ├── generate_test_coverage.py ├── step_10_test.py ├── step_9_test.py ├── step_8_test.py ├── coupling_loss_test.py ├── step_12_test.py ├── step_7_test.py └── step_6_test.py ├── requirements.txt ├── OpenNTN ├── models │ ├── bessel.npy │ ├── __pycache__ │ │ └── __init__.cpython-39.pyc │ ├── __init__.py │ ├── TDL-C.json │ ├── TDL-A.json │ ├── TDL-D.json │ ├── TDL-B.json │ ├── CDL-C.json │ ├── TDL-C300.json │ ├── TDL-A30.json │ ├── CDL-A.json │ ├── TDL-B100.json │ ├── CDL-D.json │ ├── CDL-B.json │ ├── pseudo_model.json │ ├── Urban_LOS_Ka_band_UL.json │ ├── Dense_Urban_LOS_Ka_band_DL.json │ ├── Dense_Urban_LOS_S_band_DL.json │ ├── Dense_Urban_LOS_S_band_UL.json │ ├── Dense_Urban_LOS_Ka_band_UL.json │ └── Sub_Urban_LOS_Ka_band_DL.json ├── __pycache__ │ ├── cdl.cpython-39.pyc │ ├── lsp.cpython-39.pyc │ ├── rays.cpython-39.pyc │ ├── rma.cpython-39.pyc │ ├── tdl.cpython-39.pyc │ ├── uma.cpython-39.pyc │ ├── umi.cpython-39.pyc │ ├── urban.cpython-39.pyc │ ├── utils.cpython-39.pyc │ ├── antenna.cpython-39.pyc │ ├── NTNutils.cpython-39.pyc │ ├── __init__.cpython-39.pyc │ ├── sub_urban.cpython-39.pyc │ ├── dense_urban.cpython-39.pyc │ ├── rma_scenario.cpython-39.pyc │ ├── uma_scenario.cpython-39.pyc │ ├── umi_scenario.cpython-39.pyc │ ├── urban_scenario.cpython-39.pyc │ ├── channel_coefficients.cpython-39.pyc │ ├── dense_urban_scenario.cpython-39.pyc │ ├── sub_urban_scenario.cpython-39.pyc │ ├── system_level_channel.cpython-39.pyc │ ├── system_level_scenario.cpython-39.pyc │ └── save_bessel_values_to_json.cpython-39.pyc ├── __init__.py ├── urban.py ├── sub_urban.py ├── dense_urban.py ├── dense_urban_scenario.py ├── urban_scenario.py └── sub_urban_scenario.py ├── example ├── Example_NTN_sim.pkl └── __pycache__ │ └── __init__.cpython-39.pyc ├── MANIFEST.in ├── pyproject.toml ├── setup.py ├── install.sh ├── install_legacy.sh ├── LICENSE ├── post_install.py ├── post_install_legacy.py ├── .gitignore └── README.md /test/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | sionna -------------------------------------------------------------------------------- /test/.coverage: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/.coverage -------------------------------------------------------------------------------- /OpenNTN/models/bessel.npy: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/models/bessel.npy -------------------------------------------------------------------------------- /example/Example_NTN_sim.pkl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/example/Example_NTN_sim.pkl -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | recursive-include OpenNTN *.csv *.npy *.json *.xml *.ply 2 | #include ./OpenNTN *.csv, *.npy 3 | prune test 4 | -------------------------------------------------------------------------------- /OpenNTN/__pycache__/cdl.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/cdl.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/lsp.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/lsp.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/rays.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/rays.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/rma.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/rma.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/tdl.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/tdl.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/uma.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/uma.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/umi.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/umi.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/urban.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/urban.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/utils.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/utils.cpython-39.pyc -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = [ 3 | "setuptools>=42", 4 | "wheel" 5 | ] 6 | build-backend = "setuptools.build_meta" -------------------------------------------------------------------------------- /test/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /test/__pycache__/inc_dec.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/inc_dec.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/antenna.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/antenna.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/NTNutils.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/NTNutils.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/sub_urban.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/sub_urban.cpython-39.pyc -------------------------------------------------------------------------------- /example/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/example/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_1_test.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_1_test.cpython-310.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_1_test.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_1_test.cpython-311.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_1_test.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_1_test.cpython-39.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_2_test.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_2_test.cpython-310.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_2_test.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_2_test.cpython-311.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_2_test.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_2_test.cpython-39.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_3_test.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_3_test.cpython-310.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_3_test.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_3_test.cpython-311.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_3_test.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_3_test.cpython-39.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_4_test.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_4_test.cpython-39.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_5_test.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_5_test.cpython-310.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_5_test.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_5_test.cpython-311.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_5_test.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_5_test.cpython-39.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_6_test.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_6_test.cpython-310.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_6_test.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_6_test.cpython-311.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_6_test.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_6_test.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/dense_urban.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/dense_urban.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/rma_scenario.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/rma_scenario.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/uma_scenario.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/uma_scenario.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/umi_scenario.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/umi_scenario.cpython-39.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_9_XPR_test.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_9_XPR_test.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/urban_scenario.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/urban_scenario.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/models/__pycache__/__init__.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/models/__pycache__/__init__.cpython-39.pyc -------------------------------------------------------------------------------- /test/__pycache__/Link_Budget_test.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/Link_Budget_test.cpython-310.pyc -------------------------------------------------------------------------------- /test/__pycache__/Link_Budget_test.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/Link_Budget_test.cpython-311.pyc -------------------------------------------------------------------------------- /test/__pycache__/Link_Budget_test.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/Link_Budget_test.cpython-39.pyc -------------------------------------------------------------------------------- /test/__pycache__/coupling_loss_test.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/coupling_loss_test.cpython-39.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_4_par_corr_test.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_4_par_corr_test.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/channel_coefficients.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/channel_coefficients.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/dense_urban_scenario.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/dense_urban_scenario.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/sub_urban_scenario.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/sub_urban_scenario.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/system_level_channel.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/system_level_channel.cpython-39.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_10_randPhases_test.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_10_randPhases_test.cpython-39.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_4_par_corr_test.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_4_par_corr_test.cpython-310.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_4_par_corr_test.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_4_par_corr_test.cpython-311.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_5_cluster_del_test.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_5_cluster_del_test.cpython-39.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/system_level_scenario.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/system_level_scenario.cpython-39.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_4_spatial_corr_test.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_4_spatial_corr_test.cpython-310.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_4_spatial_corr_test.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_4_spatial_corr_test.cpython-311.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_4_spatial_corr_test.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_4_spatial_corr_test.cpython-39.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_8_anglecoupling_test.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_8_anglecoupling_test.cpython-39.pyc -------------------------------------------------------------------------------- /test/__pycache__/test_pytest.cpython-39-pytest-7.4.0.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/test_pytest.cpython-39-pytest-7.4.0.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_4_lsp_generation_test.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_4_lsp_generation_test.cpython-310.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_4_lsp_generation_test.cpython-311.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_4_lsp_generation_test.cpython-311.pyc -------------------------------------------------------------------------------- /test/__pycache__/step_4_lsp_generation_test.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/step_4_lsp_generation_test.cpython-39.pyc -------------------------------------------------------------------------------- /test/__pycache__/test_unittest.cpython-39-pytest-7.4.0.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/test_unittest.cpython-39-pytest-7.4.0.pyc -------------------------------------------------------------------------------- /OpenNTN/__pycache__/save_bessel_values_to_json.cpython-39.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/OpenNTN/__pycache__/save_bessel_values_to_json.cpython-39.pyc -------------------------------------------------------------------------------- /test/__pycache__/Link_Budget_test.cpython-39-pytest-7.4.0.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/Link_Budget_test.cpython-39-pytest-7.4.0.pyc -------------------------------------------------------------------------------- /OpenNTN/models/__init__.py: -------------------------------------------------------------------------------- 1 | # 2 | # SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 3 | # SPDX-License-Identifier: Apache-2.0 4 | # 5 | -------------------------------------------------------------------------------- /test/__pycache__/LEO_Link_Budget_test.cpython-39-pytest-7.4.0.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/HEAD/test/__pycache__/LEO_Link_Budget_test.cpython-39-pytest-7.4.0.pyc -------------------------------------------------------------------------------- /OpenNTN/models/TDL-C.json: -------------------------------------------------------------------------------- 1 | { 2 | "los" : 1, 3 | "num_clusters" : 2, 4 | "scale_delays" : true, 5 | 6 | "powers" : [ -0.394, 7 | -10.618, 8 | -23.373], 9 | 10 | "delays" : [ 0.0, 11 | 0.0, 12 | 14.8124] 13 | } 14 | -------------------------------------------------------------------------------- /OpenNTN/models/TDL-A.json: -------------------------------------------------------------------------------- 1 | { 2 | "los" : 0, 3 | "num_clusters" : 3, 4 | "scale_delays" : true, 5 | 6 | "delays" : [ 0.0, 7 | 1.0811, 8 | 2.8416], 9 | 10 | "powers" : [ 0.0, 11 | -4.675, 12 | -6.482] 13 | } 14 | -------------------------------------------------------------------------------- /OpenNTN/models/TDL-D.json: -------------------------------------------------------------------------------- 1 | { 2 | "los" : 1, 3 | "num_clusters" : 3, 4 | "scale_delays" : true, 5 | 6 | "powers" : [ -0.284, 7 | -11.991, 8 | -9.887, 9 | -16.771], 10 | 11 | "delays" : [ 0.0, 12 | 0.0, 13 | 0.5596, 14 | 7.3340] 15 | } 16 | -------------------------------------------------------------------------------- /OpenNTN/models/TDL-B.json: -------------------------------------------------------------------------------- 1 | { 2 | "los" : 0, 3 | "num_clusters" : 4, 4 | "scale_delays" : true, 5 | 6 | "powers" : [ 0.0, 7 | -1.973, 8 | -4.332, 9 | -11.914], 10 | 11 | "delays" : [ 0.0000, 12 | 0.7249, 13 | 0.7410, 14 | 5.7392] 15 | } 16 | -------------------------------------------------------------------------------- /test/generate_test_coverage.py: -------------------------------------------------------------------------------- 1 | #This file is a tutorial on creating a coverage report and generating the SVG image 2 | 3 | #Step 1, run coverage run -m unittest discover -s test -p '*_test.py' in VSC 4 | 5 | #Step 2, run coverage report -m in VSC 6 | 7 | #Step 3, coverage html in VSC 8 | 9 | #Step 4, coverage-badge -o coverage.svg in the adequate env (sionna_debugging) 10 | 11 | #Step 5, commit new svg -------------------------------------------------------------------------------- /OpenNTN/models/CDL-C.json: -------------------------------------------------------------------------------- 1 | { 2 | "los" : 1, 3 | "num_clusters" : 2, 4 | 5 | "cASD" : 0.0, 6 | "cASA" : 11.0, 7 | "cZSD" : 0.0, 8 | "cZSA" : 7.0, 9 | 10 | "xpr" : 16.0, 11 | 12 | "delays" : [ 0.0, 13 | 0.0, 14 | 14.8124], 15 | 16 | 17 | "powers" : [ -0.394, 18 | -10.618, 19 | -23.373], 20 | 21 | "aod" : [ 0.0, 22 | 0.0, 23 | 0.0], 24 | 25 | "aoa" : [ -180.0, 26 | -180.0, 27 | -75.9], 28 | 29 | "zod" : [ 140.0, 30 | 140.0, 31 | 140.0], 32 | 33 | "zoa" : [ 40.0, 34 | 40.0, 35 | 87.1] 36 | } 37 | -------------------------------------------------------------------------------- /OpenNTN/models/TDL-C300.json: -------------------------------------------------------------------------------- 1 | { 2 | "los" : 0, 3 | "num_clusters" : 12, 4 | "scale_delays" : false, 5 | 6 | "powers" : [ -6.9, 7 | 0.0, 8 | -7.7, 9 | -2.5, 10 | -2.4, 11 | -9.9, 12 | -8.0, 13 | -6.6, 14 | -7.1, 15 | -13.0, 16 | -14.2, 17 | -16.0], 18 | 19 | "delays" : [ 0.0, 20 | 65.0, 21 | 70.0, 22 | 190.0, 23 | 195.0, 24 | 200.0, 25 | 240.0, 26 | 325.0, 27 | 520.0, 28 | 1045.0, 29 | 1510.0, 30 | 2595.0] 31 | } 32 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | setup( 4 | name="OpenNTN", # Change this to your package name 5 | version="0.1.0", 6 | author="Tim Due", 7 | author_email="duee@ant.uni-bremen.de", 8 | description="An extension of the Sionna framework including channel models for NTN models", 9 | long_description=open("README.md").read(), 10 | long_description_content_type="text/markdown", 11 | url="https://github.com/ant-uni-bremen/OpenNTN", 12 | packages=find_packages(), 13 | install_requires=[ 14 | "sionna" # Add dependencies 15 | ], 16 | python_requires=">=3.8", 17 | classifiers=[ 18 | "Programming Language :: Python :: 3", 19 | "Intended Audience :: Science/Research", 20 | "Operating System :: OS Independent", 21 | ], 22 | 23 | include_package_data=True, 24 | ) 25 | 26 | 27 | -------------------------------------------------------------------------------- /OpenNTN/models/TDL-A30.json: -------------------------------------------------------------------------------- 1 | { 2 | "los" : 0, 3 | "num_clusters" : 12, 4 | "scale_delays" : false, 5 | 6 | "delays" : [ 0.0, 7 | 10.0, 8 | 15.0, 9 | 20.0, 10 | 25.0, 11 | 50.0, 12 | 65.0, 13 | 75.0, 14 | 105.0, 15 | 135.0, 16 | 150.0, 17 | 290.0], 18 | 19 | "powers" : [ -15.5, 20 | 0.0, 21 | -5.1, 22 | -5.1, 23 | -9.6, 24 | -8.2, 25 | -13.1, 26 | -11.5, 27 | -11.0, 28 | -16.2, 29 | -16.6, 30 | -26.2] 31 | } 32 | -------------------------------------------------------------------------------- /OpenNTN/models/CDL-A.json: -------------------------------------------------------------------------------- 1 | { 2 | "los" : 0, 3 | "num_clusters" : 3, 4 | 5 | "cASD" : 0.0, 6 | "cASA" : 15.0, 7 | "cZSD" : 0.0, 8 | "cZSA" : 7.0, 9 | 10 | "xpr" : 10.0, 11 | 12 | "delays" : [ 0.0, 13 | 1.0811, 14 | 2.8416], 15 | 16 | "powers" : [ 0.0, 17 | -4.675, 18 | -6.482], 19 | 20 | "aod" : [ 21 | 0.0, 22 | 0.0, 23 | 0.0], 24 | 25 | "aoa" : [ 26 | 178.8, 27 | -115.7, 28 | 111.5], 29 | 30 | "zod" : [ 31 | 32 | 140.0, 33 | 140.0, 34 | 140.0], 35 | 36 | "zoa" : [ 37 | 35.6, 38 | 22.9, 39 | 127.4] 40 | } 41 | -------------------------------------------------------------------------------- /OpenNTN/models/TDL-B100.json: -------------------------------------------------------------------------------- 1 | { 2 | "los" : 0, 3 | "num_clusters" : 12, 4 | "scale_delays" : false, 5 | 6 | "powers" : [ 0.0, 7 | -2.2, 8 | -0.6, 9 | -0.6, 10 | -0.3, 11 | -1.2, 12 | -5.9, 13 | -2.2, 14 | -0.8, 15 | -6.3, 16 | -7.5, 17 | -7.1], 18 | 19 | "delays" : [ 0.0, 20 | 10.0, 21 | 20.0, 22 | 30.0, 23 | 35.0, 24 | 45.0, 25 | 55.0, 26 | 120.0, 27 | 170.0, 28 | 245.0, 29 | 330.0, 30 | 480.0] 31 | } 32 | -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Script to install the OpenNTN package from GitHub 4 | 5 | # Run pip install command 6 | pip install git+https://github.com/ant-uni-bremen/OpenNTN@main 7 | 8 | # Download python file which integrates OpenNTN into Sionna 9 | POST_INSTALL_URL="https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/refs/heads/main/post_install.py" 10 | POST_INSTALL_NAME=$(basename "$POST_INSTALL_URL") 11 | curl -L -o "$POST_INSTALL_NAME" "$POST_INSTALL_URL" 12 | 13 | # Integrate OpenNTN into Sionna by adapteing init files 14 | python "$POST_INSTALL_NAME" 15 | 16 | # Create link to OpenNTN inside Sionna 17 | OpenNTN_DIR=$(pip show OpenNTN | grep Location | cut -d' ' -f2)/OpenNTN 18 | SIONNA_DIR=$(pip show sionna | grep Location | cut -d' ' -f2)/sionna 19 | ln -s $OpenNTN_DIR $SIONNA_DIR/phy/channel/tr38811 20 | 21 | # Remove temporary variables after installation 22 | rm "$POST_INSTALL_NAME" 23 | -------------------------------------------------------------------------------- /install_legacy.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # Script to install the OpenNTN package from GitHub 4 | 5 | # Run pip install command 6 | pip install git+https://github.com/ant-uni-bremen/OpenNTN@legacy 7 | 8 | # Download python file which integrates OpenNTN into Sionna 9 | POST_INSTALL_URL="https://raw.githubusercontent.com/ant-uni-bremen/OpenNTN/refs/heads/main/post_install_legacy.py" 10 | POST_INSTALL_NAME=$(basename "$POST_INSTALL_URL") 11 | curl -L -o "$POST_INSTALL_NAME" "$POST_INSTALL_URL" 12 | 13 | # Integrate OpenNTN into Sionna by adapteing init files 14 | python "$POST_INSTALL_NAME" 15 | 16 | # Create link to OpenNTN inside Sionna 17 | OpenNTN_DIR=$(pip show OpenNTN | grep Location | cut -d' ' -f2)/OpenNTN 18 | SIONNA_DIR=$(pip show sionna | grep Location | cut -d' ' -f2)/sionna 19 | ln -s $OpenNTN_DIR $SIONNA_DIR/channel/tr38811 20 | 21 | # Remove temporary variables after installation 22 | rm "$POST_INSTALL_NAME" 23 | -------------------------------------------------------------------------------- /OpenNTN/models/CDL-D.json: -------------------------------------------------------------------------------- 1 | { 2 | "los" : 1, 3 | "num_clusters" : 3, 4 | 5 | "cASD" : 0.0, 6 | "cASA" : 11.0, 7 | "cZSD" : 0.0, 8 | "cZSA" : 7.0, 9 | 10 | "xpr" : 16.0, 11 | 12 | "delays" : [ 0.0, 13 | 0.0, 14 | 0.5596, 15 | 7.3340], 16 | 17 | 18 | "powers" : [ -0.284, 19 | -11.991, 20 | -9.887, 21 | -16.771], 22 | 23 | "aod" : [ 0.0, 24 | 0.0, 25 | 0.0, 26 | 0.0], 27 | 28 | "aoa" : [ -180.0, 29 | -180.0, 30 | -135.4, 31 | -121.5], 32 | 33 | "zod" : [ 140.0, 34 | 140.0, 35 | 140.0, 36 | 140.0], 37 | 38 | "zoa" : [ 40.0, 39 | 40.0, 40 | 146.2, 41 | 136.0] 42 | } 43 | -------------------------------------------------------------------------------- /OpenNTN/models/CDL-B.json: -------------------------------------------------------------------------------- 1 | { 2 | "los" : 0, 3 | "num_clusters" : 4, 4 | 5 | "cASD" : 0.0, 6 | "cASA" : 15.0, 7 | "cZSD" : 0.0, 8 | "cZSA" : 7.0, 9 | 10 | "xpr" : 10.0, 11 | 12 | "delays" : [ 0.0000, 13 | 0.7249, 14 | 0.7410, 15 | 5.7392], 16 | 17 | 18 | "powers" : [ 0.0, 19 | -1.973, 20 | -4.332, 21 | -11.914], 22 | 23 | "aod" : [ 0.0, 24 | 0.0, 25 | 0.0, 26 | 0.0], 27 | 28 | "aoa" : [ -174.6, 29 | 144.9, 30 | -119.8, 31 | -88.8], 32 | 33 | "zod" : [ 34 | 140, 35 | 140, 36 | 140, 37 | 140], 38 | 39 | "zoa" : [ 42.2, 40 | 63.4, 41 | 89.7, 42 | 174.1] 43 | } 44 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Arbeitsbereich Nachrichtentechnik 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /OpenNTN/__init__.py: -------------------------------------------------------------------------------- 1 | # 2 | # This file has been created by the Dept. of Communications Engineering of the University of Bremen. 3 | # The code is based on implementations provided by the NVIDIA CORPORATION & AFFILIATES 4 | # 5 | # SPDX-FileCopyrightText: Copyright (c) 2021-2023 NVIDIA CORPORATION & AFFILIATES. All rights reserved. 6 | # SPDX-License-Identifier: Apache-2.0 7 | # 8 | """ 9 | Channel sub-package of the Sionna library implementing 3GPP TR38.811 models. 10 | """ 11 | # pylint: disable=line-too-long 12 | from .antenna import AntennaElement, AntennaPanel, PanelArray, Antenna, AntennaArray 13 | from .lsp import LSP, LSPGenerator 14 | from .rays import Rays, RaysGenerator 15 | from .system_level_scenario import SystemLevelScenario 16 | from .channel_coefficients import Topology, ChannelCoefficientsGenerator 17 | from .system_level_channel import SystemLevelChannel 18 | 19 | from .dense_urban_scenario import DenseUrbanScenario 20 | from .dense_urban import DenseUrban 21 | from .urban_scenario import UrbanScenario 22 | from .urban import Urban 23 | from .sub_urban_scenario import SubUrbanScenario 24 | from .sub_urban import SubUrban 25 | # TDL and CDL are not yet implemented and only exist here as a template 26 | from .tdl import TDL 27 | from .cdl import CDL 28 | 29 | -------------------------------------------------------------------------------- /test/step_10_test.py: -------------------------------------------------------------------------------- 1 | # This file tests the implementation of step 10, the initial random phase generation. 2 | # Step 10 test is a mockup 3 | import unittest 4 | import tensorflow as tf 5 | import numpy as np 6 | import math 7 | from sionna.phy.constants import PI 8 | from sionna.phy.channel.tr38811 import utils 9 | from sionna.phy.channel.tr38811 import Antenna, AntennaArray,PanelArray,ChannelCoefficientsGenerator 10 | 11 | 12 | class Test_Step10(unittest.TestCase): 13 | def setUp(self): 14 | # Initialize the required attributes 15 | self.shape = tf.constant([2, 3], dtype=tf.int32) 16 | 17 | self.mock_antenna = Antenna( 18 | polarization="single", 19 | polarization_type="V", 20 | antenna_pattern="38.901", 21 | carrier_frequency=30e9 22 | ) 23 | 24 | # Create an instance of ChannelCoefficientsGenerator 25 | self.channel_generator = ChannelCoefficientsGenerator( 26 | carrier_frequency=30e9, 27 | tx_array=self.mock_antenna, 28 | rx_array=self.mock_antenna, 29 | subclustering=False, 30 | precision="single" 31 | ) 32 | 33 | def test_step_10(self): 34 | # Call the _step_10 method 35 | phi = self.channel_generator._step_10(self.shape) 36 | 37 | # Compare the shapes 38 | expected_shape = (2, 3, 4) 39 | self.assertEqual(phi.shape, expected_shape) 40 | 41 | phi = phi.numpy() 42 | self.assertTrue(np.all(phi > -PI)) 43 | self.assertTrue(np.all(phi < PI)) 44 | 45 | # Check that the distribution mean is close to zero 46 | mean_val = np.mean(phi) 47 | self.assertTrue(math.isclose(mean_val, 0.0, abs_tol=1)) 48 | 49 | if __name__ == "__main__": 50 | unittest.main() 51 | 52 | -------------------------------------------------------------------------------- /post_install.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | import sys 4 | from pathlib import Path 5 | import pkg_resources 6 | #import sionna 7 | 8 | def modify_vanilla_sionna(): 9 | """Modify the installed framework files as needed.""" 10 | try: 11 | # Locate the framework installation path 12 | framework_path = pkg_resources.get_distribution("sionna").location 13 | 14 | sionna_channel_path = framework_path + "/sionna/phy/channel" 15 | channel_init_file_path = sionna_channel_path + "/__init__.py" 16 | 17 | line_to_add = 'from . import tr38811' 18 | preceding_line = 'from . import tr38901' 19 | 20 | with open(channel_init_file_path, 'r') as file: 21 | lines = file.readlines() 22 | 23 | line_present = any(line_to_add in line for line in lines) 24 | 25 | insert_index = None 26 | 27 | if not line_present: 28 | for i, line in enumerate(lines): 29 | if preceding_line in line: 30 | insert_index = i + 1 31 | break 32 | 33 | if line_present: 34 | print(f"Already importing tr38811 in channel: {line_to_add}") 35 | 36 | if insert_index is not None: 37 | lines.insert(insert_index, f"{line_to_add}\n") 38 | with open(channel_init_file_path, 'w') as file: 39 | file.writelines(lines) 40 | print(f"Added import of tr38811 in channel: {line_to_add}") 41 | elif not line_present: 42 | print(f"Could not find import of tr38901.") 43 | print("ran the installer file") 44 | 45 | print("the framework was found at ", framework_path) 46 | print("sionna path is: ", sionna_channel_path) 47 | except Exception as e: 48 | print(f"Error modifying framework: {e}", file=sys.stderr) 49 | 50 | if __name__ == "__main__": 51 | modify_vanilla_sionna() 52 | -------------------------------------------------------------------------------- /post_install_legacy.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil 3 | import sys 4 | from pathlib import Path 5 | import pkg_resources 6 | #import sionna 7 | 8 | def modify_vanilla_sionna(): 9 | """Modify the installed framework files as needed.""" 10 | try: 11 | # Locate the framework installation path 12 | framework_path = pkg_resources.get_distribution("sionna").location 13 | 14 | sionna_channel_path = framework_path + "/sionna/channel" 15 | channel_init_file_path = sionna_channel_path + "/__init__.py" 16 | 17 | line_to_add = 'from . import tr38811' 18 | preceding_line = 'from . import tr38901' 19 | 20 | with open(channel_init_file_path, 'r') as file: 21 | lines = file.readlines() 22 | 23 | line_present = any(line_to_add in line for line in lines) 24 | 25 | insert_index = None 26 | 27 | if not line_present: 28 | for i, line in enumerate(lines): 29 | if preceding_line in line: 30 | insert_index = i + 1 31 | break 32 | 33 | if line_present: 34 | print(f"Already importing tr38811 in channel: {line_to_add}") 35 | 36 | if insert_index is not None: 37 | lines.insert(insert_index, f"{line_to_add}\n") 38 | with open(channel_init_file_path, 'w') as file: 39 | file.writelines(lines) 40 | print(f"Added import of tr38811 in channel: {line_to_add}") 41 | elif not line_present: 42 | print(f"Could not find import of tr38901.") 43 | print("ran the installer file") 44 | 45 | print("the framework was found at ", framework_path) 46 | print("sionna path is: ", sionna_channel_path) 47 | except Exception as e: 48 | print(f"Error modifying framework: {e}", file=sys.stderr) 49 | 50 | if __name__ == "__main__": 51 | modify_vanilla_sionna() 52 | -------------------------------------------------------------------------------- /OpenNTN/models/pseudo_model.json: -------------------------------------------------------------------------------- 1 | { 2 | "los" : 1, 3 | "num_clusters" : 13, 4 | 5 | "cASD" : 5.0, 6 | "cASA" : 8.0, 7 | "cZSD" : 3.0, 8 | "cZSA" : 3.0, 9 | 10 | "xpr" : 11.0, 11 | 12 | "delays" : [ 0.0, 13 | 0.0, 14 | 0.035, 15 | 0.612, 16 | 1.363, 17 | 1.405, 18 | 1.804, 19 | 2.596, 20 | 1.775, 21 | 4.042, 22 | 7.937, 23 | 9.424, 24 | 9.708, 25 | 12.525], 26 | 27 | 28 | "powers" : [ -0.2, 29 | -13.5, 30 | -18.8, 31 | -21.0, 32 | -22.8, 33 | -17.9, 34 | -20.1, 35 | -21.9, 36 | -22.9, 37 | -27.8, 38 | -23.6, 39 | -24.8, 40 | -30.0, 41 | -27.7], 42 | 43 | "aod" : [ 0.0, 44 | 0.0, 45 | 89.2, 46 | 89.2, 47 | 89.2, 48 | 13.0, 49 | 13.0, 50 | 13.0, 51 | 34.6, 52 | -64.5, 53 | -32.9, 54 | 52.6, 55 | -132.1, 56 | 77.2], 57 | 58 | "aoa" : [ -180.0, 59 | -180.0, 60 | 89.2, 61 | 89.2, 62 | 89.2, 63 | 163.0, 64 | 163.0, 65 | 163.0, 66 | -137.0, 67 | 74.5, 68 | 127.7, 69 | -119.6, 70 | -9.1, 71 | -83.8], 72 | 73 | "zod" : [ 98.5, 74 | 98.5, 75 | 85.5, 76 | 85.5, 77 | 85.5, 78 | 97.5, 79 | 97.5, 80 | 97.5, 81 | 98.5, 82 | 88.4, 83 | 91.3, 84 | 103.8, 85 | 80.3, 86 | 86.5], 87 | 88 | "zoa" : [ 81.5, 89 | 81.5, 90 | 86.9, 91 | 86.9, 92 | 86.9, 93 | 79.4, 94 | 79.4, 95 | 79.4, 96 | 78.2, 97 | 73.6, 98 | 78.3, 99 | 87.0, 100 | 70.6, 101 | 72.9] 102 | } 103 | -------------------------------------------------------------------------------- /test/step_9_test.py: -------------------------------------------------------------------------------- 1 | # This file tests the implementation of step 9, the Cross polarization ratio generation. 2 | # Step 9 test is a mockup 3 | import unittest 4 | import tensorflow as tf 5 | import numpy as np 6 | import sionna.phy.channel.tr38811.rays as rays 7 | import sionna.phy.channel.tr38811.dense_urban_scenario as sys_scenario 8 | import sionna.phy.channel.tr38811.antenna as antenna 9 | from sionna.phy.channel.tr38811.utils import gen_single_sector_topology as gen_topology 10 | 11 | class Step_9(unittest.TestCase): 12 | def setUp(self): 13 | # Initialize the required attributes and setup the scenario 14 | self.batch_size = 200 15 | self.num_bs = 1 16 | self.num_ut = 1 17 | self.num_clusters_max = 4 18 | self.rays_per_cluster = 20 19 | self.precision = "single" 20 | self.mu_xpr = 17.6 21 | self.sigma_xpr = 12.7 22 | 23 | # Create the antenna 24 | self.mock_antenna = antenna.Antenna( 25 | polarization="single", 26 | polarization_type="V", 27 | antenna_pattern="38.901", 28 | carrier_frequency=30e9 29 | ) 30 | 31 | # Create the scenario 32 | self.mock_scenario = sys_scenario.DenseUrbanScenario( 33 | carrier_frequency=30e9, 34 | ut_array=self.mock_antenna, 35 | bs_array=self.mock_antenna, 36 | direction="uplink", 37 | elevation_angle=90.0, 38 | enable_pathloss=True, 39 | enable_shadow_fading=True, 40 | doppler_enabled=True, 41 | precision=self.precision 42 | ) 43 | 44 | # Generate the topology 45 | topology = gen_topology( 46 | batch_size=self.batch_size, 47 | num_ut=self.num_ut, 48 | scenario="dur", 49 | elevation_angle=90, 50 | bs_height=600000.0 51 | ) 52 | 53 | # Set the topology for the scenario 54 | self.mock_scenario.set_topology(*topology) 55 | 56 | # Create an instance of the RaysGenerator 57 | self.rays_generator = rays.RaysGenerator(self.mock_scenario) 58 | 59 | def test_cross_polarization_power_ratios(self): 60 | # Generate the cross-polarization power ratios 61 | result = self.rays_generator._cross_polarization_power_ratios() 62 | 63 | # Expected tensor shape 64 | expected_shape = ( 65 | self.batch_size, 66 | self.num_bs, 67 | self.num_ut, 68 | self.num_clusters_max, 69 | self.rays_per_cluster 70 | ) 71 | 72 | # Check if the received tensor shape is as expected 73 | self.assertEqual(result.shape, expected_shape) 74 | 75 | # Check if the values are positive 76 | self.assertTrue(tf.reduce_all(result > 0).numpy()) 77 | 78 | # Check the mean and std of the distribution against hardcoded values 79 | # Linear to dB 80 | log_result = 10 * np.log10(result.numpy()) 81 | 82 | expected_mean = self.mu_xpr 83 | expected_std = self.sigma_xpr 84 | 85 | measured_mean = np.mean(log_result) 86 | measured_std = np.std(log_result) 87 | 88 | self.assertAlmostEqual(measured_mean, expected_mean, delta=1.0) 89 | self.assertAlmostEqual(measured_std, expected_std, delta=1.0) 90 | 91 | if __name__ == "__main__": 92 | unittest.main() 93 | -------------------------------------------------------------------------------- /test/step_8_test.py: -------------------------------------------------------------------------------- 1 | # This file tests the implementation of step 8, the angles coupling and shuffling. 2 | # Step 8 is a mockup 3 | import unittest 4 | import tensorflow as tf 5 | import numpy as np 6 | 7 | # Importing necessary modules from Sionna 8 | import sionna.phy.channel.tr38811.rays as rays 9 | import sionna.phy.channel.tr38811.dense_urban_scenario as sys_scenario 10 | import sionna.phy.channel.tr38811.antenna as antenna 11 | from sionna.phy.channel.tr38811.utils import gen_single_sector_topology as gen_topology 12 | 13 | class TestShuffle_Coupling(unittest.TestCase): 14 | 15 | def setUp(self): 16 | # Creating a mock antenna configuration 17 | self.mockAntenna = antenna.Antenna(polarization="single", 18 | polarization_type="V", 19 | antenna_pattern="38.901", 20 | carrier_frequency=30e9) 21 | # Setting up a dense urban scenario 22 | self.mockScenario = sys_scenario.DenseUrbanScenario(carrier_frequency=30e9, 23 | ut_array=self.mockAntenna, 24 | bs_array=self.mockAntenna, 25 | direction="uplink", 26 | elevation_angle=90.0, 27 | enable_pathloss=True, 28 | enable_shadow_fading=True, 29 | doppler_enabled=True, 30 | precision="single") 31 | # Generate the topology 32 | topology = gen_topology(batch_size=2, num_ut=1, scenario="dur", elevation_angle=90, bs_height = 600000.0) 33 | 34 | # Set the topology 35 | self.mockScenario.set_topology(*topology) 36 | self.raysGenerator = rays.RaysGenerator(self.mockScenario) 37 | 38 | def test_random_coupling(self): 39 | # Creating test data for angles 40 | aoa = tf.constant(np.random.rand(2, 1, 1, 4, 20), dtype=tf.float32) 41 | aod = tf.constant(np.random.rand(2, 1, 1, 4, 20), dtype=tf.float32) 42 | zoa = tf.constant(np.random.rand(2, 1, 1, 4, 20), dtype=tf.float32) 43 | zod = tf.constant(np.random.rand(2, 1, 1, 4, 20), dtype=tf.float32) 44 | 45 | # Testing random coupling function 46 | shuffled_aoa, shuffled_aod, shuffled_zoa, shuffled_zod = self.raysGenerator._random_coupling( 47 | aoa, aod, zoa, zod 48 | ) 49 | 50 | # Checking the shape of the shuffled outputs 51 | self.assertEqual(aoa.shape, shuffled_aoa.shape) 52 | self.assertEqual(aod.shape, shuffled_aod.shape) 53 | self.assertEqual(zoa.shape, shuffled_zoa.shape) 54 | self.assertEqual(zod.shape, shuffled_zod.shape) 55 | 56 | # Ensuring that the angles are shuffled 57 | self.assertFalse(tf.reduce_all(tf.equal(aoa, shuffled_aoa)).numpy()) 58 | self.assertFalse(tf.reduce_all(tf.equal(aod, shuffled_aod)).numpy()) 59 | self.assertFalse(tf.reduce_all(tf.equal(zoa, shuffled_zoa)).numpy()) 60 | self.assertFalse(tf.reduce_all(tf.equal(zod, shuffled_zod)).numpy()) 61 | 62 | if __name__ == "__main__": 63 | unittest.main() -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | share/python-wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | MANIFEST 28 | 29 | # PyInstaller 30 | # Usually these files are written by a python script from a template 31 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 32 | *.manifest 33 | *.spec 34 | 35 | # Installer logs 36 | pip-log.txt 37 | pip-delete-this-directory.txt 38 | 39 | # Unit test / coverage reports 40 | htmlcov/ 41 | .tox/ 42 | .nox/ 43 | .coverage 44 | .coverage.* 45 | .cache 46 | nosetests.xml 47 | coverage.xml 48 | *.cover 49 | *.py,cover 50 | .hypothesis/ 51 | .pytest_cache/ 52 | cover/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | .pybuilder/ 76 | target/ 77 | 78 | # Jupyter Notebook 79 | .ipynb_checkpoints 80 | 81 | # IPython 82 | profile_default/ 83 | ipython_config.py 84 | 85 | # pyenv 86 | # For a library or package, you might want to ignore these files since the code is 87 | # intended to run in multiple environments; otherwise, check them in: 88 | # .python-version 89 | 90 | # pipenv 91 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 92 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 93 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 94 | # install all needed dependencies. 95 | #Pipfile.lock 96 | 97 | # poetry 98 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 99 | # This is especially recommended for binary packages to ensure reproducibility, and is more 100 | # commonly ignored for libraries. 101 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 102 | #poetry.lock 103 | 104 | # pdm 105 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 106 | #pdm.lock 107 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 108 | # in version control. 109 | # https://pdm.fming.dev/#use-with-ide 110 | .pdm.toml 111 | 112 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 113 | __pypackages__/ 114 | 115 | # Celery stuff 116 | celerybeat-schedule 117 | celerybeat.pid 118 | 119 | # SageMath parsed files 120 | *.sage.py 121 | 122 | # Environments 123 | .env 124 | .venv 125 | env/ 126 | venv/ 127 | ENV/ 128 | env.bak/ 129 | venv.bak/ 130 | 131 | # Spyder project settings 132 | .spyderproject 133 | .spyproject 134 | 135 | # Rope project settings 136 | .ropeproject 137 | 138 | # mkdocs documentation 139 | /site 140 | 141 | # mypy 142 | .mypy_cache/ 143 | .dmypy.json 144 | dmypy.json 145 | 146 | # Pyre type checker 147 | .pyre/ 148 | 149 | # pytype static type analyzer 150 | .pytype/ 151 | 152 | # Cython debug symbols 153 | cython_debug/ 154 | 155 | # PyCharm 156 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 157 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 158 | # and can be added to the global gitignore or merged into this file. For a more nuclear 159 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 160 | #.idea/ 161 | 162 | # Slurm 163 | slurm/ 164 | 165 | # Tensorboard logs 166 | example/logs/ 167 | -------------------------------------------------------------------------------- /test/coupling_loss_test.py: -------------------------------------------------------------------------------- 1 | #This file simuates the coupling losses and does the calibration test. 2 | from sionna.phy.channel.tr38811 import utils # The code to test 3 | import unittest # The test framework 4 | import numpy as np 5 | import matplotlib.pyplot as plt 6 | import tensorflow as tf 7 | from sionna.phy.channel.tr38811 import Antenna, AntennaArray, Urban 8 | 9 | 10 | class TestLinkBudget(unittest.TestCase): 11 | 12 | def create_antenna_arrays(self, carrier_frequency): # Helper function for Antenna Initialization 13 | ut_array = Antenna(polarization="single", 14 | polarization_type="V", 15 | antenna_pattern="38.901", 16 | carrier_frequency=carrier_frequency) 17 | 18 | bs_array = AntennaArray(num_rows=1, 19 | num_cols=4, 20 | polarization="dual", 21 | polarization_type="VH", 22 | antenna_pattern="38.901", 23 | carrier_frequency=carrier_frequency) 24 | return ut_array, bs_array 25 | 26 | def test_sc1_dl(self): 27 | carrier_frequency = 20e9 28 | elevation_angle = 12.5 29 | direction = "downlink" 30 | scenario = "urb" 31 | 32 | ut_array, bs_array = self.create_antenna_arrays(carrier_frequency) 33 | channel_model = Urban(carrier_frequency=carrier_frequency, 34 | ut_array=ut_array, 35 | bs_array=bs_array, 36 | direction=direction, 37 | elevation_angle=elevation_angle, 38 | enable_pathloss=True, 39 | enable_shadow_fading=True) 40 | 41 | topology = utils.gen_single_sector_topology( 42 | batch_size=100, 43 | num_ut=2, 44 | scenario=scenario, 45 | elevation_angle=elevation_angle, 46 | bs_height=35786000.0 47 | ) 48 | channel_model.set_topology(*topology) 49 | 50 | # Extracting coupling loss values 51 | lsp_generator = channel_model._lsp_sampler 52 | sample_path_loss =lsp_generator.sample_pathloss() 53 | sample_path_loss_los = tf.boolean_mask(sample_path_loss, channel_model._scenario.los) 54 | sample_path_loss_nlos = tf.boolean_mask(sample_path_loss, channel_model._scenario.los == False) 55 | gas_path_loss = channel_model._scenario.gas_pathloss[:, 0, 0] 56 | scintillation_path_loss = channel_model._scenario.scintillation_pathloss[:, 0, 0] 57 | free_space_path_loss = channel_model._scenario.free_space_pathloss[:, 0, 0] 58 | 59 | coupling_loss = free_space_path_loss + gas_path_loss + scintillation_path_loss 60 | 61 | pl_basic_db = channel_model._scenario.basic_pathloss[0, 0, 0] 62 | pl_entry_db = channel_model._scenario.entry_pathloss[0, 0, 0] 63 | 64 | # print("Gas Path Loss:", GPL) 65 | # print("Scintillation Path Loss:", SPL) 66 | # print("Free Space Path Loss:", FSPL) 67 | # print(CNR) 68 | print("basic pathloss :",pl_basic_db) 69 | print("\nEntry pathloss :", pl_entry_db) 70 | print("\nFree Space Path loss", free_space_path_loss) 71 | print("\nGas Path loss", gas_path_loss) 72 | print("\nScintilation Path loss", scintillation_path_loss) 73 | print("\nSample Path loss", sample_path_loss) 74 | 75 | # # Calculate the CDF 76 | # sorted_cl = np.sort(coupling_loss) 77 | # cdf = np.arange(1, len(sorted_cl) + 1) / len(sorted_cl) 78 | 79 | # # Plot the CDF 80 | # plt.figure(figsize=(8, 6)) 81 | # plt.plot(sorted_cl, cdf, label="Coupling Loss CDF") 82 | # plt.title("CDF of Coupling Loss") 83 | # plt.xlabel("Coupling Loss (dB)") 84 | # plt.ylabel("CDF") 85 | # plt.grid() 86 | # plt.legend() 87 | # plt.show() 88 | 89 | # # Print statistics 90 | # print("Coupling Loss Statistics:") 91 | # print(f"Mean: {np.mean(coupling_loss):.2f} dB") 92 | # print(f"Median: {np.median(coupling_loss):.2f} dB") 93 | # print(f"Min: {np.min(coupling_loss):.2f} dB") 94 | # print(f"Max: {np.max(coupling_loss):.2f} dB") 95 | # Flatten the sample path loss for all users 96 | sample_path_loss_np = sample_path_loss_los.numpy() 97 | sample_path_loss_flattened = sample_path_loss_np.flatten() 98 | 99 | # Calculate the CDF 100 | sorted_sample_pl = np.sort(sample_path_loss_flattened) 101 | cdf_sample_pl = np.arange(1, len(sorted_sample_pl) + 1) / len(sorted_sample_pl) 102 | 103 | # Plot the CDF 104 | #plt.figure(figsize=(8, 6)) 105 | #plt.plot(sorted_sample_pl, cdf_sample_pl, label="Sample Path Loss CDF", color="orange") 106 | #plt.title("CDF of Sample Path Loss") 107 | #plt.xlabel("Sample Path Loss (dB)") 108 | #plt.ylabel("CDF") 109 | #plt.grid() 110 | #plt.legend() 111 | #plt.show() 112 | 113 | # Print statistics 114 | print("Sample Path Loss Statistics:") 115 | print(f"Mean: {np.mean(sample_path_loss_flattened):.2f} dB") 116 | print(f"Median: {np.median(sample_path_loss_flattened):.2f} dB") 117 | print(f"Min: {np.min(sample_path_loss_flattened):.2f} dB") 118 | print(f"Max: {np.max(sample_path_loss_flattened):.2f} dB") 119 | 120 | 121 | if __name__ == '__main__': 122 | unittest.main() 123 | 124 | -------------------------------------------------------------------------------- /OpenNTN/urban.py: -------------------------------------------------------------------------------- 1 | # 2 | # This file has been created by the Dept. of Communications Engineering of the University of Bremen. 3 | # The code is based on implementations provided by the NVIDIA CORPORATION & AFFILIATES 4 | # 5 | # Based on open source framework Sionna of 2021-2023 NVIDIA CORPORATION & AFFILIATES 6 | # Based on implementation of scenario UMi in Sionna TR38.901 7 | # 8 | """Urban channel model from 3GPP TR38.811 specification""" 9 | 10 | import tensorflow as tf 11 | 12 | from . import SystemLevelChannel 13 | from . import UrbanScenario 14 | 15 | 16 | class Urban(SystemLevelChannel): 17 | # pylint: disable=line-too-long 18 | r"""Urban(carrier_frequency, ut_array, bs_array, direction, enable_pathloss=True, enable_shadow_fading=True, always_generate_lsp=False, dtype=tf.complex64) 19 | 20 | Urban channel model from 3GPP [TR38811]_ specification. 21 | 22 | Setting up a Urban model requires configuring the network topology, i.e., the 23 | UTs and BSs locations, UTs velocities, etc. This is achieved using the 24 | :meth:`~sionna.phy.channel.tr38811.Urban.set_topology` method. Setting a different 25 | topology for each batch example is possible. The batch size used when setting up the network topology 26 | is used for the link simulations. 27 | 28 | The following code snippet shows how to setup an Urban channel model assuming 29 | an OFDM waveform: 30 | 31 | >>> # UT and BS panel arrays 32 | >>> bs_array = PanelArray(num_rows_per_panel = 4, 33 | ... num_cols_per_panel = 4, 34 | ... polarization = 'dual', 35 | ... polarization_type = 'cross', 36 | ... antenna_pattern = '38.901', 37 | ... carrier_frequency = 3.5e9) 38 | >>> ut_array = PanelArray(num_rows_per_panel = 1, 39 | ... num_cols_per_panel = 1, 40 | ... polarization = 'single', 41 | ... polarization_type = 'V', 42 | ... antenna_pattern = 'omni', 43 | ... carrier_frequency = 3.5e9) 44 | >>> # Instantiating Urban channel model 45 | >>> channel_model = Urban(carrier_frequency = 3.5e9, 46 | ... ut_array = ut_array, 47 | ... bs_array = bs_array, 48 | ... direction = 'uplink') 49 | >>> # Setting up network topology 50 | >>> # ut_loc: UTs locations 51 | >>> # bs_loc: BSs locations 52 | >>> # ut_orientations: UTs array orientations 53 | >>> # bs_orientations: BSs array orientations 54 | >>> # in_state: Indoor/outdoor states of UTs 55 | >>> channel_model.set_topology(ut_loc, 56 | ... bs_loc, 57 | ... ut_orientations, 58 | ... bs_orientations, 59 | ... ut_velocities, 60 | ... in_state) 61 | >>> # Instanting the OFDM channel 62 | >>> channel = OFDMChannel(channel_model = channel_model, 63 | ... resource_grid = rg) 64 | 65 | where ``rg`` is an instance of :class:`~sionna.ofdm.ResourceGrid`. 66 | 67 | Parameters 68 | ----------- 69 | 70 | carrier_frequency : float 71 | Carrier frequency [Hz] 72 | 73 | rx_array : PanelArray 74 | Panel array used by the receivers. All receivers share the same 75 | antenna array configuration. 76 | 77 | tx_array : PanelArray 78 | Panel array used by the transmitters. All transmitters share the 79 | same antenna array configuration. 80 | 81 | direction : str 82 | Link direction. Either "uplink" or "downlink". 83 | 84 | elevation_angle : float 85 | elevation angle of the LOS path of the satellite/HAPS vs. ground horizon in degrees 86 | 87 | enable_pathloss : bool 88 | If `True`, apply pathloss. Otherwise doesn't. Defaults to `True`. 89 | 90 | enable_shadow_fading : bool 91 | If `True`, apply shadow fading. Otherwise doesn't. 92 | Defaults to `True`. 93 | 94 | average_street_width : float 95 | Average street width [m]. Defaults to 5m. 96 | 97 | average_building_height : float 98 | Average building height [m]. Defaults to 20m. 99 | 100 | always_generate_lsp : bool 101 | If `True`, new large scale parameters (LSPs) are generated for every 102 | new generation of channel impulse responses. Otherwise, always reuse 103 | the same LSPs, except if the topology is changed. Defaults to 104 | `False`. 105 | 106 | precision : `None` (default) | "single" | "double" 107 | Precision used for internal calculations and outputs. 108 | If set to `None`, 109 | :attr:`~sionna.phy.config.Config.precision` is used. 110 | 111 | Input 112 | ----- 113 | 114 | num_time_steps : int 115 | Number of time steps 116 | 117 | sampling_frequency : float 118 | Sampling frequency [Hz] 119 | 120 | Output 121 | ------- 122 | a : [batch size, num_rx, num_rx_ant, num_tx, num_tx_ant, num_paths, num_time_steps], tf.complex 123 | Path coefficients 124 | 125 | tau : [batch size, num_rx, num_tx, num_paths], tf.float 126 | Path delays [s] 127 | """ 128 | 129 | def __init__(self, carrier_frequency, ut_array, bs_array, 130 | direction, elevation_angle, enable_pathloss=True, enable_shadow_fading=True, 131 | average_street_width=20.0, average_building_height=5.0, 132 | always_generate_lsp=False, doppler_enabled=True, precision=None): 133 | 134 | # urban scenario 135 | scenario = UrbanScenario(carrier_frequency, ut_array, bs_array, 136 | direction, elevation_angle, enable_pathloss, enable_shadow_fading, 137 | average_street_width, average_building_height, doppler_enabled, precision) 138 | 139 | super().__init__(scenario, always_generate_lsp) 140 | -------------------------------------------------------------------------------- /OpenNTN/sub_urban.py: -------------------------------------------------------------------------------- 1 | # 2 | # This file has been created by the Dept. of Communications Engineering of the University of Bremen. 3 | # The code is based on implementations provided by the NVIDIA CORPORATION & AFFILIATES 4 | # 5 | # Based on open source framework Sionna of 2021-2023 NVIDIA CORPORATION & AFFILIATES 6 | # Based on implementation of scenario RMa in Sionna TR38.901 7 | # 8 | """Suburban channel model from 3GPP TR38.811 specification""" 9 | 10 | import tensorflow as tf 11 | 12 | from . import SystemLevelChannel 13 | from . import SubUrbanScenario 14 | 15 | 16 | class SubUrban(SystemLevelChannel): 17 | # pylint: disable=line-too-long 18 | r"""SubUrban(carrier_frequency, ut_array, bs_array, direction, enable_pathloss=True, enable_shadow_fading=True, always_generate_lsp=False, dtype=tf.complex64) 19 | 20 | SubUrban channel model from 3GPP [TR38811]_ specification. 21 | 22 | Setting up a SubUrban model requires configuring the network topology, i.e., the 23 | UTs and BSs locations, UTs velocities, etc. This is achieved using the 24 | :meth:`~sionna.phy.channel.tr38811.SubUrban.set_topology` method. Setting a different 25 | topology for each batch example is possible. The batch size used when setting up the network topology 26 | is used for the link simulations. 27 | 28 | The following code snippet shows how to setup an SubUrban channel model assuming 29 | an OFDM waveform: 30 | 31 | >>> # UT and BS panel arrays 32 | >>> bs_array = PanelArray(num_rows_per_panel = 4, 33 | ... num_cols_per_panel = 4, 34 | ... polarization = 'dual', 35 | ... polarization_type = 'cross', 36 | ... antenna_pattern = '38.901', 37 | ... carrier_frequency = 3.5e9) 38 | >>> ut_array = PanelArray(num_rows_per_panel = 1, 39 | ... num_cols_per_panel = 1, 40 | ... polarization = 'single', 41 | ... polarization_type = 'V', 42 | ... antenna_pattern = 'omni', 43 | ... carrier_frequency = 3.5e9) 44 | >>> # Instantiating SubUrban channel model 45 | >>> channel_model = SubUrban(carrier_frequency = 3.5e9, 46 | ... ut_array = ut_array, 47 | ... bs_array = bs_array, 48 | ... direction = 'uplink') 49 | >>> # Setting up network topology 50 | >>> # ut_loc: UTs locations 51 | >>> # bs_loc: BSs locations 52 | >>> # ut_orientations: UTs array orientations 53 | >>> # bs_orientations: BSs array orientations 54 | >>> # in_state: Indoor/outdoor states of UTs 55 | >>> channel_model.set_topology(ut_loc, 56 | ... bs_loc, 57 | ... ut_orientations, 58 | ... bs_orientations, 59 | ... ut_velocities, 60 | ... in_state) 61 | >>> # Instanting the OFDM channel 62 | >>> channel = OFDMChannel(channel_model = channel_model, 63 | ... resource_grid = rg) 64 | 65 | where ``rg`` is an instance of :class:`~sionna.ofdm.ResourceGrid`. 66 | 67 | Parameters 68 | ----------- 69 | 70 | carrier_frequency : float 71 | Carrier frequency [Hz] 72 | 73 | rx_array : PanelArray 74 | Panel array used by the receivers. All receivers share the same 75 | antenna array configuration. 76 | 77 | tx_array : PanelArray 78 | Panel array used by the transmitters. All transmitters share the 79 | same antenna array configuration. 80 | 81 | direction : str 82 | Link direction. Either "uplink" or "downlink". 83 | 84 | elevation_angle : float 85 | elevation angle of the LOS path of the satellite/HAPS vs. ground horizon in degrees 86 | 87 | enable_pathloss : bool 88 | If `True`, apply pathloss. Otherwise doesn't. Defaults to `True`. 89 | 90 | enable_shadow_fading : bool 91 | If `True`, apply shadow fading. Otherwise doesn't. 92 | Defaults to `True`. 93 | 94 | average_street_width : float 95 | Average street width [m]. Defaults to 5m. 96 | 97 | average_building_height : float 98 | Average building height [m]. Defaults to 20m. 99 | 100 | always_generate_lsp : bool 101 | If `True`, new large scale parameters (LSPs) are generated for every 102 | new generation of channel impulse responses. Otherwise, always reuse 103 | the same LSPs, except if the topology is changed. Defaults to 104 | `False`. 105 | 106 | precision : `None` (default) | "single" | "double" 107 | Precision used for internal calculations and outputs. 108 | If set to `None`, 109 | :attr:`~sionna.phy.config.Config.precision` is used. 110 | 111 | Input 112 | ----- 113 | 114 | num_time_steps : int 115 | Number of time steps 116 | 117 | sampling_frequency : float 118 | Sampling frequency [Hz] 119 | 120 | Output 121 | ------- 122 | a : [batch size, num_rx, num_rx_ant, num_tx, num_tx_ant, num_paths, num_time_steps], tf.complex 123 | Path coefficients 124 | 125 | tau : [batch size, num_rx, num_tx, num_paths], tf.float 126 | Path delays [s] 127 | """ 128 | 129 | def __init__(self, carrier_frequency, ut_array, bs_array, 130 | direction, elevation_angle, enable_pathloss=True, enable_shadow_fading=True, 131 | average_street_width=20.0, average_building_height=5.0, 132 | always_generate_lsp=False, doppler_enabled=True, precision=None): 133 | 134 | # Suburban urban scenario 135 | scenario = SubUrbanScenario(carrier_frequency, ut_array, bs_array, 136 | direction, elevation_angle, enable_pathloss, enable_shadow_fading, 137 | average_street_width, average_building_height, doppler_enabled, precision=precision) 138 | 139 | super().__init__(scenario, always_generate_lsp) 140 | -------------------------------------------------------------------------------- /OpenNTN/dense_urban.py: -------------------------------------------------------------------------------- 1 | # 2 | # This file has been created by the Dept. of Communications Engineering of the University of Bremen. 3 | # The code is based on implementations provided by the NVIDIA CORPORATION & AFFILIATES 4 | # 5 | # Based on open source framework Sionna of 2021-2023 NVIDIA CORPORATION & AFFILIATES 6 | # Based on implementation of scenario UMa in Sionna TR38.901 7 | # 8 | """Dense Urban channel model from 3GPP TR38.811 specification""" 9 | 10 | import tensorflow as tf 11 | 12 | from . import SystemLevelChannel 13 | from . import DenseUrbanScenario 14 | 15 | 16 | class DenseUrban(SystemLevelChannel): 17 | # pylint: disable=line-too-long 18 | r"""DenseUrban(carrier_frequency, ut_array, bs_array, direction, enable_pathloss=True, enable_shadow_fading=True, always_generate_lsp=False, dtype=tf.complex64) 19 | 20 | Dense Urban channel model from 3GPP [TR38811]_ specification. 21 | 22 | Setting up a Dense Urban model requires configuring the network topology, i.e., the 23 | UTs and BSs locations, UTs velocities, etc. This is achieved using the 24 | :meth:`~sionna.phy.channel.tr38811.DenseUrban.set_topology` method. Setting a different 25 | topology for each batch example is possible. The batch size used when setting up the network topology 26 | is used for the link simulations. 27 | 28 | The following code snippet shows how to setup an DenseUrban channel model assuming 29 | an OFDM waveform: 30 | 31 | >>> # UT and BS panel arrays 32 | >>> bs_array = PanelArray(num_rows_per_panel = 4, 33 | ... num_cols_per_panel = 4, 34 | ... polarization = 'dual', 35 | ... polarization_type = 'cross', 36 | ... antenna_pattern = '38.901', 37 | ... carrier_frequency = 3.5e9) 38 | >>> ut_array = PanelArray(num_rows_per_panel = 1, 39 | ... num_cols_per_panel = 1, 40 | ... polarization = 'single', 41 | ... polarization_type = 'V', 42 | ... antenna_pattern = 'omni', 43 | ... carrier_frequency = 3.5e9) 44 | >>> # Instantiating DenseUrban channel model 45 | >>> channel_model = DenseUrban(carrier_frequency = 3.5e9, 46 | ... ut_array = ut_array, 47 | ... bs_array = bs_array, 48 | ... direction = 'uplink') 49 | >>> # Setting up network topology 50 | >>> # ut_loc: UTs locations 51 | >>> # bs_loc: BSs locations 52 | >>> # ut_orientations: UTs array orientations 53 | >>> # bs_orientations: BSs array orientations 54 | >>> # in_state: Indoor/outdoor states of UTs 55 | >>> channel_model.set_topology(ut_loc, 56 | ... bs_loc, 57 | ... ut_orientations, 58 | ... bs_orientations, 59 | ... ut_velocities, 60 | ... in_state) 61 | >>> # Instanting the OFDM channel 62 | >>> channel = OFDMChannel(channel_model = channel_model, 63 | ... resource_grid = rg) 64 | 65 | where ``rg`` is an instance of :class:`~sionna.ofdm.ResourceGrid`. 66 | 67 | Parameters 68 | ----------- 69 | 70 | carrier_frequency : float 71 | Carrier frequency [Hz] 72 | 73 | rx_array : PanelArray 74 | Panel array used by the receivers. All receivers share the same 75 | antenna array configuration. 76 | 77 | tx_array : PanelArray 78 | Panel array used by the transmitters. All transmitters share the 79 | same antenna array configuration. 80 | 81 | direction : str 82 | Link direction. Either "uplink" or "downlink". 83 | 84 | elevation_angle : float 85 | elevation angle of the LOS path of the satellite/HAPS vs. ground horizon in degrees 86 | 87 | enable_pathloss : bool 88 | If `True`, apply pathloss. Otherwise doesn't. Defaults to `True`. 89 | 90 | enable_shadow_fading : bool 91 | If `True`, apply shadow fading. Otherwise doesn't. 92 | Defaults to `True`. 93 | 94 | average_street_width : float 95 | Average street width [m]. Defaults to 5m. 96 | 97 | average_building_height : float 98 | Average building height [m]. Defaults to 20m. 99 | 100 | always_generate_lsp : bool 101 | If `True`, new large scale parameters (LSPs) are generated for every 102 | new generation of channel impulse responses. Otherwise, always reuse 103 | the same LSPs, except if the topology is changed. Defaults to 104 | `False`. 105 | 106 | precision : `None` (default) | "single" | "double" 107 | Precision used for internal calculations and outputs. 108 | If set to `None`, 109 | :attr:`~sionna.phy.config.Config.precision` is used. 110 | 111 | Input 112 | ----- 113 | 114 | num_time_steps : int 115 | Number of time steps 116 | 117 | sampling_frequency : float 118 | Sampling frequency [Hz] 119 | 120 | Output 121 | ------- 122 | a : [batch size, num_rx, num_rx_ant, num_tx, num_tx_ant, num_paths, num_time_steps], tf.complex 123 | Path coefficients 124 | 125 | tau : [batch size, num_rx, num_tx, num_paths], tf.float 126 | Path delays [s] 127 | """ 128 | 129 | def __init__(self, carrier_frequency, ut_array, bs_array, 130 | direction, elevation_angle, enable_pathloss=True, enable_shadow_fading=True, 131 | average_street_width=20.0, average_building_height=5.0, 132 | always_generate_lsp=False, doppler_enabled=True, precision=None): 133 | 134 | # dense urban scenario 135 | scenario = DenseUrbanScenario(carrier_frequency, ut_array, bs_array, 136 | direction, elevation_angle, enable_pathloss, enable_shadow_fading, 137 | average_street_width, average_building_height, doppler_enabled, precision=precision) 138 | 139 | super().__init__(scenario, always_generate_lsp) 140 | -------------------------------------------------------------------------------- /test/step_12_test.py: -------------------------------------------------------------------------------- 1 | # This file tests the implementation of step 12, the application of the path loss and shadow fading 2 | # to the path coefficients. 3 | import tensorflow as tf 4 | import unittest 5 | import numpy as np 6 | import sionna 7 | 8 | from sionna.phy.channel.tr38811 import utils 9 | from sionna.phy.channel.tr38811 import Antenna, AntennaArray,PanelArray,ChannelCoefficientsGenerator 10 | from sionna.phy.channel.tr38811 import DenseUrban, SubUrban, Urban, CDL 11 | 12 | 13 | class Step_12(unittest.TestCase): 14 | r"""Test the computation of channel coefficients""" 15 | 16 | # Batch size used to check the LSP distribution 17 | BATCH_SIZE = 10 18 | 19 | # Carrier frequency 20 | CARRIER_FREQUENCY = 2.0e9 # Hz 21 | 22 | # Maximum allowed deviation for calculation (relative error) 23 | MAX_ERR = 1e-2 24 | 25 | # # Heigh of UTs 26 | H_UT = 1.5 27 | 28 | # # Heigh of BSs 29 | H_BS = 600000.0 30 | 31 | # # Number of BS 32 | NB_BS =1 33 | 34 | # Number of UT 35 | NB_UT = 1 36 | 37 | # Number of channel time samples 38 | NUM_SAMPLES = 32 39 | 40 | # Sampling frequency 41 | SAMPLING_FREQUENCY = 20e6 42 | 43 | def setUp(self): 44 | batch_size = Step_12.BATCH_SIZE 45 | nb_ut = Step_12.NB_UT 46 | nb_bs = Step_12.NB_BS 47 | h_ut = Step_12.H_UT 48 | h_bs = Step_12.H_BS 49 | fc = Step_12.CARRIER_FREQUENCY 50 | 51 | 52 | self.tx_array = Antenna(polarization="single", 53 | polarization_type="V", 54 | antenna_pattern="38.901", 55 | carrier_frequency=fc) 56 | self.rx_array = Antenna(polarization='single', 57 | polarization_type='V', 58 | antenna_pattern='38.901', 59 | carrier_frequency=fc) 60 | 61 | self.ccg = ChannelCoefficientsGenerator( 62 | fc, 63 | tx_array=self.tx_array, 64 | rx_array=self.rx_array, 65 | subclustering=True) 66 | 67 | channel_model = DenseUrban( 68 | carrier_frequency=fc, 69 | ut_array=self.rx_array, 70 | bs_array=self.tx_array, 71 | direction='downlink', 72 | elevation_angle=30.0) 73 | topology = utils.gen_single_sector_topology( 74 | batch_size=batch_size, num_ut=nb_ut, scenario='dur', bs_height=h_bs 75 | ) 76 | channel_model.set_topology(*topology) 77 | self.scenario = channel_model 78 | 79 | 80 | ray_sampler = self.scenario._ray_sampler 81 | self.lsp = self.scenario._lsp 82 | self.sf = self.lsp.sf 83 | 84 | # # lsp = lsp_sampler() 85 | self.rays = ray_sampler(self.lsp) 86 | topology = sionna.phy.channel.tr38811.Topology(velocities=channel_model._scenario.ut_velocities, 87 | moving_end="tx", 88 | los_aoa=channel_model._scenario.los_aoa, 89 | los_aod=channel_model._scenario.los_aod, 90 | los_zoa=channel_model._scenario.los_zoa, 91 | los_zod=channel_model._scenario.los_zod, 92 | los=channel_model._scenario.los, 93 | distance_3d=channel_model._scenario.distance_3d, 94 | tx_orientations=channel_model._scenario.ut_orientations, 95 | rx_orientations=channel_model._scenario.bs_orientations, 96 | bs_height = channel_model._scenario._bs_loc[:,:,2][0], 97 | elevation_angle = channel_model._scenario.elevation_angle, 98 | doppler_enabled = channel_model._scenario.doppler_enabled 99 | ) 100 | self.topology = topology 101 | 102 | num_time_samples = Step_12.NUM_SAMPLES 103 | sampling_frequency = Step_12.SAMPLING_FREQUENCY 104 | # c_ds = scenario.get_param("cDS")*1e-9 105 | c_ds = 1.6*1e-9 106 | h, delays, phi, sample_times = self.ccg(num_time_samples, 107 | sampling_frequency, self.lsp.k_factor, self.rays, topology, c_ds, 108 | debug=True) 109 | self.phi = phi.numpy() 110 | self.sample_times = sample_times.numpy() 111 | self.c_ds = c_ds 112 | self.h = h 113 | 114 | def max_rel_err(self, r, x): 115 | """Compute the maximum relative error, ``r`` being the reference value, 116 | ``x`` an esimate of ``r``.""" 117 | err = np.abs(r-x) 118 | rel_err = np.where(np.abs(r) > 0.0, np.divide(err,np.abs(r)+1e-6), err) 119 | return np.max(rel_err) 120 | 121 | def test_step_12_output_shape(self): 122 | """Test that the shape of h""" 123 | h_processed = self.scenario._step_12(self.h, self.sf) 124 | self.assertEqual(self.h.shape, h_processed.shape) 125 | 126 | def test_step_12_numerical_correctness(self): 127 | """Verify that path loss and shadow fading are applied correctly""" 128 | if self.scenario._scenario.pathloss_enabled: 129 | pl_db = self.scenario._lsp_sampler.sample_pathloss() 130 | if self.scenario._scenario._direction == 'uplink': 131 | pl_db = tf.transpose(pl_db, [0,2,1]) 132 | else: 133 | pl_db = tf.constant(0.0, dtype=tf.float32) 134 | 135 | sf = self.sf if self.scenario._scenario.shadow_fading_enabled else tf.ones_like(self.sf) 136 | gain = tf.math.pow(10.0, -pl_db/20.0) * tf.sqrt(sf) 137 | gain = tf.reshape(gain, tf.concat([tf.shape(gain), tf.ones([tf.rank(self.h)-tf.rank(gain)], tf.int32)], 0)) 138 | expected_h = self.h * tf.complex(gain, 0.0) 139 | 140 | h_processed = self.scenario._step_12(self.h, self.sf) 141 | rel_err = self.max_rel_err(expected_h.numpy(), h_processed.numpy()) 142 | self.assertTrue(rel_err < Step_12.MAX_ERR) 143 | 144 | 145 | 146 | if __name__ == "__main__": 147 | unittest.main() 148 | -------------------------------------------------------------------------------- /test/step_7_test.py: -------------------------------------------------------------------------------- 1 | # This file tests the implementation of step 7, the angles of arrival and departure. 2 | 3 | import unittest 4 | import tensorflow as tf 5 | import numpy as np 6 | 7 | # Importing necessary modules from Sionna 8 | import sionna.phy.channel.tr38811.rays as rays 9 | import sionna.phy.channel.tr38811.dense_urban_scenario as sys_scenario 10 | import sionna.phy.channel.tr38811.antenna as antenna 11 | from sionna.phy.channel.tr38811.utils import gen_single_sector_topology as gen_topology 12 | from sionna.phy.channel.tr38811 import Antenna, AntennaArray, DenseUrban, SubUrban, Urban, CDL 13 | 14 | class Test_A_D_angles(unittest.TestCase): 15 | 16 | def setUp(self): 17 | self.batch_size = 100 18 | self.num_bs = 1 19 | self.num_ut = 2 20 | # Creating a mock antenna configuration 21 | self.antenna = antenna.Antenna(polarization="single", 22 | polarization_type="V", 23 | antenna_pattern="38.901", 24 | carrier_frequency=30e9) 25 | # Setting up a dense urban scenario 26 | self.scenario = DenseUrban(carrier_frequency=30e9, 27 | ut_array=self.antenna, 28 | bs_array=self.antenna, 29 | direction="uplink", 30 | elevation_angle=80.0, 31 | enable_pathloss=True, 32 | enable_shadow_fading=True, 33 | doppler_enabled=True, 34 | precision="single") 35 | # Generate the topology 36 | topology = gen_topology(batch_size=self.batch_size, num_ut=self.num_ut , scenario="dur", bs_height = 600000.0) 37 | 38 | # Set the topology 39 | self.scenario.set_topology(*topology) 40 | self.raysGen = self.scenario._ray_sampler 41 | self.lsp = self.scenario._lsp 42 | delays, unscaled_delays = self.raysGen._cluster_delays(self.lsp.ds, self.lsp.k_factor) 43 | self.cluster_powers, _ = self.raysGen._cluster_powers( 44 | self.lsp.ds, self.lsp.k_factor, unscaled_delays) 45 | 46 | 47 | def test_azimuth_angles_ranges(self): 48 | """ 49 | Check that the azimuth angles of arrival (AoA) and departure (AoD) are wrapped within (-180, 180) degrees. 50 | """ 51 | bs = self.scenario._scenario.num_bs 52 | ut = self.scenario._scenario.num_ut 53 | batch_size = self.scenario._scenario.batch_size 54 | #Mock values for the azimuth spread angles 55 | asa = tf.random.uniform([batch_size, bs, ut], minval=5.0, maxval=15.0, dtype=tf.float32) 56 | asd = tf.random.uniform([batch_size, bs, ut], minval=5.0, maxval=15.0, dtype=tf.float32) 57 | rician_k = self.lsp.k_factor 58 | cluster_powers = self.cluster_powers 59 | 60 | aoa = self.raysGen._azimuth_angles_of_arrival(asa, rician_k, cluster_powers) 61 | aod = self.raysGen._azimuth_angles_of_departure(asd, rician_k, cluster_powers) 62 | 63 | self.assertTrue(tf.reduce_all(aoa >= -180).numpy()) 64 | self.assertTrue(tf.reduce_all(aoa <= 180).numpy()) 65 | self.assertTrue(tf.reduce_all(aod >= -180).numpy()) 66 | self.assertTrue(tf.reduce_all(aod <= 180).numpy()) 67 | 68 | def test_zenith_angles_ranges(self): 69 | """ 70 | Check that the zenith angles of arrival (ZoA) and departure (ZoD) are wrapped within (0, 180) degrees. 71 | """ 72 | bs = self.scenario._scenario.num_bs 73 | ut = self.scenario._scenario.num_ut 74 | batch_size = self.scenario._scenario.batch_size 75 | #Mock values for the zenith spread angles 76 | zsa = tf.random.uniform([batch_size, bs, ut], minval=5.0, maxval=15.0, dtype=tf.float32) 77 | zsd = tf.random.uniform([batch_size, bs, ut], minval=5.0, maxval=15.0, dtype=tf.float32) 78 | rician_k = self.lsp.k_factor 79 | cluster_powers = self.cluster_powers 80 | zoa = self.raysGen._zenith_angles_of_arrival(zsa, rician_k, cluster_powers) 81 | zod = self.raysGen._zenith_angles_of_departure(zsd, rician_k, cluster_powers) 82 | 83 | self.assertTrue(tf.reduce_all(zoa >= 0).numpy()) 84 | self.assertTrue(tf.reduce_all(zoa <= 180).numpy()) 85 | self.assertTrue(tf.reduce_all(zod >= 0).numpy()) 86 | self.assertTrue(tf.reduce_all(zod <= 180).numpy()) 87 | 88 | def test_azimuth_angles_variability(self): 89 | """ 90 | Verify that a larger azimuth spread input yields increased variability in the computed azimuth angles (AoA). 91 | """ 92 | bs = self.scenario._scenario.num_bs 93 | ut = self.scenario._scenario.num_ut 94 | batch_size = self.scenario._scenario.batch_size 95 | 96 | # Use a low spread and a high spread. 97 | low_spread = tf.fill([batch_size, bs, ut], 0.5) 98 | high_spread = tf.fill([batch_size, bs, ut], 10.0) 99 | rician_k = self.lsp.k_factor 100 | cluster_powers = self.cluster_powers 101 | aoa_low = self.raysGen._azimuth_angles_of_arrival(low_spread, rician_k, cluster_powers) 102 | aoa_high = self.raysGen._azimuth_angles_of_arrival(high_spread, rician_k, cluster_powers) 103 | 104 | # Compute variability (standard deviation over the cluster dimension). 105 | var_low = tf.reduce_mean(tf.math.reduce_std(aoa_low, axis=3)) 106 | var_high = tf.reduce_mean(tf.math.reduce_std(aoa_high, axis=3)) 107 | self.assertGreater(var_high, var_low) 108 | 109 | def test_zenith_angles_variability(self): 110 | """ 111 | Verify that a larger zenith spread input yields increased variability in the computed zenith angles (ZoA). 112 | """ 113 | bs = self.scenario._scenario.num_bs 114 | ut = self.scenario._scenario.num_ut 115 | batch_size = self.scenario._scenario.batch_size 116 | 117 | low_spread = tf.fill([batch_size, bs, ut], 0.5) 118 | high_spread = tf.fill([batch_size, bs, ut], 10.0) 119 | rician_k = self.lsp.k_factor 120 | cluster_powers = self.cluster_powers 121 | zoa_low = self.raysGen._zenith_angles_of_arrival(low_spread, rician_k, cluster_powers) 122 | zoa_high = self.raysGen._zenith_angles_of_arrival(high_spread, rician_k, cluster_powers) 123 | 124 | var_low = tf.reduce_mean(tf.math.reduce_std(zoa_low, axis=3)) 125 | var_high = tf.reduce_mean(tf.math.reduce_std(zoa_high, axis=3)) 126 | self.assertGreater(var_high, var_low) 127 | 128 | 129 | 130 | 131 | if __name__ == '__main__': 132 | unittest.main() -------------------------------------------------------------------------------- /test/step_6_test.py: -------------------------------------------------------------------------------- 1 | # This file tests the implementation of step 6, the cluster power generation. To do this, the ideal 2 | # values for all calculations are done and the average calculation is compared to it. As step 4 already 3 | # tests the correct creation of the LSPs Delay Spread (DS) and the Rician K Factor (K), we assume these 4 | # to be correct here. 5 | # Step 6 has no easily measurable output, so that a mockup 6 | 7 | from sionna.phy.channel.tr38811 import utils # The code to test 8 | import unittest # The test framework 9 | from sionna.phy.channel.tr38811 import Antenna, AntennaArray, DenseUrban, SubUrban, Urban, CDL 10 | import numpy as np 11 | import tensorflow as tf 12 | import math 13 | from sionna.phy import config 14 | import json 15 | import os 16 | 17 | def create_ut_ant(carrier_frequency): 18 | ut_ant = Antenna(polarization="single", 19 | polarization_type="V", 20 | antenna_pattern="38.901", 21 | carrier_frequency=carrier_frequency) 22 | return ut_ant 23 | 24 | def create_bs_ant(carrier_frequency): 25 | bs_ant = AntennaArray(num_rows=1, 26 | num_cols=4, 27 | polarization="dual", 28 | polarization_type="VH", 29 | antenna_pattern="38.901", 30 | carrier_frequency=carrier_frequency) 31 | return bs_ant 32 | 33 | class TestClusterPowerGeneration(unittest.TestCase): 34 | 35 | @classmethod 36 | def setUpClass(cls): 37 | cls.carrier_frequency = 2.2e9 38 | cls.elevation_angle = 10.0 39 | cls.batch_size = 1000 40 | cls.ut_array = create_ut_ant(cls.carrier_frequency) 41 | cls.bs_array = create_bs_ant(cls.carrier_frequency) 42 | cls.channel_model = Urban( 43 | carrier_frequency=cls.carrier_frequency, 44 | ut_array=cls.ut_array, 45 | bs_array=cls.bs_array, 46 | direction="downlink", 47 | elevation_angle=cls.elevation_angle, 48 | enable_pathloss=True, 49 | enable_shadow_fading=True 50 | ) 51 | # def test_sum_of_clusters_one(self): 52 | 53 | # scenario = "urb" 54 | # topology = utils.gen_single_sector_topology( 55 | # batch_size=self.batch_size, num_ut=100, scenario=scenario, 56 | # elevation_angle=self.elevation_angle, bs_height=600000.0 57 | # ) 58 | # self.channel_model.set_topology(*topology) 59 | # rays_generator = self.channel_model._ray_sampler 60 | # lsp = self.channel_model._lsp 61 | # delays, unscaled_delays = rays_generator._cluster_delays(lsp.ds, lsp.k_factor) 62 | # powers, _ = rays_generator._cluster_powers( 63 | # self.channel_model._lsp.ds, self.channel_model._lsp.k_factor, unscaled_delays 64 | # ) 65 | # print(powers.shape) 66 | # i = 1 67 | # for power in powers: 68 | # self.assertAlmostEqual(tf.reduce_sum(power[:,:,:i]).numpy(), 1.0, places=5) 69 | # print(power[:,:,1]) 70 | # i+=1 71 | 72 | def test_specular_component_los(self): 73 | scenario = "urb" 74 | topology = utils.gen_single_sector_topology( 75 | batch_size=self.batch_size, num_ut=100, scenario=scenario, 76 | elevation_angle=self.elevation_angle, bs_height=600000.0 77 | ) 78 | self.channel_model.set_topology(*topology) 79 | rays_generator = self.channel_model._ray_sampler 80 | lsp = self.channel_model._lsp 81 | delays, unscaled_delays = rays_generator._cluster_delays(lsp.ds, lsp.k_factor) 82 | ric_fac = lsp.k_factor 83 | ric_fac = tf.expand_dims(ric_fac, axis=3) 84 | P1_los = ric_fac/(1+ric_fac) 85 | los_powers, _ = rays_generator._cluster_powers( 86 | self.channel_model._lsp.ds, self.channel_model._lsp.k_factor, unscaled_delays 87 | ) 88 | first_cluster_power = los_powers[:,:,:, :1] # First cluster 89 | #first_cluster_power = tf.reduce_mean(first_cluster_power).numpy() 90 | 91 | # print("Size :", first_cluster_power.shape) 92 | # print("Size_P1_los :", P1_los.shape) 93 | # print("First cluster power :", tf.reduce_mean(first_cluster_power).numpy()) 94 | # print("P1_los :", tf.reduce_mean(P1_los).numpy()) 95 | 96 | assert math.isclose(tf.reduce_mean(first_cluster_power).numpy(), tf.reduce_mean(P1_los).numpy(), abs_tol=0.3) 97 | 98 | def test_rays_equal_power(self): 99 | """" Testing if each ray has equal power""""" 100 | scenario = "urb" 101 | topology = utils.gen_single_sector_topology( 102 | batch_size=self.batch_size, num_ut=100, scenario=scenario, 103 | elevation_angle=self.elevation_angle, bs_height=600000.0 104 | ) 105 | self.channel_model.set_topology(*topology) 106 | rays_generator = self.channel_model._ray_sampler 107 | lsp = self.channel_model._lsp 108 | delays, unscaled_delays = rays_generator._cluster_delays(lsp.ds, lsp.k_factor) 109 | cluster_powers, _ = rays_generator._cluster_powers( 110 | lsp.ds, lsp.k_factor, unscaled_delays) 111 | for cluster_power in cluster_powers: 112 | for power in cluster_power: 113 | self.assertTrue(tf.reduce_all(tf.equal(power, cluster_power[0])).numpy()) # All powers equal within cluster 114 | 115 | def test_cluster_elimination(self): 116 | """Check if any cluster has -25 dB power compared to the maximum cluster power""" 117 | scenario = "urb" 118 | topology = utils.gen_single_sector_topology( 119 | batch_size=self.batch_size, num_ut=100, scenario=scenario, 120 | elevation_angle=self.elevation_angle, bs_height=600000.0 121 | ) 122 | self.channel_model.set_topology(*topology) 123 | threshold_db = -25 # dB threshold 124 | threshold_power = 10 ** (threshold_db / 10) # Convert dB to linear scale 125 | rays_generator = self.channel_model._ray_sampler 126 | lsp = self.channel_model._lsp 127 | delays, unscaled_delays = rays_generator._cluster_delays(lsp.ds, lsp.k_factor) 128 | cluster_powers, _ = rays_generator._cluster_powers(lsp.ds, lsp.k_factor, unscaled_delays) 129 | 130 | epsilon = 1e-12 # Small value to avoid log issues 131 | for power in cluster_powers: 132 | power = tf.maximum(power, epsilon) # Avoid log of zero 133 | max_power = tf.reduce_max(cluster_powers) # Find maximum power in the cluster 134 | difference = max_power - power 135 | #print(difference.shape) 136 | # Ensure no clusters remain below the threshold 137 | self.assertTrue(tf.reduce_all(tf.reduce_mean(difference)>= threshold_power).numpy()) 138 | 139 | if __name__ == '__main__': 140 | unittest.main() -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Getting Started 2 | 3 | Welcome to OpenNTN, an Open-Source Framework for Non-Terrestrial Network Channel Simulations! This git provides an implementation of the channel models for dense urban, urban, and suburban scenarios according to the 3GPP TR38.811 standard. It is an extension to the existing Sionna™ framework and integrates into it as another module.
4 | 5 | We recommend the following workflow for new users of OpenNTN:
6 | 7 | 1. **Get an overview of the capabilities of OpenNTN.**
8 | The standards on the channel models are long and complex. We have written a paper outlining the capabilities of OpenNTN and describing the simulation process, condensing the required information of the standards into a short and easy to use format. We recommend to everyone that is not yet well experienced with the standards to first read [this paper](https://www.ant.uni-bremen.de/sixcms/media.php/102/15080/An%20Open%20Source%20Channel%20Emulator%20for%20Non-Terrestrial%20Networks.pdf) and understand the underlying models. 9 | 2. **Get familiar with Sionna.**
10 | OpenNTN can be used on its own, but integrating it into Sionna™ does provide the largest benefit, as it allows for the simple setup of end-to-end systems. We recommend to everyone that has not yet worked with Sionna™ before to first do the well documented [tutorials of Sionna™](https://nvlabs.github.io/sionna/phy/tutorials.html), especially the ones using the 38.901 channel models, as the channel models from OpenNTN were designed to be as similar to them as possible to provide the best possible integration into the existing system. 11 | 3. **Run the interactive examples.**
12 | Under the examples section we have collected three notebooks to introduce OpenNTN. In the first, the channel characteristics of NTN channels are showcased to extend the paper and improve the understanding of the channels through visualizations. In the second, a standard end-to-end link level simulation is setup to showcase the integration of OpenNTN into the Sionna™ framework. Lastly, in the machine learning example we train and end-to-end system with a neural receiver to showcase the integration and training of machine learning components using OpenNTN, which is done the same way as in existing Sionna™ implementations. 13 | 4. **Use OpenNTN however you want!**
14 | After understanding what you can do with OpenNTN and how to do it, use OpenNTN for your projects however you see fit. Use it out of the box in end-to-end simulations, reuse individual components like the link budget calculations, or integrate your specific work into it, for example in the form of novel antenna structures. 15 | 16 | # Different Sionna™ Versions 17 | 18 | Sionna has released versions 1.0+ in 2025, fundamentally reshaping aspects of its internal structure and making it even more modular and powerful in many ways. To support the integration of OpenNTN with both the Sionna™ 1.0+ versions and the legacy version Sionna™ 0.19.2, which is still used in many projects from before 2025, we have seperated the branches of this repository. The branch main is compatible with the versions Sionna™ 1.0+, while branch legacy is compatible with Sionna™ 0.19.2. You can find the two respective installations for OpenNTN in the section below.
19 | Unfortunately, maintaining both the legacy and the main version of OpenNTN rigorously and introducing new future features to both would be very resource intense. Thus, to maintain our level of quality, we plan to focus only on the main version of OpenNTN in the future and freeze the legacy version in its current state. We still plan to support your requests and update the legacy version if necessary, but new features from future standards will not be introduced to legacy OpenNTN.
20 | You can still find the [documentation of the legacy version of Sionna here](https://jhoydis.github.io/sionna-0.19.2-doc/), including an [installation guide here](https://jhoydis.github.io/sionna-0.19.2-doc/installation.html).
21 | 22 | # Installation 23 | 24 | Sionna™ is currently in its version 1.0+, but multiple older projects still require the lagacy version 0.19.2. Based on the Sionna™ version you use, select either the main installation for Sionna™ 1.0+ or the legacy installtion for Sionna™ 0.19.2. The provided installation files install.sh and install_legacy.sh are written for Linux based systems. OpenNTN can be used on Windows, however, the convinient installation scripts are not yet provided. Adding these is planned for a future update.
25 | 26 | ## Main installation for Sionna™ 1.0+ 27 | 28 | 1. Install Sionna
29 | pip install sionna
30 | For more information on the different installation options we refer the reader to the [sionna documentation](https://nvlabs.github.io/sionna/installation.html). 31 | 2. Download the install.sh file found in this git 32 | 3. Execute the install.sh file
33 | . install.sh 34 | 35 | ## Legacy installation for Sionna™ 0.19.2 36 | 37 | 1. Install Sionna
38 | pip install sionna==0.19
39 | For more information on the different installation options we refer the reader to the [sionna documentation](https://nvlabs.github.io/sionna/installation.html). 40 | 2. Download the install_legacy.sh file found in this git 41 | 3. Execute the install_legacy.sh file
42 | . install_legacy.sh 43 | 44 | ## Possible installation issues 45 | 46 | This section addresses potential issues that might occur when installing OpenNTN. If you encounter a problem that is not listed here, please feel free to contact us, both to receive support for your installation and to help us work on solutions for releases. Our goal is to provide an easy-to-set-up and easy-to-use tool, and your feedback is highly appreciated as it helps us further enhance OpenNTN. The contact information is listed at the end of the section. 47 | 48 | 1. Installation on Windows
49 | As mentioned above, installer files are currently only provided for Linux. Until a Windows installer is available, please follow the installation steps manually: download a copy of OpenNTN, move it into the channels directory of your Sionna™ installation, open the __init__.py file inside the channel directory, and add the import statement for OpenNTN: from . import tr38811 50 | 2. Installing Sionna™ for the First Time
51 | When using OpenNTN with Sionna™, OpenNTN can only function correctly if Sionna™ is properly installed and working. Therefore, we strongly recommend verifying a working Sionna™ installation before installing OpenNTN. Further instructions can be found in the [sionna documentation](https://nvlabs.github.io/sionna/installation.html). 52 | 3. Conflicts With Other Packages
53 | Currently, we are not aware of any package conflicts when using OpenNTN. However, we generally recommend creating separate environments for dedicated applications. If you encounter issues that appear to be caused by other packages, please first try using a clean environment with only the required dependencies. Additionally, please report any observed conflicts so that we can investigate and provide potential solutions. 54 | 4. Installation for GPU Usage
55 | Installing Sionna™ with GPU support tends to be more challenging than installing the CPU version, as this also requires CUDA and DrJit installation which must match your device. However, if Sionna™ works correctly on the GPU, OpenNTN should work properly as well. If GPU-related issues only occur when using OpenNTN (but not with Sionna™ itself), please contact us for further support. 56 | 5. Example Notebooks Not Running / Kernel Issues
57 | The provided examples are implemented as Jupyter Notebooks. When running these, please ensure that your environment includes all required dependencies to be selectable Jupyter kernel in order to execute the examples successfully. 58 | 59 | Contact: 60 | - First contact: Tim Düe — duee@ant.uni-bremen.de 61 | - Second contact: MohammadAmin Vakilifard — vakilifard@ant.uni-bremen.de 62 | 63 | # Contents of OpenNTN 64 | OpenNTN implements the models for Non-Terrestrial Networks in the dense urban, urban, and suburban scenarios as defined in the standard 3GPP TR38.811. These are similar to the models defined in 3GPP TR38.901 for terrestrial channels, which are already implemented in Sionna™. To make the use of OpenNTN as easy as possible and make the existing projects and tutorials as reusable as possible, the user interface of the OpenNTN 38811 channels is kept as similar as possible to the user interface of the existing 38901 channels. The user interface was kept as similar as only, only adding necessary new parameters, such as the satellite height, user elevation angle, and new antenna radiation patterns. For a practical demonstration, we refer the reader to the notebooks found in the examples section.
65 | 66 | As the standards on the channel models are very large and complex, it can be difficult for newcomers to get an overview of the capabilities of the channel models and an understanding of their process. To adress this, we have written [this paper](https://ieeexplore.ieee.org/document/11202820), in which we summarize the capabilities of the channels and how they actually work in a short and easy fashion. 67 | 68 | # Citing OpenNTN 69 | When you use OpenNTN for research, please cite us as: "OpenNTN: An Open-Source Framework for Non-Terrestrial Network Channel Simulations,T. Düe, M. Vakilifard, C. Bockelmann, D. Wübben, A. Dekorsy​, International Workshop on Smart Antennas (WSA), Erlangen, Germany, 16. - 18. September 2025",\ 70 | or by using the BibTeX:\ 71 | @inproceedings{OpenNTNPaper\ 72 | author = {T. D\"{u}e and M. Vakilifard and C. Bockelmann and D. W\"{u}bben and A. Dekorsy​},\ 73 | year = {2025},\ 74 | month = {Sep},\ 75 | title = {OpenNTN: An Open-Source Framework for Non-Terrestrial Network Channel Simulations},\ 76 | URL = {https://www.ant.uni-bremen.de/sixcms/media.php/102/15183/OpenNTN_An_OpenSource_Framework_For_NTN_Simulations.pdf}, \ 77 | address={Erlangen, Germany},\ 78 | abstract={Non-Terrestrial Networks (NTNs) are critical enablers of ubiquitous connectivity in future 6G systems, but they also face challenges such as long propagation delays, significant Doppler effects, and diverse channel conditions. Developing and testing communication technologies for NTNs requires realistic and flexible simulation tools. In this work, we present OpenNTN, an open-source software framework for simulating NTN channel models based on the 3GPP TR38.811 standard. OpenNTN is de- signed as an extension to the Python-based Sionna™ framework, providing channel models compatible with existing interfaces, enabling the use of the powerful tools found in Sionna™ . The framework offers a flexible user interface, enabling researchers to investigate diverse scenarios. As an open-source implementation, OpenNTN empowers the research community to fully use and adapt the framework, offering a solution for both fast and easy NTN research using realistic channel models, while also providing the opportunity to extend the model for custom research interests beyond the current state of the standards.},\ 79 | booktitle={International Workshop on Smart Antennas (WSA)}\ 80 | } 81 | 82 | ## License 83 | 84 | This project is licensed under the MIT License. See [LICENSE](./LICENSE) for details. 85 | 86 | Note: This project is intended to be used with NVIDIA’s Sionna™ framework, which is licensed under the Apache License, Version 2.0 (the "License"). Users must comply with the terms of that license when using this OpenNTN in addition with Sionna™. 87 | -------------------------------------------------------------------------------- /OpenNTN/dense_urban_scenario.py: -------------------------------------------------------------------------------- 1 | # 2 | # This file has been created by the Dept. of Communications Engineering of the University of Bremen. 3 | # The code is based on implementations provided by the NVIDIA CORPORATION & AFFILIATES 4 | # 5 | # Based on open source framework Sionna of 2021-2023 NVIDIA CORPORATION & AFFILIATES 6 | # Based on implementation of scenario UMa in Sionna TR38.901 7 | # 8 | """3GPP TR38.811 dense urban channel scenario""" 9 | 10 | import tensorflow as tf 11 | import numpy as np 12 | 13 | from sionna.phy.constants import SPEED_OF_LIGHT, PI 14 | from sionna.phy.utils import log10 15 | from . import SystemLevelScenario 16 | 17 | from . import utils 18 | 19 | class DenseUrbanScenario(SystemLevelScenario): 20 | r""" 21 | 3GPP TR 38.811 dense urban channel model scenario. 22 | 23 | Parameters 24 | ----------- 25 | 26 | carrier_frequency : float 27 | Carrier frequency [Hz] 28 | 29 | rx_array : PanelArray 30 | Panel array used by the receivers. All receivers share the same 31 | antenna array configuration. 32 | 33 | tx_array : PanelArray 34 | Panel array used by the transmitters. All transmitters share the 35 | same antenna array configuration. 36 | 37 | direction : str 38 | Link direction. Either "uplink" or "downlink". 39 | 40 | elevation_angle : float 41 | elevation angle of the LOS path of the satellite/HAPS vs. ground horizon in degrees 42 | 43 | enable_pathloss : bool 44 | If `True`, apply pathloss. Otherwise doesn't. Defaults to `True`. 45 | 46 | enable_shadow_fading : bool 47 | If `True`, apply shadow fading. Otherwise doesn't. 48 | Defaults to `True`. 49 | 50 | average_street_width : float 51 | Average street width [m]. Defaults to 5m. 52 | 53 | average_street_width : float 54 | Average building height [m]. Defaults to 20m. 55 | 56 | always_generate_lsp : bool 57 | If `True`, new large scale parameters (LSPs) are generated for every 58 | new generation of channel impulse responses. Otherwise, always reuse 59 | the same LSPs, except if the topology is changed. Defaults to 60 | `False`. 61 | 62 | precision : `None` (default) | "single" | "double" 63 | Precision used for internal calculations and outputs. 64 | If set to `None`, 65 | :attr:`~sionna.phy.config.Config.precision` is used. 66 | """ 67 | 68 | def __init__(self, carrier_frequency, ut_array, bs_array, 69 | direction, elevation_angle, enable_pathloss=True, enable_shadow_fading=True, 70 | average_street_width=20.0, average_building_height=5.0, doppler_enabled = True, 71 | precision=None): 72 | 73 | super().__init__(carrier_frequency, ut_array, bs_array, 74 | direction, elevation_angle, enable_pathloss, enable_shadow_fading, doppler_enabled, precision) 75 | 76 | # Average street width [m] 77 | self._average_street_width = tf.constant(average_street_width, 78 | self.rdtype) 79 | 80 | # Average building height [m] 81 | self._average_building_height = tf.constant(average_building_height, 82 | self.rdtype) 83 | 84 | ######################################### 85 | # Public methods and properties 86 | ######################################### 87 | 88 | def clip_carrier_frequency_lsp(self, fc): 89 | r"""Clip the carrier frequency ``fc`` in GHz for LSP calculation 90 | 91 | Input 92 | ----- 93 | fc : float 94 | Carrier frequency [GHz] 95 | 96 | Output 97 | ------- 98 | : float 99 | Clipped carrier frequency, that should be used for LSp computation 100 | """ 101 | return fc 102 | 103 | @property 104 | def min_2d_in(self): 105 | r"""Minimum indoor 2D distance for indoor UTs [m]""" 106 | return tf.constant(0.0, self.rdtype) 107 | 108 | @property 109 | def max_2d_in(self): 110 | r"""Maximum indoor 2D distance for indoor UTs [m]""" 111 | return tf.constant(10.0, self.rdtype) 112 | 113 | @property 114 | def average_street_width(self): 115 | r"""Average street width [m]""" 116 | return self._average_street_width 117 | 118 | @property 119 | def average_building_height(self): 120 | r"""Average building height [m]""" 121 | return self._average_building_height 122 | 123 | @property 124 | def los_probability(self): 125 | r"""Probability of each UT to be LoS. Used to generate LoS 126 | status of outdoor UTs. 127 | Taken from table 6.6.1-1 in TR38.811 128 | [batch size, num_ut]""" 129 | 130 | angle_str = str(round(self._elevation_angle/10.0)*10) 131 | los_p = self._params_los["LoS_p" + '_' + angle_str] 132 | #self._distance_2d_out already has desired shape, this it is used here to keep the code shorter 133 | los_probability = tf.zeros(shape = tf.shape(self._distance_2d_out)) + los_p 134 | 135 | return los_probability 136 | 137 | @property 138 | def rays_per_cluster(self): 139 | r"""Number of rays per cluster""" 140 | return tf.constant(20, tf.int32) 141 | 142 | @property 143 | def los_parameter_filepath(self): 144 | r""" Path of the configuration file for LoS scenario""" 145 | assert (self.carrier_frequency >= 19e9 and self.carrier_frequency <= 40e9 or self.carrier_frequency >= 1.9e9 and self.carrier_frequency <= 4e9) 146 | if self.direction == "uplink": 147 | if self.carrier_frequency >= 1.5e9 and self.carrier_frequency <= 4e9: 148 | return 'Dense_Urban_LOS_S_band_UL.json' 149 | else: 150 | return 'Dense_Urban_LOS_Ka_band_UL.json' 151 | else: 152 | if self.carrier_frequency >= 1.5e9 and self.carrier_frequency <= 4e9: 153 | return 'Dense_Urban_LOS_S_band_DL.json' 154 | else: 155 | return 'Dense_Urban_LOS_Ka_band_DL.json' 156 | 157 | 158 | @property 159 | def nlos_parameter_filepath(self): 160 | r""" Path of the configuration file for NLoS scenario""" 161 | assert (self.carrier_frequency >= 19e9 and self.carrier_frequency <= 40e9 or self.carrier_frequency >= 1.9e9 and self.carrier_frequency <= 4e9) 162 | if self.direction == "uplink": 163 | if self.carrier_frequency >= 1.5e9 and self.carrier_frequency <= 4e9: 164 | return 'Dense_Urban_NLOS_S_band_UL.json' 165 | else: 166 | return 'Dense_Urban_NLOS_Ka_band_UL.json' 167 | else: 168 | if self.carrier_frequency >= 1.5e9 and self.carrier_frequency <= 4e9: 169 | return 'Dense_Urban_NLOS_S_band_DL.json' 170 | else: 171 | return 'Dense_Urban_NLOS_Ka_band_DL.json' 172 | 173 | ######################### 174 | # Utility methods 175 | ######################### 176 | def _compute_lsp_log_mean_std(self): 177 | r"""Computes the mean and standard deviations of LSPs in log-domain""" 178 | 179 | batch_size = self.batch_size 180 | num_bs = self.num_bs 181 | num_ut = self.num_ut 182 | distance_2d = self.distance_2d 183 | h_bs = self.h_bs 184 | h_bs = tf.expand_dims(h_bs, axis=2) # For broadcasting 185 | h_ut = self.h_ut 186 | h_ut = tf.expand_dims(h_ut, axis=1) # For broadcasting 187 | 188 | ## Mean 189 | # DS 190 | log_mean_ds = self.get_param("muDS") 191 | # ASD 192 | log_mean_asd = self.get_param("muASD") 193 | # ASA 194 | log_mean_asa = self.get_param("muASA") 195 | # SF. Has zero-mean. 196 | log_mean_sf = tf.zeros([batch_size, num_bs, num_ut], 197 | self.rdtype) 198 | # K. Given in dB in the 3GPP tables, hence the division by 10 199 | log_mean_k = self.get_param("muK")/10.0 200 | # ZSA 201 | log_mean_zsa = self.get_param("muZSA") 202 | # ZSD mean is of the form max(-1, A*d2D/1000 - 0.01*(hUT-1.5) + B) 203 | log_mean_zsd = (self.get_param("muZSD")) 204 | # The ZSD might be -inf which the system cannot work with. Thus it is replaced by a large negative number 205 | # TODO -100 is chose here just to be a large negative number. However, it is not yet tested if replacing it with larger 206 | # numbers further improves the results. 207 | log_mean_max = tf.math.maximum(tf.constant(-100.0, self.rdtype), log_mean_zsd) 208 | log_mean_zsd = tf.where(log_mean_zsd != float("-inf"), log_mean_max, log_mean_zsd) 209 | 210 | lsp_log_mean = tf.stack([log_mean_ds, 211 | log_mean_asd, 212 | log_mean_asa, 213 | log_mean_sf, 214 | log_mean_k, 215 | log_mean_zsa, 216 | log_mean_zsd], axis=3) 217 | 218 | ## STD 219 | # DS 220 | log_std_ds = self.get_param("sigmaDS") 221 | # ASD 222 | log_std_asd = self.get_param("sigmaASD") 223 | # ASA 224 | log_std_asa = self.get_param("sigmaASA") 225 | # SF. Given in dB in the 3GPP tables, hence the division by 10 226 | # O2I and NLoS cases just require the use of a predefined value 227 | log_std_sf_o2i_nlos = self.get_param("sigmaSF")/10.0 228 | # For LoS, two possible scenarion depending on the 2D location of the 229 | # user 230 | distance_breakpoint = (2.*PI*h_bs*h_ut*self.carrier_frequency/ 231 | SPEED_OF_LIGHT) 232 | log_std_sf_los=tf.where(tf.math.less(distance_2d, distance_breakpoint), 233 | self.get_param("sigmaSF")/10.0, self.get_param("sigmaSF")/10.0) 234 | # Use the correct SF STD according to the user scenario: NLoS/O2I, or 235 | # LoS 236 | log_std_sf = tf.where(self.los, log_std_sf_los, log_std_sf_o2i_nlos) 237 | # K. Given in dB in the 3GPP tables, hence the division by 10. 238 | log_std_k = self.get_param("sigmaK")/10.0 239 | # ZSA 240 | log_std_zsa = self.get_param("sigmaZSA") 241 | # ZSD 242 | log_std_zsd = self.get_param("sigmaZSD") 243 | 244 | lsp_log_std = tf.stack([log_std_ds, 245 | log_std_asd, 246 | log_std_asa, 247 | log_std_sf, 248 | log_std_k, 249 | log_std_zsa, 250 | log_std_zsd], axis=3) 251 | 252 | self._lsp_log_mean = lsp_log_mean 253 | self._lsp_log_std = lsp_log_std 254 | 255 | # ZOD offset 256 | zod_offset = (tf.atan((35.-3.5)/distance_2d) 257 | - tf.atan((35.-1.5)/distance_2d)) 258 | zod_offset = tf.where(self.los, tf.constant(0.0,self.rdtype), 259 | zod_offset) 260 | self._zod_offset = zod_offset 261 | 262 | def _compute_pathloss_gas(self): 263 | utils.compute_pathloss_gas(self) 264 | 265 | def _compute_pathloss_scintillation(self): 266 | utils.compute_pathloss_scintilation(self) 267 | 268 | def _compute_pathloss_entry(self): 269 | utils.compute_pathloss_entry(self) 270 | 271 | def _compute_pathloss_additional(self): 272 | utils.compute_pathloss_additional(self) 273 | 274 | def _compute_pathloss_basic(self): 275 | utils.compute_pathloss_basic(self) 276 | -------------------------------------------------------------------------------- /OpenNTN/urban_scenario.py: -------------------------------------------------------------------------------- 1 | # 2 | # This file has been created by the Dept. of Communications Engineering of the University of Bremen. 3 | # The code is based on implementations provided by the NVIDIA CORPORATION & AFFILIATES 4 | # 5 | # Based on open source framework Sionna of 2021-2023 NVIDIA CORPORATION & AFFILIATES 6 | # Based on implementation of scenario UMi in Sionna TR38.901 7 | # 8 | """3GPP TR38.811 urban channel scenario""" 9 | 10 | import tensorflow as tf 11 | import numpy as np 12 | 13 | from sionna.phy.constants import SPEED_OF_LIGHT, PI 14 | from sionna.phy.utils import log10 15 | from . import SystemLevelScenario 16 | from . import utils 17 | 18 | class UrbanScenario(SystemLevelScenario): 19 | r""" 20 | 3GPP TR 38.811 urban channel model scenario. 21 | 22 | Parameters 23 | ----------- 24 | 25 | carrier_frequency : float 26 | Carrier frequency [Hz] 27 | 28 | rx_array : PanelArray 29 | Panel array used by the receivers. All receivers share the same 30 | antenna array configuration. 31 | 32 | tx_array : PanelArray 33 | Panel array used by the transmitters. All transmitters share the 34 | same antenna array configuration. 35 | 36 | direction : str 37 | Link direction. Either "uplink" or "downlink". 38 | 39 | elevation_angle : float 40 | elevation angle of the LOS path of the satellite/HAPS vs. ground horizon in degrees 41 | 42 | enable_pathloss : bool 43 | If `True`, apply pathloss. Otherwise doesn't. Defaults to `True`. 44 | 45 | enable_shadow_fading : bool 46 | If `True`, apply shadow fading. Otherwise doesn't. 47 | Defaults to `True`. 48 | 49 | average_street_width : float 50 | Average street width [m]. Defaults to 5m. 51 | 52 | average_street_width : float 53 | Average building height [m]. Defaults to 20m. 54 | 55 | always_generate_lsp : bool 56 | If `True`, new large scale parameters (LSPs) are generated for every 57 | new generation of channel impulse responses. Otherwise, always reuse 58 | the same LSPs, except if the topology is changed. Defaults to 59 | `False`. 60 | 61 | precision : `None` (default) | "single" | "double" 62 | Precision used for internal calculations and outputs. 63 | If set to `None`, 64 | :attr:`~sionna.phy.config.Config.precision` is used. 65 | """ 66 | 67 | def __init__(self, carrier_frequency, ut_array, bs_array, 68 | direction, elevation_angle, enable_pathloss=True, enable_shadow_fading=True, 69 | average_street_width=20.0, average_building_height=5.0, doppler_enabled = True, 70 | precision=None): 71 | 72 | super().__init__(carrier_frequency, ut_array, bs_array, 73 | direction, elevation_angle, enable_pathloss, enable_shadow_fading, doppler_enabled, precision) 74 | 75 | # Average street width [m] 76 | self._average_street_width = tf.constant(average_street_width, 77 | self.rdtype) 78 | 79 | # Average building height [m] 80 | self._average_building_height = tf.constant(average_building_height, 81 | self.rdtype) 82 | 83 | ######################################### 84 | # Public methods and properties 85 | ######################################### 86 | 87 | def clip_carrier_frequency_lsp(self, fc): 88 | r"""Clip the carrier frequency ``fc`` in GHz for LSP calculation 89 | 90 | Input 91 | ----- 92 | fc : float 93 | Carrier frequency [GHz] 94 | 95 | Output 96 | ------- 97 | : float 98 | Clipped carrier frequency, that should be used for LSp computation 99 | """ 100 | return fc 101 | 102 | @property 103 | def min_2d_in(self): 104 | r"""Minimum indoor 2D distance for indoor UTs [m]""" 105 | return tf.constant(0.0, self.rdtype) 106 | 107 | @property 108 | def max_2d_in(self): 109 | r"""Maximum indoor 2D distance for indoor UTs [m]""" 110 | return tf.constant(10.0, self.rdtype) 111 | 112 | @property 113 | def average_street_width(self): 114 | r"""Average street width [m]""" 115 | return self._average_street_width 116 | 117 | @property 118 | def average_building_height(self): 119 | r"""Average building height [m]""" 120 | return self._average_building_height 121 | 122 | @property 123 | def los_probability(self): 124 | r"""Probability of each UT to be LoS. Used to generate LoS 125 | status of outdoor UTs. 126 | 127 | Taken from table 6.6.1-1 in TR38.811 128 | 129 | [batch size, num_ut]""" 130 | angle_str = str(round(self._elevation_angle/10.0)*10) 131 | los_p = self._params_los["LoS_p" + '_' + angle_str] 132 | #self._distance_2d_out already has desired shape, this it is used here to keep the code shorter 133 | #los_probability = tf.zeros(shape=self._distance_2d_out.shape) + los_p 134 | los_probability = tf.zeros(shape = tf.shape(self._distance_2d_out)) + los_p 135 | 136 | return los_probability 137 | 138 | @property 139 | def rays_per_cluster(self): 140 | r"""Number of rays per cluster""" 141 | return tf.constant(20, tf.int32) 142 | 143 | @property 144 | def los_parameter_filepath(self): 145 | r""" Path of the configuration file for LoS scenario""" 146 | assert (self.carrier_frequency >= 19e9 and self.carrier_frequency <= 40e9 or self.carrier_frequency >= 1.9e9 and self.carrier_frequency <= 4e9) 147 | if self.direction == "uplink": 148 | if self.carrier_frequency >= 1.5e9 and self.carrier_frequency <= 4e9: 149 | return 'Urban_LOS_S_band_UL.json' 150 | else: 151 | return 'Urban_LOS_Ka_band_UL.json' 152 | else: 153 | if self.carrier_frequency >= 1.5e9 and self.carrier_frequency <= 4e9: 154 | return 'Urban_LOS_S_band_DL.json' 155 | else: 156 | return 'Urban_LOS_Ka_band_DL.json' 157 | 158 | 159 | @property 160 | def nlos_parameter_filepath(self): 161 | r""" Path of the configuration file for NLoS scenario""" 162 | assert (self.carrier_frequency >= 19e9 and self.carrier_frequency <= 40e9 or self.carrier_frequency >= 1.9e9 and self.carrier_frequency <= 4e9) 163 | if self.direction == "uplink": 164 | if self.carrier_frequency >= 1.5e9 and self.carrier_frequency <= 4e9: 165 | return 'Urban_NLOS_S_band_UL.json' 166 | else: 167 | return 'Urban_NLOS_Ka_band_UL.json' 168 | else: 169 | if self.carrier_frequency >= 1.5e9 and self.carrier_frequency <= 4e9: 170 | return 'Urban_NLOS_S_band_DL.json' 171 | else: 172 | return 'Urban_NLOS_Ka_band_DL.json' 173 | 174 | ######################### 175 | # Utility methods 176 | ######################### 177 | def _compute_lsp_log_mean_std(self): 178 | r"""Computes the mean and standard deviations of LSPs in log-domain""" 179 | 180 | batch_size = self.batch_size 181 | num_bs = self.num_bs 182 | num_ut = self.num_ut 183 | distance_2d = self.distance_2d 184 | h_bs = self.h_bs 185 | h_bs = tf.expand_dims(h_bs, axis=2) # For broadcasting 186 | h_ut = self.h_ut 187 | h_ut = tf.expand_dims(h_ut, axis=1) # For broadcasting 188 | 189 | ## Mean 190 | # DS 191 | log_mean_ds = self.get_param("muDS") 192 | # ASD 193 | log_mean_asd = self.get_param("muASD") 194 | # ASA 195 | log_mean_asa = self.get_param("muASA") 196 | # SF. Has zero-mean. 197 | log_mean_sf = tf.zeros([batch_size, num_bs, num_ut], 198 | self.rdtype) 199 | # K. Given in dB in the 3GPP tables, hence the division by 10 200 | log_mean_k = self.get_param("muK")/10.0 201 | # ZSA 202 | log_mean_zsa = self.get_param("muZSA") 203 | # ZSD mean is of the form max(-1, A*d2D/1000 - 0.01*(hUT-1.5) + B) 204 | log_mean_zsd = (self.get_param("muZSD")) 205 | # The ZSD might be -inf which the system cannot work with. Thus it is replaced by a large negative number 206 | # TODO -100 is chose here just to be a large negative number. However, it is not yet tested if replacing it with larger 207 | # numbers further improves the results. 208 | log_mean_max = tf.math.maximum(tf.constant(-100.0, self.rdtype), log_mean_zsd) 209 | log_mean_zsd = tf.where(log_mean_zsd != float("-inf"), log_mean_max, log_mean_zsd) 210 | 211 | lsp_log_mean = tf.stack([log_mean_ds, 212 | log_mean_asd, 213 | log_mean_asa, 214 | log_mean_sf, 215 | log_mean_k, 216 | log_mean_zsa, 217 | log_mean_zsd], axis=3) 218 | 219 | ## STD 220 | # DS 221 | log_std_ds = self.get_param("sigmaDS") 222 | # ASD 223 | log_std_asd = self.get_param("sigmaASD") 224 | # ASA 225 | log_std_asa = self.get_param("sigmaASA") 226 | # SF. Given in dB in the 3GPP tables, hence the division by 10 227 | # O2I and NLoS cases just require the use of a predefined value 228 | log_std_sf_o2i_nlos = self.get_param("sigmaSF")/10.0 229 | # For LoS, two possible scenarion depending on the 2D location of the 230 | # user 231 | distance_breakpoint = (2.*PI*h_bs*h_ut*self.carrier_frequency/ 232 | SPEED_OF_LIGHT) 233 | log_std_sf_los=tf.where(tf.math.less(distance_2d, distance_breakpoint), 234 | self.get_param("sigmaSF")/10.0, self.get_param("sigmaSF")/10.0) 235 | # Use the correct SF STD according to the user scenario: NLoS/O2I, or 236 | # LoS 237 | log_std_sf = tf.where(self.los, log_std_sf_los, log_std_sf_o2i_nlos) 238 | # K. Given in dB in the 3GPP tables, hence the division by 10. 239 | log_std_k = self.get_param("sigmaK")/10.0 240 | # ZSA 241 | log_std_zsa = self.get_param("sigmaZSA") 242 | # ZSD 243 | log_std_zsd = self.get_param("sigmaZSD") 244 | 245 | lsp_log_std = tf.stack([log_std_ds, 246 | log_std_asd, 247 | log_std_asa, 248 | log_std_sf, 249 | log_std_k, 250 | log_std_zsa, 251 | log_std_zsd], axis=3) 252 | 253 | self._lsp_log_mean = lsp_log_mean 254 | self._lsp_log_std = lsp_log_std 255 | 256 | # ZOD offset 257 | zod_offset = (tf.atan((35.-3.5)/distance_2d) 258 | - tf.atan((35.-1.5)/distance_2d)) 259 | zod_offset = tf.where(self.los, tf.constant(0.0,self.rdtype), 260 | zod_offset) 261 | self._zod_offset = zod_offset 262 | 263 | def _compute_pathloss_gas(self): 264 | utils.compute_pathloss_gas(self) 265 | 266 | def _compute_pathloss_scintillation(self): 267 | utils.compute_pathloss_scintilation(self) 268 | 269 | def _compute_pathloss_entry(self): 270 | utils.compute_pathloss_entry(self) 271 | 272 | def _compute_pathloss_additional(self): 273 | utils.compute_pathloss_additional(self) 274 | 275 | def _compute_pathloss_basic(self): 276 | utils.compute_pathloss_basic(self) -------------------------------------------------------------------------------- /OpenNTN/sub_urban_scenario.py: -------------------------------------------------------------------------------- 1 | # 2 | # This file has been created by the Dept. of Communications Engineering of the University of Bremen. 3 | # The code is based on implementations provided by the NVIDIA CORPORATION & AFFILIATES 4 | # 5 | # Based on open source framework Sionna of 2021-2023 NVIDIA CORPORATION & AFFILIATES 6 | # Based on implementation of scenario RMa in Sionna TR38.901 7 | # 8 | """3GPP TR38.811 suburban channel scenario""" 9 | 10 | import tensorflow as tf 11 | import numpy as np 12 | 13 | from sionna.phy.constants import SPEED_OF_LIGHT, PI 14 | from sionna.phy.utils import log10 15 | from . import SystemLevelScenario 16 | from . import utils 17 | 18 | class SubUrbanScenario(SystemLevelScenario): 19 | r""" 20 | 3GPP TR 38.811 suburban channel model scenario. 21 | 22 | Parameters 23 | ----------- 24 | 25 | carrier_frequency : float 26 | Carrier frequency [Hz] 27 | 28 | rx_array : PanelArray 29 | Panel array used by the receivers. All receivers share the same 30 | antenna array configuration. 31 | 32 | tx_array : PanelArray 33 | Panel array used by the transmitters. All transmitters share the 34 | same antenna array configuration. 35 | 36 | direction : str 37 | Link direction. Either "uplink" or "downlink". 38 | 39 | elevation_angle : float 40 | elevation angle of the LOS path of the satellite/HAPS vs. ground horizon in degrees 41 | 42 | enable_pathloss : bool 43 | If `True`, apply pathloss. Otherwise doesn't. Defaults to `True`. 44 | 45 | enable_shadow_fading : bool 46 | If `True`, apply shadow fading. Otherwise doesn't. 47 | Defaults to `True`. 48 | 49 | average_street_width : float 50 | Average street width [m]. Defaults to 5m. 51 | 52 | average_street_width : float 53 | Average building height [m]. Defaults to 20m. 54 | 55 | always_generate_lsp : bool 56 | If `True`, new large scale parameters (LSPs) are generated for every 57 | new generation of channel impulse responses. Otherwise, always reuse 58 | the same LSPs, except if the topology is changed. Defaults to 59 | `False`. 60 | 61 | precision : `None` (default) | "single" | "double" 62 | Precision used for internal calculations and outputs. 63 | If set to `None`, 64 | :attr:`~sionna.phy.config.Config.precision` is used. 65 | """ 66 | 67 | def __init__(self, carrier_frequency, ut_array, bs_array, 68 | direction, elevation_angle, enable_pathloss=True, enable_shadow_fading=True, 69 | average_street_width=20.0, average_building_height=5.0, doppler_enabled = True, 70 | precision=None): 71 | 72 | super().__init__(carrier_frequency, ut_array, bs_array, 73 | direction, elevation_angle, enable_pathloss, enable_shadow_fading, doppler_enabled, precision) 74 | 75 | # Average street width [m] 76 | self._average_street_width = tf.constant(average_street_width, 77 | self.rdtype) 78 | 79 | # Average building height [m] 80 | self._average_building_height = tf.constant(average_building_height, 81 | self.rdtype) 82 | 83 | ######################################### 84 | # Public methods and properties 85 | ######################################### 86 | 87 | def clip_carrier_frequency_lsp(self, fc): 88 | r"""Clip the carrier frequency ``fc`` in GHz for LSP calculation 89 | 90 | Input 91 | ----- 92 | fc : float 93 | Carrier frequency [GHz] 94 | 95 | Output 96 | ------- 97 | : float 98 | Clipped carrier frequency, that should be used for LSp computation 99 | """ 100 | return fc 101 | 102 | @property 103 | def min_2d_in(self): 104 | r"""Minimum indoor 2D distance for indoor UTs [m]""" 105 | return tf.constant(0.0, self.rdtype) 106 | 107 | @property 108 | def max_2d_in(self): 109 | r"""Maximum indoor 2D distance for indoor UTs [m]""" 110 | return tf.constant(10.0, self.rdtype) 111 | 112 | @property 113 | def average_street_width(self): 114 | r"""Average street width [m]""" 115 | return self._average_street_width 116 | 117 | @property 118 | def average_building_height(self): 119 | r"""Average building height [m]""" 120 | return self._average_building_height 121 | 122 | @property 123 | def los_probability(self): 124 | r"""Probability of each UT to be LoS. Used to generate LoS 125 | status of outdoor UTs. 126 | 127 | Taken from table 6.6.1-1 in TR38.811 128 | 129 | [batch size, num_ut]""" 130 | 131 | angle_str = str(round(self._elevation_angle/10.0)*10) 132 | los_p = self._params_los["LoS_p" + '_' + angle_str] 133 | #self._distance_2d_out already has desired shape, this it is used here to keep the code shorter 134 | #los_probability = tf.zeros(shape=self._distance_2d_out.shape) + los_p 135 | los_probability = tf.zeros(shape = tf.shape(self._distance_2d_out)) + los_p 136 | return los_probability 137 | 138 | @property 139 | def rays_per_cluster(self): 140 | r"""Number of rays per cluster""" 141 | return tf.constant(20, tf.int32) 142 | 143 | @property 144 | def los_parameter_filepath(self): 145 | r""" Path of the configuration file for LoS scenario""" 146 | assert (self.carrier_frequency >= 19e9 and self.carrier_frequency <= 40e9 or self.carrier_frequency >= 1.9e9 and self.carrier_frequency <= 4e9) 147 | if self.direction == "uplink": 148 | if self.carrier_frequency >= 1.5e9 and self.carrier_frequency <= 4e9: 149 | return 'Sub_Urban_LOS_S_band_UL.json' 150 | else: 151 | return 'Sub_Urban_LOS_Ka_band_UL.json' 152 | else: 153 | if self.carrier_frequency >= 1.5e9 and self.carrier_frequency <= 4e9: 154 | return 'Sub_Urban_LOS_S_band_DL.json' 155 | else: 156 | return 'Sub_Urban_LOS_Ka_band_DL.json' 157 | 158 | 159 | @property 160 | def nlos_parameter_filepath(self): 161 | r""" Path of the configuration file for NLoS scenario""" 162 | assert (self.carrier_frequency >= 19e9 and self.carrier_frequency <= 40e9 or self.carrier_frequency >= 1.9e9 and self.carrier_frequency <= 4e9) 163 | if self.direction == "uplink": 164 | if self.carrier_frequency >= 1.5e9 and self.carrier_frequency <= 4e9: 165 | return 'Sub_Urban_NLOS_S_band_UL.json' 166 | else: 167 | return 'Sub_Urban_NLOS_Ka_band_UL.json' 168 | else: 169 | if self.carrier_frequency >= 1.5e9 and self.carrier_frequency <= 4e9: 170 | return 'Sub_Urban_NLOS_S_band_DL.json' 171 | else: 172 | return 'Sub_Urban_NLOS_Ka_band_DL.json' 173 | 174 | ######################### 175 | # Utility methods 176 | ######################### 177 | def _compute_lsp_log_mean_std(self): 178 | r"""Computes the mean and standard deviations of LSPs in log-domain""" 179 | 180 | batch_size = self.batch_size 181 | num_bs = self.num_bs 182 | num_ut = self.num_ut 183 | distance_2d = self.distance_2d 184 | h_bs = self.h_bs 185 | h_bs = tf.expand_dims(h_bs, axis=2) # For broadcasting 186 | h_ut = self.h_ut 187 | h_ut = tf.expand_dims(h_ut, axis=1) # For broadcasting 188 | 189 | ## Mean 190 | # DS 191 | log_mean_ds = self.get_param("muDS") 192 | # ASD 193 | log_mean_asd = self.get_param("muASD") 194 | # ASA 195 | log_mean_asa = self.get_param("muASA") 196 | # SF. Has zero-mean. 197 | log_mean_sf = tf.zeros([batch_size, num_bs, num_ut], 198 | self.rdtype) 199 | # K. Given in dB in the 3GPP tables, hence the division by 10 200 | log_mean_k = self.get_param("muK")/10.0 201 | # ZSA 202 | log_mean_zsa = self.get_param("muZSA") 203 | # ZSD mean is of the form max(-1, A*d2D/1000 - 0.01*(hUT-1.5) + B) 204 | log_mean_zsd = (self.get_param("muZSD")) 205 | # The ZSD might be -inf which the system cannot work with. Thus it is replaced by a large negative number 206 | # TODO -100 is chose here just to be a large negative number. However, it is not yet tested if replacing it with larger 207 | # numbers further improves the results. 208 | log_mean_max = tf.math.maximum(tf.constant(-100.0, self.rdtype), log_mean_zsd) 209 | log_mean_zsd = tf.where(log_mean_zsd != float("-inf"), log_mean_max, log_mean_zsd) 210 | 211 | lsp_log_mean = tf.stack([log_mean_ds, 212 | log_mean_asd, 213 | log_mean_asa, 214 | log_mean_sf, 215 | log_mean_k, 216 | log_mean_zsa, 217 | log_mean_zsd], axis=3) 218 | 219 | ## STD 220 | # DS 221 | log_std_ds = self.get_param("sigmaDS") 222 | # ASD 223 | log_std_asd = self.get_param("sigmaASD") 224 | # ASA 225 | log_std_asa = self.get_param("sigmaASA") 226 | # SF. Given in dB in the 3GPP tables, hence the division by 10 227 | # O2I and NLoS cases just require the use of a predefined value 228 | log_std_sf_o2i_nlos = self.get_param("sigmaSF")/10.0 229 | # For LoS, two possible scenarion depending on the 2D location of the 230 | # user 231 | distance_breakpoint = (2.*PI*h_bs*h_ut*self.carrier_frequency/ 232 | SPEED_OF_LIGHT) 233 | log_std_sf_los=tf.where(tf.math.less(distance_2d, distance_breakpoint), 234 | self.get_param("sigmaSF")/10.0, self.get_param("sigmaSF")/10.0) 235 | # Use the correct SF STD according to the user scenario: NLoS/O2I, or 236 | # LoS 237 | log_std_sf = tf.where(self.los, log_std_sf_los, log_std_sf_o2i_nlos) 238 | # K. Given in dB in the 3GPP tables, hence the division by 10. 239 | log_std_k = self.get_param("sigmaK")/10.0 240 | # ZSA 241 | log_std_zsa = self.get_param("sigmaZSA") 242 | # ZSD 243 | log_std_zsd = self.get_param("sigmaZSD") 244 | 245 | lsp_log_std = tf.stack([log_std_ds, 246 | log_std_asd, 247 | log_std_asa, 248 | log_std_sf, 249 | log_std_k, 250 | log_std_zsa, 251 | log_std_zsd], axis=3) 252 | 253 | self._lsp_log_mean = lsp_log_mean 254 | self._lsp_log_std = lsp_log_std 255 | 256 | # ZOD offset 257 | zod_offset = (tf.atan((35.-3.5)/distance_2d) 258 | - tf.atan((35.-1.5)/distance_2d)) 259 | zod_offset = tf.where(self.los, tf.constant(0.0,self.rdtype), 260 | zod_offset) 261 | self._zod_offset = zod_offset 262 | 263 | def _compute_pathloss_gas(self): 264 | utils.compute_pathloss_gas(self) 265 | 266 | def _compute_pathloss_scintillation(self): 267 | utils.compute_pathloss_scintilation(self) 268 | 269 | def _compute_pathloss_entry(self): 270 | utils.compute_pathloss_entry(self) 271 | 272 | def _compute_pathloss_additional(self): 273 | utils.compute_pathloss_additional(self) 274 | 275 | def _compute_pathloss_basic(self): 276 | utils.compute_pathloss_basic(self) -------------------------------------------------------------------------------- /OpenNTN/models/Urban_LOS_Ka_band_UL.json: -------------------------------------------------------------------------------- 1 | { 2 | "muDS_10": -8.52, 3 | "muDS_20": -8.59, 4 | "muDS_30": -8.51, 5 | "muDS_40": -8.49, 6 | "muDS_50": -8.48, 7 | "muDS_60": -8.44, 8 | "muDS_70": -8.40, 9 | "muDS_80": -8.37, 10 | "muDS_90": -8.35, 11 | 12 | "sigmaDS_10": 0.92, 13 | "sigmaDS_20": 0.79, 14 | "sigmaDS_30": 0.65, 15 | "sigmaDS_40": 0.48, 16 | "sigmaDS_50": 0.46, 17 | "sigmaDS_60": 0.34, 18 | "sigmaDS_70": 0.27, 19 | "sigmaDS_80": 0.19, 20 | "sigmaDS_90": 0.14, 21 | 22 | "muASD_10": -3.18, 23 | "muASD_20": -3.05, 24 | "muASD_30": -2.98, 25 | "muASD_40": -3.11, 26 | "muASD_50": -3.19, 27 | "muASD_60": -3.25, 28 | "muASD_70": -3.33, 29 | "muASD_80": -3.22, 30 | "muASD_90": -2.83, 31 | 32 | "sigmaASD_10": 0.79, 33 | "sigmaASD_20": 0.87, 34 | "sigmaASD_30": 1.04, 35 | "sigmaASD_40": 1.06, 36 | "sigmaASD_50": 1.12, 37 | "sigmaASD_60": 1.14, 38 | "sigmaASD_70": 1.25, 39 | "sigmaASD_80": 1.35, 40 | "sigmaASD_90": 1.62, 41 | 42 | "muASA_10": -0.40, 43 | "muASA_20": -0.15, 44 | "muASA_30": -0.18, 45 | "muASA_40": -0.31, 46 | "muASA_50": -0.58, 47 | "muASA_60": -0.90, 48 | "muASA_70": -1.16, 49 | "muASA_80": -1.48, 50 | "muASA_90": -1.14, 51 | 52 | "sigmaASA_10": 0.77, 53 | "sigmaASA_20": 0.97, 54 | "sigmaASA_30": 1.58, 55 | "sigmaASA_40": 1.69, 56 | "sigmaASA_50": 2.13, 57 | "sigmaASA_60": 2.51, 58 | "sigmaASA_70": 2.47, 59 | "sigmaASA_80": 2.61, 60 | "sigmaASA_90": 1.70, 61 | 62 | "muZSA_10" : -0.67, 63 | "muZSA_20" : -0.34, 64 | "muZSA_30" : 0.07, 65 | "muZSA_40" : -0.08, 66 | "muZSA_50" : -0.21, 67 | "muZSA_60" : -0.25, 68 | "muZSA_70" : -0.61, 69 | "muZSA_80" : -0.79, 70 | "muZSA_90" : -0.58, 71 | 72 | "sigmaZSA_10": 2.22, 73 | "sigmaZSA_20": 3.04, 74 | "sigmaZSA_30": 1.33, 75 | "sigmaZSA_40": 1.45, 76 | "sigmaZSA_50": 1.62, 77 | "sigmaZSA_60": 1.06, 78 | "sigmaZSA_70": 1.88, 79 | "sigmaZSA_80": 1.87, 80 | "sigmaZSA_90": 1.19, 81 | 82 | "muZSD_10": -2.61, 83 | "muZSD_20": -2.82, 84 | "muZSD_30": -2.48, 85 | "muZSD_40": -2.76, 86 | "muZSD_50": -2.93, 87 | "muZSD_60": -3.05, 88 | "muZSD_70": -3.45, 89 | "muZSD_80": -3.66, 90 | "muZSD_90": -3.56, 91 | 92 | "sigmaZSD_10": 2.41, 93 | "sigmaZSD_20": 2.59, 94 | "sigmaZSD_30": 1.02, 95 | "sigmaZSD_40": 1.27, 96 | "sigmaZSD_50": 1.38, 97 | "sigmaZSD_60": 0.96, 98 | "sigmaZSD_70": 1.51, 99 | "sigmaZSD_80": 1.49, 100 | "sigmaZSD_90": 0.89, 101 | 102 | "sigmaSF_10": 4.0, 103 | "sigmaSF_20": 4.0, 104 | "sigmaSF_30": 4.0, 105 | "sigmaSF_40": 4.0, 106 | "sigmaSF_50": 4.0, 107 | "sigmaSF_60": 4.0, 108 | "sigmaSF_70": 4.0, 109 | "sigmaSF_80": 4.0, 110 | "sigmaSF_90": 4.0, 111 | 112 | "muK_10": 40.18, 113 | "muK_20": 23.62, 114 | "muK_30": 12.48, 115 | "muK_40": 8.56, 116 | "muK_50": 7.42, 117 | "muK_60": 5.97, 118 | "muK_70": 4.88, 119 | "muK_80": 4.22, 120 | "muK_90": 3.81, 121 | 122 | "sigmaK_10": 16.99, 123 | "sigmaK_20": 18.96, 124 | "sigmaK_30": 14.23, 125 | "sigmaK_40": 11.06, 126 | "sigmaK_50": 11.21, 127 | "sigmaK_60": 9.47, 128 | "sigmaK_70": 7.24, 129 | "sigmaK_80": 5.79, 130 | "sigmaK_90": 4.25, 131 | 132 | "muXPR_10": 8.0, 133 | "muXPR_20": 8.0, 134 | "muXPR_30": 8.0, 135 | "muXPR_40": 8.0, 136 | "muXPR_50": 8.0, 137 | "muXPR_60": 8.0, 138 | "muXPR_70": 8.0, 139 | "muXPR_80": 8.0, 140 | "muXPR_90": 8.0, 141 | 142 | "sigmaXPR_10": 4.0, 143 | "sigmaXPR_20": 4.0, 144 | "sigmaXPR_30": 4.0, 145 | "sigmaXPR_40": 4.0, 146 | "sigmaXPR_50": 4.0, 147 | "sigmaXPR_60": 4.0, 148 | "sigmaXPR_70": 4.0, 149 | "sigmaXPR_80": 4.0, 150 | "sigmaXPR_90": 4.0, 151 | 152 | "rTau_10" : 2.5, 153 | "rTau_20" : 2.5, 154 | "rTau_30" : 2.5, 155 | "rTau_40" : 2.5, 156 | "rTau_50" : 2.5, 157 | "rTau_60" : 2.5, 158 | "rTau_70" : 2.5, 159 | "rTau_80" : 2.5, 160 | "rTau_90" : 2.5, 161 | 162 | "numClusters_10" : 4, 163 | "numClusters_20" : 3, 164 | "numClusters_30" : 3, 165 | "numClusters_40" : 3, 166 | "numClusters_50" : 3, 167 | "numClusters_60" : 3, 168 | "numClusters_70" : 3, 169 | "numClusters_80" : 3, 170 | "numClusters_90" : 3, 171 | 172 | "zeta_10" : 3.0, 173 | "zeta_20" : 3.0, 174 | "zeta_30" : 3.0, 175 | "zeta_40" : 3.0, 176 | "zeta_50" : 3.0, 177 | "zeta_60" : 3.0, 178 | "zeta_70" : 3.0, 179 | "zeta_80" : 3.0, 180 | "zeta_90" : 3.0, 181 | 182 | "cDS_10": 1.6, 183 | "cDS_20": 1.6, 184 | "cDS_30": 1.6, 185 | "cDS_40": 1.6, 186 | "cDS_50": 1.6, 187 | "cDS_60": 1.6, 188 | "cDS_70": 1.6, 189 | "cDS_80": 1.6, 190 | "cDS_90": 1.6, 191 | 192 | "cASD_10": 0.09, 193 | "cASD_20": 0.09, 194 | "cASD_30": 0.11, 195 | "cASD_40": 0.15, 196 | "cASD_50": 0.18, 197 | "cASD_60": 0.27, 198 | "cASD_70": 0.42, 199 | "cASD_80": 0.86, 200 | "cASD_90": 2.55, 201 | 202 | "cASA_10" : 11.78, 203 | "cASA_20" : 11.60, 204 | "cASA_30" : 13.05, 205 | "cASA_40" : 14.56, 206 | "cASA_50" : 15.35, 207 | "cASA_60" : 16.97, 208 | "cASA_70" : 17.96, 209 | "cASA_80" : 20.68, 210 | "cASA_90" : 25.08, 211 | 212 | "cZSA_10" : 1.14, 213 | "cZSA_20" : 2.78, 214 | "cZSA_30" : 3.87, 215 | "cZSA_40" : 4.94, 216 | "cZSA_50" : 5.41, 217 | "cZSA_60" : 6.31, 218 | "cZSA_70" : 6.66, 219 | "cZSA_80" : 7.31, 220 | "cZSA_90" : 9.23, 221 | 222 | "LoS_p_10" : 0.246, 223 | "LoS_p_20" : 0.386, 224 | "LoS_p_30" : 0.493, 225 | "LoS_p_40" : 0.613, 226 | "LoS_p_50" : 0.726, 227 | "LoS_p_60" : 0.805, 228 | "LoS_p_70" : 0.919, 229 | "LoS_p_80" : 0.968, 230 | "LoS_p_90" : 0.992, 231 | 232 | "CPhiNLoS" : 0.680, 233 | "CThetaNLoS" : 0.594, 234 | 235 | "corrDistDS_10" : 30.0, 236 | "corrDistDS_20" : 30.0, 237 | "corrDistDS_30" : 30.0, 238 | "corrDistDS_40" : 30.0, 239 | "corrDistDS_50" : 30.0, 240 | "corrDistDS_60" : 30.0, 241 | "corrDistDS_70" : 30.0, 242 | "corrDistDS_80" : 30.0, 243 | "corrDistDS_90" : 30.0, 244 | 245 | "corrDistASD_10" : 18, 246 | "corrDistASD_20" : 18, 247 | "corrDistASD_30" : 18, 248 | "corrDistASD_40" : 18, 249 | "corrDistASD_50" : 18, 250 | "corrDistASD_60" : 18, 251 | "corrDistASD_70" : 18, 252 | "corrDistASD_80" : 18, 253 | "corrDistASD_90" : 18, 254 | 255 | "corrDistASA_10" : 15, 256 | "corrDistASA_20" : 15, 257 | "corrDistASA_30" : 15, 258 | "corrDistASA_40" : 15, 259 | "corrDistASA_50" : 15, 260 | "corrDistASA_60" : 15, 261 | "corrDistASA_70" : 15, 262 | "corrDistASA_80" : 15, 263 | "corrDistASA_90" : 15, 264 | 265 | "corrDistSF_10" : 37, 266 | "corrDistSF_20" : 37, 267 | "corrDistSF_30" : 37, 268 | "corrDistSF_40" : 37, 269 | "corrDistSF_50" : 37, 270 | "corrDistSF_60" : 37, 271 | "corrDistSF_70" : 37, 272 | "corrDistSF_80" : 37, 273 | "corrDistSF_90" : 37, 274 | 275 | "corrDistK_10" : 12, 276 | "corrDistK_20" : 12, 277 | "corrDistK_30" : 12, 278 | "corrDistK_40" : 12, 279 | "corrDistK_50" : 12, 280 | "corrDistK_60" : 12, 281 | "corrDistK_70" : 12, 282 | "corrDistK_80" : 12, 283 | "corrDistK_90" : 12, 284 | 285 | "corrDistZSA_10" : 15, 286 | "corrDistZSA_20" : 15, 287 | "corrDistZSA_30" : 15, 288 | "corrDistZSA_40" : 15, 289 | "corrDistZSA_50" : 15, 290 | "corrDistZSA_60" : 15, 291 | "corrDistZSA_70" : 15, 292 | "corrDistZSA_80" : 15, 293 | "corrDistZSA_90" : 15, 294 | 295 | "corrDistZSD_10" : 15, 296 | "corrDistZSD_20" : 15, 297 | "corrDistZSD_30" : 15, 298 | "corrDistZSD_40" : 15, 299 | "corrDistZSD_50" : 15, 300 | "corrDistZSD_60" : 15, 301 | "corrDistZSD_70" : 15, 302 | "corrDistZSD_80" : 15, 303 | "corrDistZSD_90" : 15, 304 | 305 | "corrASDvsDS_10" : 0.4, 306 | "corrASDvsDS_20" : 0.4, 307 | "corrASDvsDS_30" : 0.4, 308 | "corrASDvsDS_40" : 0.4, 309 | "corrASDvsDS_50" : 0.4, 310 | "corrASDvsDS_60" : 0.4, 311 | "corrASDvsDS_70" : 0.4, 312 | "corrASDvsDS_80" : 0.4, 313 | "corrASDvsDS_90" : 0.4, 314 | 315 | 316 | "corrASAvsDS_10" : 0.8, 317 | "corrASAvsDS_20" : 0.8, 318 | "corrASAvsDS_30" : 0.8, 319 | "corrASAvsDS_40" : 0.8, 320 | "corrASAvsDS_50" : 0.8, 321 | "corrASAvsDS_60" : 0.8, 322 | "corrASAvsDS_70" : 0.8, 323 | "corrASAvsDS_80" : 0.8, 324 | "corrASAvsDS_90" : 0.8, 325 | 326 | "corrASAvsSF_10" : -0.5, 327 | "corrASAvsSF_20" : -0.5, 328 | "corrASAvsSF_30" : -0.5, 329 | "corrASAvsSF_40" : -0.5, 330 | "corrASAvsSF_50" : -0.5, 331 | "corrASAvsSF_60" : -0.5, 332 | "corrASAvsSF_70" : -0.5, 333 | "corrASAvsSF_80" : -0.5, 334 | "corrASAvsSF_90" : -0.5, 335 | 336 | "corrASDvsSF_10" : -0.5, 337 | "corrASDvsSF_20" : -0.5, 338 | "corrASDvsSF_30" : -0.5, 339 | "corrASDvsSF_40" : -0.5, 340 | "corrASDvsSF_50" : -0.5, 341 | "corrASDvsSF_60" : -0.5, 342 | "corrASDvsSF_70" : -0.5, 343 | "corrASDvsSF_80" : -0.5, 344 | "corrASDvsSF_90" : -0.5, 345 | 346 | "corrDSvsSF_10" : -0.4, 347 | "corrDSvsSF_20" : -0.4, 348 | "corrDSvsSF_30" : -0.4, 349 | "corrDSvsSF_40" : -0.4, 350 | "corrDSvsSF_50" : -0.4, 351 | "corrDSvsSF_60" : -0.4, 352 | "corrDSvsSF_70" : -0.4, 353 | "corrDSvsSF_80" : -0.4, 354 | "corrDSvsSF_90" : -0.4, 355 | 356 | "corrASDvsASA_10" : 0, 357 | "corrASDvsASA_20" : 0, 358 | "corrASDvsASA_30" : 0, 359 | "corrASDvsASA_40" : 0, 360 | "corrASDvsASA_50" : 0, 361 | "corrASDvsASA_60" : 0, 362 | "corrASDvsASA_70" : 0, 363 | "corrASDvsASA_80" : 0, 364 | "corrASDvsASA_90" : 0, 365 | 366 | "corrASDvsK_10" : 0, 367 | "corrASDvsK_20" : 0, 368 | "corrASDvsK_30" : 0, 369 | "corrASDvsK_40" : 0, 370 | "corrASDvsK_50" : 0, 371 | "corrASDvsK_60" : 0, 372 | "corrASDvsK_70" : 0, 373 | "corrASDvsK_80" : 0, 374 | "corrASDvsK_90" : 0, 375 | 376 | "corrASAvsK_10" : -0.2, 377 | "corrASAvsK_20" : -0.2, 378 | "corrASAvsK_30" : -0.2, 379 | "corrASAvsK_40" : -0.2, 380 | "corrASAvsK_50" : -0.2, 381 | "corrASAvsK_60" : -0.2, 382 | "corrASAvsK_70" : -0.2, 383 | "corrASAvsK_80" : -0.2, 384 | "corrASAvsK_90" : -0.2, 385 | 386 | 387 | "corrDSvsK_10" : -0.4, 388 | "corrDSvsK_20" : -0.4, 389 | "corrDSvsK_30" : -0.4, 390 | "corrDSvsK_40" : -0.4, 391 | "corrDSvsK_50" : -0.4, 392 | "corrDSvsK_60" : -0.4, 393 | "corrDSvsK_70" : -0.4, 394 | "corrDSvsK_80" : -0.4, 395 | "corrDSvsK_90" : -0.4, 396 | 397 | "corrSFvsK_10" : 0, 398 | "corrSFvsK_20" : 0, 399 | "corrSFvsK_30" : 0, 400 | "corrSFvsK_40" : 0, 401 | "corrSFvsK_50" : 0, 402 | "corrSFvsK_60" : 0, 403 | "corrSFvsK_70" : 0, 404 | "corrSFvsK_80" : 0, 405 | "corrSFvsK_90" : 0, 406 | 407 | "corrZSDvsSF_10" : 0, 408 | "corrZSDvsSF_20" : 0, 409 | "corrZSDvsSF_30" : 0, 410 | "corrZSDvsSF_40" : 0, 411 | "corrZSDvsSF_50" : 0, 412 | "corrZSDvsSF_60" : 0, 413 | "corrZSDvsSF_70" : 0, 414 | "corrZSDvsSF_80" : 0, 415 | "corrZSDvsSF_90" : 0, 416 | 417 | 418 | "corrZSAvsSF_10" : -0.8, 419 | "corrZSAvsSF_20" : -0.8, 420 | "corrZSAvsSF_30" : -0.8, 421 | "corrZSAvsSF_40" : -0.8, 422 | "corrZSAvsSF_50" : -0.8, 423 | "corrZSAvsSF_60" : -0.8, 424 | "corrZSAvsSF_70" : -0.8, 425 | "corrZSAvsSF_80" : -0.8, 426 | "corrZSAvsSF_90" : -0.8, 427 | 428 | "corrZSDvsK_10" : 0, 429 | "corrZSDvsK_20" : 0, 430 | "corrZSDvsK_30" : 0, 431 | "corrZSDvsK_40" : 0, 432 | "corrZSDvsK_50" : 0, 433 | "corrZSDvsK_60" : 0, 434 | "corrZSDvsK_70" : 0, 435 | "corrZSDvsK_80" : 0, 436 | "corrZSDvsK_90" : 0, 437 | 438 | "corrZSAvsK_10" : 0, 439 | "corrZSAvsK_20" : 0, 440 | "corrZSAvsK_30" : 0, 441 | "corrZSAvsK_40" : 0, 442 | "corrZSAvsK_50" : 0, 443 | "corrZSAvsK_60" : 0, 444 | "corrZSAvsK_70" : 0, 445 | "corrZSAvsK_80" : 0, 446 | "corrZSAvsK_90" : 0, 447 | 448 | "corrZSDvsDS_10" : -0.2, 449 | "corrZSDvsDS_20" : -0.2, 450 | "corrZSDvsDS_30" : -0.2, 451 | "corrZSDvsDS_40" : -0.2, 452 | "corrZSDvsDS_50" : -0.2, 453 | "corrZSDvsDS_60" : -0.2, 454 | "corrZSDvsDS_70" : -0.2, 455 | "corrZSDvsDS_80" : -0.2, 456 | "corrZSDvsDS_90" : -0.2, 457 | 458 | "corrZSAvsDS_10" : 0, 459 | "corrZSAvsDS_20" : 0, 460 | "corrZSAvsDS_30" : 0, 461 | "corrZSAvsDS_40" : 0, 462 | "corrZSAvsDS_50" : 0, 463 | "corrZSAvsDS_60" : 0, 464 | "corrZSAvsDS_70" : 0, 465 | "corrZSAvsDS_80" : 0, 466 | "corrZSAvsDS_90" : 0, 467 | 468 | "corrZSDvsASD_10" : 0.5, 469 | "corrZSDvsASD_20" : 0.5, 470 | "corrZSDvsASD_30" : 0.5, 471 | "corrZSDvsASD_40" : 0.5, 472 | "corrZSDvsASD_50" : 0.5, 473 | "corrZSDvsASD_60" : 0.5, 474 | "corrZSDvsASD_70" : 0.5, 475 | "corrZSDvsASD_80" : 0.5, 476 | "corrZSDvsASD_90" : 0.5, 477 | 478 | "corrZSAvsASD_10" : 0, 479 | "corrZSAvsASD_20" : 0, 480 | "corrZSAvsASD_30" : 0, 481 | "corrZSAvsASD_40" : 0, 482 | "corrZSAvsASD_50" : 0, 483 | "corrZSAvsASD_60" : 0, 484 | "corrZSAvsASD_70" : 0, 485 | "corrZSAvsASD_80" : 0, 486 | "corrZSAvsASD_90" : 0, 487 | 488 | "corrZSDvsASA_10" : -0.3, 489 | "corrZSDvsASA_20" : -0.3, 490 | "corrZSDvsASA_30" : -0.3, 491 | "corrZSDvsASA_40" : -0.3, 492 | "corrZSDvsASA_50" : -0.3, 493 | "corrZSDvsASA_60" : -0.3, 494 | "corrZSDvsASA_70" : -0.3, 495 | "corrZSDvsASA_80" : -0.3, 496 | "corrZSDvsASA_90" : -0.3, 497 | 498 | 499 | "corrZSAvsASA_10" : 0.4, 500 | "corrZSAvsASA_20" : 0.4, 501 | "corrZSAvsASA_30" : 0.4, 502 | "corrZSAvsASA_40" : 0.4, 503 | "corrZSAvsASA_50" : 0.4, 504 | "corrZSAvsASA_60" : 0.4, 505 | "corrZSAvsASA_70" : 0.4, 506 | "corrZSAvsASA_80" : 0.4, 507 | "corrZSAvsASA_90" : 0.4, 508 | 509 | 510 | "corrZSDvsZSA_10" : 0, 511 | "corrZSDvsZSA_20" : 0, 512 | "corrZSDvsZSA_30" : 0, 513 | "corrZSDvsZSA_40" : 0, 514 | "corrZSDvsZSA_50" : 0, 515 | "corrZSDvsZSA_60" : 0, 516 | "corrZSDvsZSA_70" : 0, 517 | "corrZSDvsZSA_80" : 0, 518 | "corrZSDvsZSA_90" : 0 519 | 520 | } -------------------------------------------------------------------------------- /OpenNTN/models/Dense_Urban_LOS_Ka_band_DL.json: -------------------------------------------------------------------------------- 1 | { 2 | "muDS_10": -7.43, 3 | "muDS_20": -7.62, 4 | "muDS_30": -7.76, 5 | "muDS_40": -8.02, 6 | "muDS_50": -8.13, 7 | "muDS_60": -8.30, 8 | "muDS_70": -8.34, 9 | "muDS_80": -8.39, 10 | "muDS_90": -8.45, 11 | 12 | "sigmaDS_10": 0.90, 13 | "sigmaDS_20": 0.78, 14 | "sigmaDS_30": 0.80, 15 | "sigmaDS_40": 0.72, 16 | "sigmaDS_50": 0.61, 17 | "sigmaDS_60": 0.47, 18 | "sigmaDS_70": 0.39, 19 | "sigmaDS_80": 0.26, 20 | "sigmaDS_90": 0.01, 21 | 22 | "muASD_10": "-inf", 23 | "muASD_20": "-inf", 24 | "muASD_30": "-inf", 25 | "muASD_40": "-inf", 26 | "muASD_50": "-inf", 27 | "muASD_60": "-inf", 28 | "muASD_70": "-inf", 29 | "muASD_80": "-inf", 30 | "muASD_90": "-inf", 31 | 32 | "sigmaASD_10": 0.0, 33 | "sigmaASD_20": 0.0, 34 | "sigmaASD_30": 0.0, 35 | "sigmaASD_40": 0.0, 36 | "sigmaASD_50": 0.0, 37 | "sigmaASD_60": 0.0, 38 | "sigmaASD_70": 0.0, 39 | "sigmaASD_80": 0.0, 40 | "sigmaASD_90": 0.0, 41 | 42 | "muASA_10": 0.65, 43 | "muASA_20": 0.53, 44 | "muASA_30": 0.60, 45 | "muASA_40": 0.43, 46 | "muASA_50": 0.36, 47 | "muASA_60": 0.16, 48 | "muASA_70": 0.18, 49 | "muASA_80": 0.24, 50 | "muASA_90": 0.36, 51 | 52 | "sigmaASA_10": 0.82, 53 | "sigmaASA_20": 0.78, 54 | "sigmaASA_30": 0.83, 55 | "sigmaASA_40": 0.78, 56 | "sigmaASA_50": 0.77, 57 | "sigmaASA_60": 0.84, 58 | "sigmaASA_70": 0.64, 59 | "sigmaASA_80": 0.81, 60 | "sigmaASA_90": 0.65, 61 | 62 | "muZSA_10" : 0.82, 63 | "muZSA_20" : 0.47, 64 | "muZSA_30" : 0.80, 65 | "muZSA_40" : 1.23, 66 | "muZSA_50" : 1.42, 67 | "muZSA_60" : 1.56, 68 | "muZSA_70" : 1.65, 69 | "muZSA_80" : 1.73, 70 | "muZSA_90" : 1.79, 71 | 72 | "sigmaZSA_10": 0.05, 73 | "sigmaZSA_20": 0.11, 74 | "sigmaZSA_30": 0.05, 75 | "sigmaZSA_40": 0.04, 76 | "sigmaZSA_50": 0.10, 77 | "sigmaZSA_60": 0.06, 78 | "sigmaZSA_70": 0.07, 79 | "sigmaZSA_80": 0.02, 80 | "sigmaZSA_90": 0.01, 81 | 82 | "muZSD_10": "-inf", 83 | "muZSD_20": "-inf", 84 | "muZSD_30": "-inf", 85 | "muZSD_40": "-inf", 86 | "muZSD_50": "-inf", 87 | "muZSD_60": "-inf", 88 | "muZSD_70": "-inf", 89 | "muZSD_80": "-inf", 90 | "muZSD_90": "-inf", 91 | 92 | "sigmaZSD_10": 0.0, 93 | "sigmaZSD_20": 0.0, 94 | "sigmaZSD_30": 0.0, 95 | "sigmaZSD_40": 0.0, 96 | "sigmaZSD_50": 0.0, 97 | "sigmaZSD_60": 0.0, 98 | "sigmaZSD_70": 0.0, 99 | "sigmaZSD_80": 0.0, 100 | "sigmaZSD_90": 0.0, 101 | 102 | "sigmaSF_10": 2.9, 103 | "sigmaSF_20": 2.4, 104 | "sigmaSF_30": 2.7, 105 | "sigmaSF_40": 2.4, 106 | "sigmaSF_50": 2.4, 107 | "sigmaSF_60": 2.7, 108 | "sigmaSF_70": 2.6, 109 | "sigmaSF_80": 2.8, 110 | "sigmaSF_90": 0.6, 111 | 112 | "muK_10": 6.1, 113 | "muK_20": 13.7, 114 | "muK_30": 12.9, 115 | "muK_40": 10.3, 116 | "muK_50": 9.2, 117 | "muK_60": 8.4, 118 | "muK_70": 8.0, 119 | "muK_80": 7.4, 120 | "muK_90": 7.6, 121 | 122 | "sigmaK_10": 2.6, 123 | "sigmaK_20": 6.8, 124 | "sigmaK_30": 6.0, 125 | "sigmaK_40": 3.3, 126 | "sigmaK_50": 2.2, 127 | "sigmaK_60": 1.9, 128 | "sigmaK_70": 1.5, 129 | "sigmaK_80": 1.6, 130 | "sigmaK_90": 1.3, 131 | 132 | "muXPR_10": 24.7, 133 | "muXPR_20": 24.4, 134 | "muXPR_30": 24.4, 135 | "muXPR_40": 24.2, 136 | "muXPR_50": 23.9, 137 | "muXPR_60": 23.3, 138 | "muXPR_70": 22.6, 139 | "muXPR_80": 21.2, 140 | "muXPR_90": 17.6, 141 | 142 | "sigmaXPR_10": 2.1, 143 | "sigmaXPR_20": 2.8, 144 | "sigmaXPR_30": 2.7, 145 | "sigmaXPR_40": 2.7, 146 | "sigmaXPR_50": 3.1, 147 | "sigmaXPR_60": 3.9, 148 | "sigmaXPR_70": 4.8, 149 | "sigmaXPR_80": 6.8, 150 | "sigmaXPR_90": 12.7, 151 | 152 | "rTau_10" : 2.5, 153 | "rTau_20" : 2.5, 154 | "rTau_30" : 2.5, 155 | "rTau_40" : 2.5, 156 | "rTau_50" : 2.5, 157 | "rTau_60" : 2.5, 158 | "rTau_70" : 2.5, 159 | "rTau_80" : 2.5, 160 | "rTau_90" : 2.5, 161 | 162 | "numClusters_10" : 3, 163 | "numClusters_20" : 3, 164 | "numClusters_30" : 3, 165 | "numClusters_40" : 3, 166 | "numClusters_50" : 3, 167 | "numClusters_60" : 3, 168 | "numClusters_70" : 3, 169 | "numClusters_80" : 3, 170 | "numClusters_90" : 3, 171 | 172 | "zeta_10" : 3.0, 173 | "zeta_20" : 3.0, 174 | "zeta_30" : 3.0, 175 | "zeta_40" : 3.0, 176 | "zeta_50" : 3.0, 177 | "zeta_60" : 3.0, 178 | "zeta_70" : 3.0, 179 | "zeta_80" : 3.0, 180 | "zeta_90" : 3.0, 181 | 182 | "cDS_10": 1.6, 183 | "cDS_20": 1.6, 184 | "cDS_30": 1.6, 185 | "cDS_40": 1.6, 186 | "cDS_50": 1.6, 187 | "cDS_60": 1.6, 188 | "cDS_70": 1.6, 189 | "cDS_80": 1.6, 190 | "cDS_90": 1.6, 191 | 192 | "cASD_10": 0.0, 193 | "cASD_20": 0.0, 194 | "cASD_30": 0.0, 195 | "cASD_40": 0.0, 196 | "cASD_50": 0.0, 197 | "cASD_60": 0.0, 198 | "cASD_70": 0.0, 199 | "cASD_80": 0.0, 200 | "cASD_90": 0.0, 201 | 202 | "cASA_10" : 11.0, 203 | "cASA_20" : 11.0, 204 | "cASA_30" : 11.0, 205 | "cASA_40" : 11.0, 206 | "cASA_50" : 11.0, 207 | "cASA_60" : 11.0, 208 | "cASA_70" : 11.0, 209 | "cASA_80" : 11.0, 210 | "cASA_90" : 11.0, 211 | 212 | "cZSA_10" : 7.0, 213 | "cZSA_20" : 7.0, 214 | "cZSA_30" : 7.0, 215 | "cZSA_40" : 7.0, 216 | "cZSA_50" : 7.0, 217 | "cZSA_60" : 7.0, 218 | "cZSA_70" : 7.0, 219 | "cZSA_80" : 7.0, 220 | "cZSA_90" : 7.0, 221 | 222 | "LoS_p_10" : 0.282, 223 | "LoS_p_20" : 0.331, 224 | "LoS_p_30" : 0.398, 225 | "LoS_p_40" : 0.468, 226 | "LoS_p_50" : 0.537, 227 | "LoS_p_60" : 0.612, 228 | "LoS_p_70" : 0.738, 229 | "LoS_p_80" : 0.82, 230 | "LoS_p_90" : 0.981, 231 | 232 | "CPhiNLoS" : 0.680, 233 | "CThetaNLoS" : 0.594, 234 | 235 | "corrDistDS_10" : 30.0, 236 | "corrDistDS_20" : 30.0, 237 | "corrDistDS_30" : 30.0, 238 | "corrDistDS_40" : 30.0, 239 | "corrDistDS_50" : 30.0, 240 | "corrDistDS_60" : 30.0, 241 | "corrDistDS_70" : 30.0, 242 | "corrDistDS_80" : 30.0, 243 | "corrDistDS_90" : 30.0, 244 | 245 | "corrDistASD_10" : 18.0, 246 | "corrDistASD_20" : 18.0, 247 | "corrDistASD_30" : 18.0, 248 | "corrDistASD_40" : 18.0, 249 | "corrDistASD_50" : 18.0, 250 | "corrDistASD_60" : 18.0, 251 | "corrDistASD_70" : 18.0, 252 | "corrDistASD_80" : 18.0, 253 | "corrDistASD_90" : 18.0, 254 | 255 | "corrDistASA_10" : 15.0, 256 | "corrDistASA_20" : 15.0, 257 | "corrDistASA_30" : 15.0, 258 | "corrDistASA_40" : 15.0, 259 | "corrDistASA_50" : 15.0, 260 | "corrDistASA_60" : 15.0, 261 | "corrDistASA_70" : 15.0, 262 | "corrDistASA_80" : 15.0, 263 | "corrDistASA_90" : 15.0, 264 | 265 | "corrDistSF_10" : 37.0, 266 | "corrDistSF_20" : 37.0, 267 | "corrDistSF_30" : 37.0, 268 | "corrDistSF_40" : 37.0, 269 | "corrDistSF_50" : 37.0, 270 | "corrDistSF_60" : 37.0, 271 | "corrDistSF_70" : 37.0, 272 | "corrDistSF_80" : 37.0, 273 | "corrDistSF_90" : 37.0, 274 | 275 | "corrDistK_10" : 12.0, 276 | "corrDistK_20" : 12.0, 277 | "corrDistK_30" : 12.0, 278 | "corrDistK_40" : 12.0, 279 | "corrDistK_50" : 12.0, 280 | "corrDistK_60" : 12.0, 281 | "corrDistK_70" : 12.0, 282 | "corrDistK_80" : 12.0, 283 | "corrDistK_90" : 12.0, 284 | 285 | "corrDistZSA_10" : 15.0, 286 | "corrDistZSA_20" : 15.0, 287 | "corrDistZSA_30" : 15.0, 288 | "corrDistZSA_40" : 15.0, 289 | "corrDistZSA_50" : 15.0, 290 | "corrDistZSA_60" : 15.0, 291 | "corrDistZSA_70" : 15.0, 292 | "corrDistZSA_80" : 15.0, 293 | "corrDistZSA_90" : 15.0, 294 | 295 | "corrDistZSD_10" : 15.0, 296 | "corrDistZSD_20" : 15.0, 297 | "corrDistZSD_30" : 15.0, 298 | "corrDistZSD_40" : 15.0, 299 | "corrDistZSD_50" : 15.0, 300 | "corrDistZSD_60" : 15.0, 301 | "corrDistZSD_70" : 15.0, 302 | "corrDistZSD_80" : 15.0, 303 | "corrDistZSD_90" : 15.0, 304 | 305 | "corrASDvsDS_10" : 0.0, 306 | "corrASDvsDS_20" : 0.0, 307 | "corrASDvsDS_30" : 0.0, 308 | "corrASDvsDS_40" : 0.0, 309 | "corrASDvsDS_50" : 0.0, 310 | "corrASDvsDS_60" : 0.0, 311 | "corrASDvsDS_70" : 0.0, 312 | "corrASDvsDS_80" : 0.0, 313 | "corrASDvsDS_90" : 0.0, 314 | 315 | 316 | "corrASAvsDS_10" : 0.8, 317 | "corrASAvsDS_20" : 0.8, 318 | "corrASAvsDS_30" : 0.8, 319 | "corrASAvsDS_40" : 0.8, 320 | "corrASAvsDS_50" : 0.8, 321 | "corrASAvsDS_60" : 0.8, 322 | "corrASAvsDS_70" : 0.8, 323 | "corrASAvsDS_80" : 0.8, 324 | "corrASAvsDS_90" : 0.8, 325 | 326 | "corrASAvsSF_10" : -0.5, 327 | "corrASAvsSF_20" : -0.5, 328 | "corrASAvsSF_30" : -0.5, 329 | "corrASAvsSF_40" : -0.5, 330 | "corrASAvsSF_50" : -0.5, 331 | "corrASAvsSF_60" : -0.5, 332 | "corrASAvsSF_70" : -0.5, 333 | "corrASAvsSF_80" : -0.5, 334 | "corrASAvsSF_90" : -0.5, 335 | 336 | "corrASDvsSF_10" : 0.0, 337 | "corrASDvsSF_20" : 0.0, 338 | "corrASDvsSF_30" : 0.0, 339 | "corrASDvsSF_40" : 0.0, 340 | "corrASDvsSF_50" : 0.0, 341 | "corrASDvsSF_60" : 0.0, 342 | "corrASDvsSF_70" : 0.0, 343 | "corrASDvsSF_80" : 0.0, 344 | "corrASDvsSF_90" : 0.0, 345 | 346 | "corrDSvsSF_10" : -0.4, 347 | "corrDSvsSF_20" : -0.4, 348 | "corrDSvsSF_30" : -0.4, 349 | "corrDSvsSF_40" : -0.4, 350 | "corrDSvsSF_50" : -0.4, 351 | "corrDSvsSF_60" : -0.4, 352 | "corrDSvsSF_70" : -0.4, 353 | "corrDSvsSF_80" : -0.4, 354 | "corrDSvsSF_90" : -0.4, 355 | 356 | "corrASDvsASA_10" : 0.0, 357 | "corrASDvsASA_20" : 0.0, 358 | "corrASDvsASA_30" : 0.0, 359 | "corrASDvsASA_40" : 0.0, 360 | "corrASDvsASA_50" : 0.0, 361 | "corrASDvsASA_60" : 0.0, 362 | "corrASDvsASA_70" : 0.0, 363 | "corrASDvsASA_80" : 0.0, 364 | "corrASDvsASA_90" : 0.0, 365 | 366 | "corrASDvsK_10" : 0.0, 367 | "corrASDvsK_20" : 0.0, 368 | "corrASDvsK_30" : 0.0, 369 | "corrASDvsK_40" : 0.0, 370 | "corrASDvsK_50" : 0.0, 371 | "corrASDvsK_60" : 0.0, 372 | "corrASDvsK_70" : 0.0, 373 | "corrASDvsK_80" : 0.0, 374 | "corrASDvsK_90" : 0.0, 375 | 376 | "corrASAvsK_10" : -0.2, 377 | "corrASAvsK_20" : -0.2, 378 | "corrASAvsK_30" : -0.2, 379 | "corrASAvsK_40" : -0.2, 380 | "corrASAvsK_50" : -0.2, 381 | "corrASAvsK_60" : -0.2, 382 | "corrASAvsK_70" : -0.2, 383 | "corrASAvsK_80" : -0.2, 384 | "corrASAvsK_90" : -0.2, 385 | 386 | 387 | "corrDSvsK_10" : -0.4, 388 | "corrDSvsK_20" : -0.4, 389 | "corrDSvsK_30" : -0.4, 390 | "corrDSvsK_40" : -0.4, 391 | "corrDSvsK_50" : -0.4, 392 | "corrDSvsK_60" : -0.4, 393 | "corrDSvsK_70" : -0.4, 394 | "corrDSvsK_80" : -0.4, 395 | "corrDSvsK_90" : -0.4, 396 | 397 | "corrSFvsK_10" : 0.0, 398 | "corrSFvsK_20" : 0.0, 399 | "corrSFvsK_30" : 0.0, 400 | "corrSFvsK_40" : 0.0, 401 | "corrSFvsK_50" : 0.0, 402 | "corrSFvsK_60" : 0.0, 403 | "corrSFvsK_70" : 0.0, 404 | "corrSFvsK_80" : 0.0, 405 | "corrSFvsK_90" : 0.0, 406 | 407 | "corrZSDvsSF_10" : 0.0, 408 | "corrZSDvsSF_20" : 0.0, 409 | "corrZSDvsSF_30" : 0.0, 410 | "corrZSDvsSF_40" : 0.0, 411 | "corrZSDvsSF_50" : 0.0, 412 | "corrZSDvsSF_60" : 0.0, 413 | "corrZSDvsSF_70" : 0.0, 414 | "corrZSDvsSF_80" : 0.0, 415 | "corrZSDvsSF_90" : 0.0, 416 | 417 | 418 | "corrZSAvsSF_10" : -0.8, 419 | "corrZSAvsSF_20" : -0.8, 420 | "corrZSAvsSF_30" : -0.8, 421 | "corrZSAvsSF_40" : -0.8, 422 | "corrZSAvsSF_50" : -0.8, 423 | "corrZSAvsSF_60" : -0.8, 424 | "corrZSAvsSF_70" : -0.8, 425 | "corrZSAvsSF_80" : -0.8, 426 | "corrZSAvsSF_90" : -0.8, 427 | 428 | "corrZSDvsK_10" : 0.0, 429 | "corrZSDvsK_20" : 0.0, 430 | "corrZSDvsK_30" : 0.0, 431 | "corrZSDvsK_40" : 0.0, 432 | "corrZSDvsK_50" : 0.0, 433 | "corrZSDvsK_60" : 0.0, 434 | "corrZSDvsK_70" : 0.0, 435 | "corrZSDvsK_80" : 0.0, 436 | "corrZSDvsK_90" : 0.0, 437 | 438 | "corrZSAvsK_10" : 0.0, 439 | "corrZSAvsK_20" : 0.0, 440 | "corrZSAvsK_30" : 0.0, 441 | "corrZSAvsK_40" : 0.0, 442 | "corrZSAvsK_50" : 0.0, 443 | "corrZSAvsK_60" : 0.0, 444 | "corrZSAvsK_70" : 0.0, 445 | "corrZSAvsK_80" : 0.0, 446 | "corrZSAvsK_90" : 0.0, 447 | 448 | "corrZSDvsDS_10" : 0.0, 449 | "corrZSDvsDS_20" : 0.0, 450 | "corrZSDvsDS_30" : 0.0, 451 | "corrZSDvsDS_40" : 0.0, 452 | "corrZSDvsDS_50" : 0.0, 453 | "corrZSDvsDS_60" : 0.0, 454 | "corrZSDvsDS_70" : 0.0, 455 | "corrZSDvsDS_80" : 0.0, 456 | "corrZSDvsDS_90" : 0.0, 457 | 458 | "corrZSAvsDS_10" : 0.0, 459 | "corrZSAvsDS_20" : 0.0, 460 | "corrZSAvsDS_30" : 0.0, 461 | "corrZSAvsDS_40" : 0.0, 462 | "corrZSAvsDS_50" : 0.0, 463 | "corrZSAvsDS_60" : 0.0, 464 | "corrZSAvsDS_70" : 0.0, 465 | "corrZSAvsDS_80" : 0.0, 466 | "corrZSAvsDS_90" : 0.0, 467 | 468 | "corrZSDvsASD_10" : 0.0, 469 | "corrZSDvsASD_20" : 0.0, 470 | "corrZSDvsASD_30" : 0.0, 471 | "corrZSDvsASD_40" : 0.0, 472 | "corrZSDvsASD_50" : 0.0, 473 | "corrZSDvsASD_60" : 0.0, 474 | "corrZSDvsASD_70" : 0.0, 475 | "corrZSDvsASD_80" : 0.0, 476 | "corrZSDvsASD_90" : 0.0, 477 | 478 | "corrZSAvsASD_10" : 0.0, 479 | "corrZSAvsASD_20" : 0.0, 480 | "corrZSAvsASD_30" : 0.0, 481 | "corrZSAvsASD_40" : 0.0, 482 | "corrZSAvsASD_50" : 0.0, 483 | "corrZSAvsASD_60" : 0.0, 484 | "corrZSAvsASD_70" : 0.0, 485 | "corrZSAvsASD_80" : 0.0, 486 | "corrZSAvsASD_90" : 0.0, 487 | 488 | "corrZSDvsASA_10" : 0.0, 489 | "corrZSDvsASA_20" : 0.0, 490 | "corrZSDvsASA_30" : 0.0, 491 | "corrZSDvsASA_40" : 0.0, 492 | "corrZSDvsASA_50" : 0.0, 493 | "corrZSDvsASA_60" : 0.0, 494 | "corrZSDvsASA_70" : 0.0, 495 | "corrZSDvsASA_80" : 0.0, 496 | "corrZSDvsASA_90" : 0.0, 497 | 498 | 499 | "corrZSAvsASA_10" : 0.4, 500 | "corrZSAvsASA_20" : 0.4, 501 | "corrZSAvsASA_30" : 0.4, 502 | "corrZSAvsASA_40" : 0.4, 503 | "corrZSAvsASA_50" : 0.4, 504 | "corrZSAvsASA_60" : 0.4, 505 | "corrZSAvsASA_70" : 0.4, 506 | "corrZSAvsASA_80" : 0.4, 507 | "corrZSAvsASA_90" : 0.4, 508 | 509 | 510 | "corrZSDvsZSA_10" : 0.0, 511 | "corrZSDvsZSA_20" : 0.0, 512 | "corrZSDvsZSA_30" : 0.0, 513 | "corrZSDvsZSA_40" : 0.0, 514 | "corrZSDvsZSA_50" : 0.0, 515 | "corrZSDvsZSA_60" : 0.0, 516 | "corrZSDvsZSA_70" : 0.0, 517 | "corrZSDvsZSA_80" : 0.0, 518 | "corrZSDvsZSA_90" : 0.0 519 | 520 | } -------------------------------------------------------------------------------- /OpenNTN/models/Dense_Urban_LOS_S_band_DL.json: -------------------------------------------------------------------------------- 1 | { 2 | "muDS_10": -7.12, 3 | "muDS_20": -7.28, 4 | "muDS_30": -7.45, 5 | "muDS_40": -7.73, 6 | "muDS_50": -7.91, 7 | "muDS_60": -8.14, 8 | "muDS_70": -8.23, 9 | "muDS_80": -8.28, 10 | "muDS_90": -8.36, 11 | 12 | "sigmaDS_10": 0.80, 13 | "sigmaDS_20": 0.67, 14 | "sigmaDS_30": 0.68, 15 | "sigmaDS_40": 0.66, 16 | "sigmaDS_50": 0.62, 17 | "sigmaDS_60": 0.51, 18 | "sigmaDS_70": 0.45, 19 | "sigmaDS_80": 0.31, 20 | "sigmaDS_90": 0.08, 21 | "muASD_10": "-inf", 22 | "muASD_20": "-inf", 23 | "muASD_30": "-inf", 24 | "muASD_40": "-inf", 25 | "muASD_50": "-inf", 26 | "muASD_60": "-inf", 27 | "muASD_70": "-inf", 28 | "muASD_80": "-inf", 29 | "muASD_90": "-inf", 30 | 31 | "sigmaASD_10": 0.0, 32 | "sigmaASD_20": 0.0, 33 | "sigmaASD_30": 0.0, 34 | "sigmaASD_40": 0.0, 35 | "sigmaASD_50": 0.0, 36 | "sigmaASD_60": 0.0, 37 | "sigmaASD_70": 0.0, 38 | "sigmaASD_80": 0.0, 39 | "sigmaASD_90": 0.0, 40 | 41 | "muASA_10": 0.94, 42 | "muASA_20": 0.87, 43 | "muASA_30": 0.92, 44 | "muASA_40": 0.79, 45 | "muASA_50": 0.72, 46 | "muASA_60": 0.60, 47 | "muASA_70": 0.55, 48 | "muASA_80": 0.71, 49 | "muASA_90": 0.81, 50 | 51 | "sigmaASA_10": 0.70, 52 | "sigmaASA_20": 0.66, 53 | "sigmaASA_30": 0.68, 54 | "sigmaASA_40": 0.64, 55 | "sigmaASA_50": 0.63, 56 | "sigmaASA_60": 0.54, 57 | "sigmaASA_70": 0.52, 58 | "sigmaASA_80": 0.53, 59 | "sigmaASA_90": 0.62, 60 | 61 | "muZSA_10" : 0.82, 62 | "muZSA_20" : 0.50, 63 | "muZSA_30" : 0.82, 64 | "muZSA_40" : 1.23, 65 | "muZSA_50" : 1.43, 66 | "muZSA_60" : 1.56, 67 | "muZSA_70" : 1.66, 68 | "muZSA_80" : 1.73, 69 | "muZSA_90" : 1.79, 70 | 71 | "sigmaZSA_10": 0.03, 72 | "sigmaZSA_20": 0.09, 73 | "sigmaZSA_30": 0.05, 74 | "sigmaZSA_40": 0.03, 75 | "sigmaZSA_50": 0.06, 76 | "sigmaZSA_60": 0.05, 77 | "sigmaZSA_70": 0.05, 78 | "sigmaZSA_80": 0.02, 79 | "sigmaZSA_90": 0.01, 80 | 81 | "muZSD_10": "-inf", 82 | "muZSD_20": "-inf", 83 | "muZSD_30": "-inf", 84 | "muZSD_40": "-inf", 85 | "muZSD_50": "-inf", 86 | "muZSD_60": "-inf", 87 | "muZSD_70": "-inf", 88 | "muZSD_80": "-inf", 89 | "muZSD_90": "-inf", 90 | 91 | "sigmaZSD_10": 0.0, 92 | "sigmaZSD_20": 0.0, 93 | "sigmaZSD_30": 0.0, 94 | "sigmaZSD_40": 0.0, 95 | "sigmaZSD_50": 0.0, 96 | "sigmaZSD_60": 0.0, 97 | "sigmaZSD_70": 0.0, 98 | "sigmaZSD_80": 0.0, 99 | "sigmaZSD_90": 0.0, 100 | 101 | 102 | "sigmaSF_10": 3.5, 103 | "sigmaSF_20": 3.4, 104 | "sigmaSF_30": 2.9, 105 | "sigmaSF_40": 3.0, 106 | "sigmaSF_50": 3.1, 107 | "sigmaSF_60": 2.7, 108 | "sigmaSF_70": 2.5, 109 | "sigmaSF_80": 2.3, 110 | "sigmaSF_90": 1.2, 111 | 112 | "muK_10": 4.4, 113 | "muK_20": 9.0, 114 | "muK_30": 9.3, 115 | "muK_40": 7.9, 116 | "muK_50": 7.4, 117 | "muK_60": 7.0, 118 | "muK_70": 6.9, 119 | "muK_80": 6.5, 120 | "muK_90": 6.8, 121 | 122 | "sigmaK_10": 3.3, 123 | "sigmaK_20": 6.6, 124 | "sigmaK_30": 6.1, 125 | "sigmaK_40": 4.0, 126 | "sigmaK_50": 3.0, 127 | "sigmaK_60": 2.6, 128 | "sigmaK_70": 2.2, 129 | "sigmaK_80": 2.1, 130 | "sigmaK_90": 1.9, 131 | 132 | "muXPR_10": 24.4, 133 | "muXPR_20": 23.6, 134 | "muXPR_30": 23.2, 135 | "muXPR_40": 22.6, 136 | "muXPR_50": 21.8, 137 | "muXPR_60": 20.5, 138 | "muXPR_70": 19.3, 139 | "muXPR_80": 17.4, 140 | "muXPR_90": 12.3, 141 | 142 | "sigmaXPR_10": 3.8, 143 | "sigmaXPR_20": 4.7, 144 | "sigmaXPR_30": 4.6, 145 | "sigmaXPR_40": 4.9, 146 | "sigmaXPR_50": 5.7, 147 | "sigmaXPR_60": 6.9, 148 | "sigmaXPR_70": 8.1, 149 | "sigmaXPR_80": 10.3, 150 | "sigmaXPR_90": 15.2, 151 | 152 | "rTau_10" : 2.5, 153 | "rTau_20" : 2.5, 154 | "rTau_30" : 2.5, 155 | "rTau_40" : 2.5, 156 | "rTau_50" : 2.5, 157 | "rTau_60" : 2.5, 158 | "rTau_70" : 2.5, 159 | "rTau_80" : 2.5, 160 | "rTau_90" : 2.5, 161 | 162 | "numClusters_10" : 3, 163 | "numClusters_20" : 3, 164 | "numClusters_30" : 3, 165 | "numClusters_40" : 3, 166 | "numClusters_50" : 3, 167 | "numClusters_60" : 3, 168 | "numClusters_70" : 3, 169 | "numClusters_80" : 3, 170 | "numClusters_90" : 3, 171 | 172 | "zeta_10" : 3.0, 173 | "zeta_20" : 3.0, 174 | "zeta_30" : 3.0, 175 | "zeta_40" : 3.0, 176 | "zeta_50" : 3.0, 177 | "zeta_60" : 3.0, 178 | "zeta_70" : 3.0, 179 | "zeta_80" : 3.0, 180 | "zeta_90" : 3.0, 181 | 182 | "cDS_10": 3.9, 183 | "cDS_20": 3.9, 184 | "cDS_30": 3.9, 185 | "cDS_40": 3.9, 186 | "cDS_50": 3.9, 187 | "cDS_60": 3.9, 188 | "cDS_70": 3.9, 189 | "cDS_80": 3.9, 190 | "cDS_90": 3.9, 191 | 192 | "cASD_10": 0.0, 193 | "cASD_20": 0.0, 194 | "cASD_30": 0.0, 195 | "cASD_40": 0.0, 196 | "cASD_50": 0.0, 197 | "cASD_60": 0.0, 198 | "cASD_70": 0.0, 199 | "cASD_80": 0.0, 200 | "cASD_90": 0.0, 201 | 202 | "cASA_10" : 11.0, 203 | "cASA_20" : 11.0, 204 | "cASA_30" : 11.0, 205 | "cASA_40" : 11.0, 206 | "cASA_50" : 11.0, 207 | "cASA_60" : 11.0, 208 | "cASA_70" : 11.0, 209 | "cASA_80" : 11.0, 210 | "cASA_90" : 11.0, 211 | 212 | "cZSA_10" : 7.0, 213 | "cZSA_20" : 7.0, 214 | "cZSA_30" : 7.0, 215 | "cZSA_40" : 7.0, 216 | "cZSA_50" : 7.0, 217 | "cZSA_60" : 7.0, 218 | "cZSA_70" : 7.0, 219 | "cZSA_80" : 7.0, 220 | "cZSA_90" : 7.0, 221 | 222 | "LoS_p_10" : 0.282, 223 | "LoS_p_20" : 0.331, 224 | "LoS_p_30" : 0.398, 225 | "LoS_p_40" : 0.468, 226 | "LoS_p_50" : 0.537, 227 | "LoS_p_60" : 0.612, 228 | "LoS_p_70" : 0.738, 229 | "LoS_p_80" : 0.82, 230 | "LoS_p_90" : 0.981, 231 | 232 | "CPhiNLoS" : 0.680, 233 | "CThetaNLoS" : 0.594, 234 | 235 | "corrDistDS_10" : 30.0, 236 | "corrDistDS_20" : 30.0, 237 | "corrDistDS_30" : 30.0, 238 | "corrDistDS_40" : 30.0, 239 | "corrDistDS_50" : 30.0, 240 | "corrDistDS_60" : 30.0, 241 | "corrDistDS_70" : 30.0, 242 | "corrDistDS_80" : 30.0, 243 | "corrDistDS_90" : 30.0, 244 | 245 | "corrDistASD_10" : 18.0, 246 | "corrDistASD_20" : 18.0, 247 | "corrDistASD_30" : 18.0, 248 | "corrDistASD_40" : 18.0, 249 | "corrDistASD_50" : 18.0, 250 | "corrDistASD_60" : 18.0, 251 | "corrDistASD_70" : 18.0, 252 | "corrDistASD_80" : 18.0, 253 | "corrDistASD_90" : 18.0, 254 | 255 | "corrDistASA_10" : 15.0, 256 | "corrDistASA_20" : 15.0, 257 | "corrDistASA_30" : 15.0, 258 | "corrDistASA_40" : 15.0, 259 | "corrDistASA_50" : 15.0, 260 | "corrDistASA_60" : 15.0, 261 | "corrDistASA_70" : 15.0, 262 | "corrDistASA_80" : 15.0, 263 | "corrDistASA_90" : 15.0, 264 | 265 | "corrDistSF_10" : 37.0, 266 | "corrDistSF_20" : 37.0, 267 | "corrDistSF_30" : 37.0, 268 | "corrDistSF_40" : 37.0, 269 | "corrDistSF_50" : 37.0, 270 | "corrDistSF_60" : 37.0, 271 | "corrDistSF_70" : 37.0, 272 | "corrDistSF_80" : 37.0, 273 | "corrDistSF_90" : 37.0, 274 | 275 | "corrDistK_10" : 12.0, 276 | "corrDistK_20" : 12.0, 277 | "corrDistK_30" : 12.0, 278 | "corrDistK_40" : 12.0, 279 | "corrDistK_50" : 12.0, 280 | "corrDistK_60" : 12.0, 281 | "corrDistK_70" : 12.0, 282 | "corrDistK_80" : 12.0, 283 | "corrDistK_90" : 12.0, 284 | 285 | "corrDistZSA_10" : 15.0, 286 | "corrDistZSA_20" : 15.0, 287 | "corrDistZSA_30" : 15.0, 288 | "corrDistZSA_40" : 15.0, 289 | "corrDistZSA_50" : 15.0, 290 | "corrDistZSA_60" : 15.0, 291 | "corrDistZSA_70" : 15.0, 292 | "corrDistZSA_80" : 15.0, 293 | "corrDistZSA_90" : 15.0, 294 | 295 | "corrDistZSD_10" : 15.0, 296 | "corrDistZSD_20" : 15.0, 297 | "corrDistZSD_30" : 15.0, 298 | "corrDistZSD_40" : 15.0, 299 | "corrDistZSD_50" : 15.0, 300 | "corrDistZSD_60" : 15.0, 301 | "corrDistZSD_70" : 15.0, 302 | "corrDistZSD_80" : 15.0, 303 | "corrDistZSD_90" : 15.0, 304 | 305 | "corrASDvsDS_10" : 0.0, 306 | "corrASDvsDS_20" : 0.0, 307 | "corrASDvsDS_30" : 0.0, 308 | "corrASDvsDS_40" : 0.0, 309 | "corrASDvsDS_50" : 0.0, 310 | "corrASDvsDS_60" : 0.0, 311 | "corrASDvsDS_70" : 0.0, 312 | "corrASDvsDS_80" : 0.0, 313 | "corrASDvsDS_90" : 0.0, 314 | 315 | 316 | "corrASAvsDS_10" : 0.8, 317 | "corrASAvsDS_20" : 0.8, 318 | "corrASAvsDS_30" : 0.8, 319 | "corrASAvsDS_40" : 0.8, 320 | "corrASAvsDS_50" : 0.8, 321 | "corrASAvsDS_60" : 0.8, 322 | "corrASAvsDS_70" : 0.8, 323 | "corrASAvsDS_80" : 0.8, 324 | "corrASAvsDS_90" : 0.8, 325 | 326 | "corrASAvsSF_10" : -0.5, 327 | "corrASAvsSF_20" : -0.5, 328 | "corrASAvsSF_30" : -0.5, 329 | "corrASAvsSF_40" : -0.5, 330 | "corrASAvsSF_50" : -0.5, 331 | "corrASAvsSF_60" : -0.5, 332 | "corrASAvsSF_70" : -0.5, 333 | "corrASAvsSF_80" : -0.5, 334 | "corrASAvsSF_90" : -0.5, 335 | 336 | 337 | "corrASDvsSF_10" : 0.0, 338 | "corrASDvsSF_20" : 0.0, 339 | "corrASDvsSF_30" : 0.0, 340 | "corrASDvsSF_40" : 0.0, 341 | "corrASDvsSF_50" : 0.0, 342 | "corrASDvsSF_60" : 0.0, 343 | "corrASDvsSF_70" : 0.0, 344 | "corrASDvsSF_80" : 0.0, 345 | "corrASDvsSF_90" : 0.0, 346 | 347 | "corrDSvsSF_10" : -0.4, 348 | "corrDSvsSF_20" : -0.4, 349 | "corrDSvsSF_30" : -0.4, 350 | "corrDSvsSF_40" : -0.4, 351 | "corrDSvsSF_50" : -0.4, 352 | "corrDSvsSF_60" : -0.4, 353 | "corrDSvsSF_70" : -0.4, 354 | "corrDSvsSF_80" : -0.4, 355 | "corrDSvsSF_90" : -0.4, 356 | 357 | "corrASDvsASA_10" : 0.0, 358 | "corrASDvsASA_20" : 0.0, 359 | "corrASDvsASA_30" : 0.0, 360 | "corrASDvsASA_40" : 0.0, 361 | "corrASDvsASA_50" : 0.0, 362 | "corrASDvsASA_60" : 0.0, 363 | "corrASDvsASA_70" : 0.0, 364 | "corrASDvsASA_80" : 0.0, 365 | "corrASDvsASA_90" : 0.0, 366 | 367 | "corrASDvsK_10" : 0.0, 368 | "corrASDvsK_20" : 0.0, 369 | "corrASDvsK_30" : 0.0, 370 | "corrASDvsK_40" : 0.0, 371 | "corrASDvsK_50" : 0.0, 372 | "corrASDvsK_60" : 0.0, 373 | "corrASDvsK_70" : 0.0, 374 | "corrASDvsK_80" : 0.0, 375 | "corrASDvsK_90" : 0.0, 376 | 377 | "corrASAvsK_10" : -0.2, 378 | "corrASAvsK_20" : -0.2, 379 | "corrASAvsK_30" : -0.2, 380 | "corrASAvsK_40" : -0.2, 381 | "corrASAvsK_50" : -0.2, 382 | "corrASAvsK_60" : -0.2, 383 | "corrASAvsK_70" : -0.2, 384 | "corrASAvsK_80" : -0.2, 385 | "corrASAvsK_90" : -0.2, 386 | 387 | 388 | "corrDSvsK_10" : -0.4, 389 | "corrDSvsK_20" : -0.4, 390 | "corrDSvsK_30" : -0.4, 391 | "corrDSvsK_40" : -0.4, 392 | "corrDSvsK_50" : -0.4, 393 | "corrDSvsK_60" : -0.4, 394 | "corrDSvsK_70" : -0.4, 395 | "corrDSvsK_80" : -0.4, 396 | "corrDSvsK_90" : -0.4, 397 | 398 | "corrSFvsK_10" : 0.0, 399 | "corrSFvsK_20" : 0.0, 400 | "corrSFvsK_30" : 0.0, 401 | "corrSFvsK_40" : 0.0, 402 | "corrSFvsK_50" : 0.0, 403 | "corrSFvsK_60" : 0.0, 404 | "corrSFvsK_70" : 0.0, 405 | "corrSFvsK_80" : 0.0, 406 | "corrSFvsK_90" : 0.0, 407 | 408 | "corrZSDvsSF_10" : 0.0, 409 | "corrZSDvsSF_20" : 0.0, 410 | "corrZSDvsSF_30" : 0.0, 411 | "corrZSDvsSF_40" : 0.0, 412 | "corrZSDvsSF_50" : 0.0, 413 | "corrZSDvsSF_60" : 0.0, 414 | "corrZSDvsSF_70" : 0.0, 415 | "corrZSDvsSF_80" : 0.0, 416 | "corrZSDvsSF_90" : 0.0, 417 | 418 | 419 | "corrZSAvsSF_10" : -0.8, 420 | "corrZSAvsSF_20" : -0.8, 421 | "corrZSAvsSF_30" : -0.8, 422 | "corrZSAvsSF_40" : -0.8, 423 | "corrZSAvsSF_50" : -0.8, 424 | "corrZSAvsSF_60" : -0.8, 425 | "corrZSAvsSF_70" : -0.8, 426 | "corrZSAvsSF_80" : -0.8, 427 | "corrZSAvsSF_90" : -0.8, 428 | 429 | "corrZSDvsK_10" : 0.0, 430 | "corrZSDvsK_20" : 0.0, 431 | "corrZSDvsK_30" : 0.0, 432 | "corrZSDvsK_40" : 0.0, 433 | "corrZSDvsK_50" : 0.0, 434 | "corrZSDvsK_60" : 0.0, 435 | "corrZSDvsK_70" : 0.0, 436 | "corrZSDvsK_80" : 0.0, 437 | "corrZSDvsK_90" : 0.0, 438 | 439 | "corrZSAvsK_10" : 0.0, 440 | "corrZSAvsK_20" : 0.0, 441 | "corrZSAvsK_30" : 0.0, 442 | "corrZSAvsK_40" : 0.0, 443 | "corrZSAvsK_50" : 0.0, 444 | "corrZSAvsK_60" : 0.0, 445 | "corrZSAvsK_70" : 0.0, 446 | "corrZSAvsK_80" : 0.0, 447 | "corrZSAvsK_90" : 0.0, 448 | 449 | "corrZSDvsDS_10" : 0.0, 450 | "corrZSDvsDS_20" : 0.0, 451 | "corrZSDvsDS_30" : 0.0, 452 | "corrZSDvsDS_40" : 0.0, 453 | "corrZSDvsDS_50" : 0.0, 454 | "corrZSDvsDS_60" : 0.0, 455 | "corrZSDvsDS_70" : 0.0, 456 | "corrZSDvsDS_80" : 0.0, 457 | "corrZSDvsDS_90" : 0.0, 458 | 459 | "corrZSAvsDS_10" : 0.0, 460 | "corrZSAvsDS_20" : 0.0, 461 | "corrZSAvsDS_30" : 0.0, 462 | "corrZSAvsDS_40" : 0.0, 463 | "corrZSAvsDS_50" : 0.0, 464 | "corrZSAvsDS_60" : 0.0, 465 | "corrZSAvsDS_70" : 0.0, 466 | "corrZSAvsDS_80" : 0.0, 467 | "corrZSAvsDS_90" : 0.0, 468 | 469 | "corrZSDvsASD_10" : 0.0, 470 | "corrZSDvsASD_20" : 0.0, 471 | "corrZSDvsASD_30" : 0.0, 472 | "corrZSDvsASD_40" : 0.0, 473 | "corrZSDvsASD_50" : 0.0, 474 | "corrZSDvsASD_60" : 0.0, 475 | "corrZSDvsASD_70" : 0.0, 476 | "corrZSDvsASD_80" : 0.0, 477 | "corrZSDvsASD_90" : 0.0, 478 | 479 | "corrZSAvsASD_10" : 0.0, 480 | "corrZSAvsASD_20" : 0.0, 481 | "corrZSAvsASD_30" : 0.0, 482 | "corrZSAvsASD_40" : 0.0, 483 | "corrZSAvsASD_50" : 0.0, 484 | "corrZSAvsASD_60" : 0.0, 485 | "corrZSAvsASD_70" : 0.0, 486 | "corrZSAvsASD_80" : 0.0, 487 | "corrZSAvsASD_90" : 0.0, 488 | 489 | "corrZSDvsASA_10" : 0.0, 490 | "corrZSDvsASA_20" : 0.0, 491 | "corrZSDvsASA_30" : 0.0, 492 | "corrZSDvsASA_40" : 0.0, 493 | "corrZSDvsASA_50" : 0.0, 494 | "corrZSDvsASA_60" : 0.0, 495 | "corrZSDvsASA_70" : 0.0, 496 | "corrZSDvsASA_80" : 0.0, 497 | "corrZSDvsASA_90" : 0.0, 498 | 499 | 500 | "corrZSAvsASA_10" : 0.4, 501 | "corrZSAvsASA_20" : 0.4, 502 | "corrZSAvsASA_30" : 0.4, 503 | "corrZSAvsASA_40" : 0.4, 504 | "corrZSAvsASA_50" : 0.4, 505 | "corrZSAvsASA_60" : 0.4, 506 | "corrZSAvsASA_70" : 0.4, 507 | "corrZSAvsASA_80" : 0.4, 508 | "corrZSAvsASA_90" : 0.4, 509 | 510 | 511 | "corrZSDvsZSA_10" : 0.0, 512 | "corrZSDvsZSA_20" : 0.0, 513 | "corrZSDvsZSA_30" : 0.0, 514 | "corrZSDvsZSA_40" : 0.0, 515 | "corrZSDvsZSA_50" : 0.0, 516 | "corrZSDvsZSA_60" : 0.0, 517 | "corrZSDvsZSA_70" : 0.0, 518 | "corrZSDvsZSA_80" : 0.0, 519 | "corrZSDvsZSA_90" : 0.0 520 | 521 | } -------------------------------------------------------------------------------- /OpenNTN/models/Dense_Urban_LOS_S_band_UL.json: -------------------------------------------------------------------------------- 1 | { 2 | "muDS_10": -7.12, 3 | "muDS_20": -7.28, 4 | "muDS_30": -7.45, 5 | "muDS_40": -7.73, 6 | "muDS_50": -7.91, 7 | "muDS_60": -8.14, 8 | "muDS_70": -8.23, 9 | "muDS_80": -8.28, 10 | "muDS_90": -8.36, 11 | 12 | "sigmaDS_10": 0.80, 13 | "sigmaDS_20": 0.67, 14 | "sigmaDS_30": 0.68, 15 | "sigmaDS_40": 0.66, 16 | "sigmaDS_50": 0.62, 17 | "sigmaDS_60": 0.51, 18 | "sigmaDS_70": 0.45, 19 | "sigmaDS_80": 0.31, 20 | "sigmaDS_90": 0.08, 21 | 22 | "muASD_10": -3.06, 23 | "muASD_20": -2.68, 24 | "muASD_30": -2.51, 25 | "muASD_40": -2.40, 26 | "muASD_50": -2.31, 27 | "muASD_60": -2.20, 28 | "muASD_70": -2.00, 29 | "muASD_80": -1.64, 30 | "muASD_90": -0.63, 31 | 32 | "sigmaASD_10": 0.48, 33 | "sigmaASD_20": 0.36, 34 | "sigmaASD_30": 0.38, 35 | "sigmaASD_40": 0.32, 36 | "sigmaASD_50": 0.33, 37 | "sigmaASD_60": 0.39, 38 | "sigmaASD_70": 0.40, 39 | "sigmaASD_80": 0.32, 40 | "sigmaASD_90": 0.53, 41 | 42 | "muASA_10": 0.94, 43 | "muASA_20": 0.87, 44 | "muASA_30": 0.92, 45 | "muASA_40": 0.79, 46 | "muASA_50": 0.72, 47 | "muASA_60": 0.60, 48 | "muASA_70": 0.55, 49 | "muASA_80": 0.71, 50 | "muASA_90": 0.81, 51 | 52 | "sigmaASA_10": 0.70, 53 | "sigmaASA_20": 0.66, 54 | "sigmaASA_30": 0.68, 55 | "sigmaASA_40": 0.64, 56 | "sigmaASA_50": 0.63, 57 | "sigmaASA_60": 0.54, 58 | "sigmaASA_70": 0.52, 59 | "sigmaASA_80": 0.53, 60 | "sigmaASA_90": 0.62, 61 | 62 | "muZSA_10" : 0.82, 63 | "muZSA_20" : 0.50, 64 | "muZSA_30" : 0.82, 65 | "muZSA_40" : 1.23, 66 | "muZSA_50" : 1.43, 67 | "muZSA_60" : 1.56, 68 | "muZSA_70" : 1.66, 69 | "muZSA_80" : 1.73, 70 | "muZSA_90" : 1.79, 71 | 72 | "sigmaZSA_10": 0.03, 73 | "sigmaZSA_20": 0.09, 74 | "sigmaZSA_30": 0.05, 75 | "sigmaZSA_40": 0.03, 76 | "sigmaZSA_50": 0.06, 77 | "sigmaZSA_60": 0.05, 78 | "sigmaZSA_70": 0.05, 79 | "sigmaZSA_80": 0.02, 80 | "sigmaZSA_90": 0.01, 81 | 82 | "muZSD_10": -2.52, 83 | "muZSD_20": -2.29, 84 | "muZSD_30": -2.19, 85 | "muZSD_40": -2.24, 86 | "muZSD_50": -2.30, 87 | "muZSD_60": -2.48, 88 | "muZSD_70": -2.64, 89 | "muZSD_80": -2.68, 90 | "muZSD_90": -2.61, 91 | 92 | "sigmaZSD_10": 0.50, 93 | "sigmaZSD_20": 0.53, 94 | "sigmaZSD_30": 0.58, 95 | "sigmaZSD_40": 0.51, 96 | "sigmaZSD_50": 0.46, 97 | "sigmaZSD_60": 0.35, 98 | "sigmaZSD_70": 0.31, 99 | "sigmaZSD_80": 0.39, 100 | "sigmaZSD_90": 0.28, 101 | 102 | "sigmaSF_10": 3.5, 103 | "sigmaSF_20": 3.4, 104 | "sigmaSF_30": 2.9, 105 | "sigmaSF_40": 3.0, 106 | "sigmaSF_50": 3.1, 107 | "sigmaSF_60": 2.7, 108 | "sigmaSF_70": 2.5, 109 | "sigmaSF_80": 2.3, 110 | "sigmaSF_90": 1.2, 111 | 112 | "muK_10": 4.4, 113 | "muK_20": 9.0, 114 | "muK_30": 9.3, 115 | "muK_40": 7.9, 116 | "muK_50": 7.4, 117 | "muK_60": 7.0, 118 | "muK_70": 6.9, 119 | "muK_80": 6.5, 120 | "muK_90": 6.8, 121 | 122 | "sigmaK_10": 3.3, 123 | "sigmaK_20": 6.6, 124 | "sigmaK_30": 6.1, 125 | "sigmaK_40": 4.0, 126 | "sigmaK_50": 3.0, 127 | "sigmaK_60": 2.6, 128 | "sigmaK_70": 2.2, 129 | "sigmaK_80": 2.1, 130 | "sigmaK_90": 1.9, 131 | 132 | "muXPR_10": 24.4, 133 | "muXPR_20": 23.6, 134 | "muXPR_30": 23.2, 135 | "muXPR_40": 22.6, 136 | "muXPR_50": 21.8, 137 | "muXPR_60": 20.5, 138 | "muXPR_70": 19.3, 139 | "muXPR_80": 17.4, 140 | "muXPR_90": 12.3, 141 | 142 | "sigmaXPR_10": 3.8, 143 | "sigmaXPR_20": 4.7, 144 | "sigmaXPR_30": 4.6, 145 | "sigmaXPR_40": 4.9, 146 | "sigmaXPR_50": 5.7, 147 | "sigmaXPR_60": 6.9, 148 | "sigmaXPR_70": 8.1, 149 | "sigmaXPR_80": 10.3, 150 | "sigmaXPR_90": 15.2, 151 | 152 | "rTau_10" : 2.5, 153 | "rTau_20" : 2.5, 154 | "rTau_30" : 2.5, 155 | "rTau_40" : 2.5, 156 | "rTau_50" : 2.5, 157 | "rTau_60" : 2.5, 158 | "rTau_70" : 2.5, 159 | "rTau_80" : 2.5, 160 | "rTau_90" : 2.5, 161 | 162 | "numClusters_10" : 3, 163 | "numClusters_20" : 3, 164 | "numClusters_30" : 3, 165 | "numClusters_40" : 3, 166 | "numClusters_50" : 3, 167 | "numClusters_60" : 3, 168 | "numClusters_70" : 3, 169 | "numClusters_80" : 3, 170 | "numClusters_90" : 3, 171 | 172 | "zeta_10" : 3.0, 173 | "zeta_20" : 3.0, 174 | "zeta_30" : 3.0, 175 | "zeta_40" : 3.0, 176 | "zeta_50" : 3.0, 177 | "zeta_60" : 3.0, 178 | "zeta_70" : 3.0, 179 | "zeta_80" : 3.0, 180 | "zeta_90" : 3.0, 181 | 182 | "cDS_10": 3.9, 183 | "cDS_20": 3.9, 184 | "cDS_30": 3.9, 185 | "cDS_40": 3.9, 186 | "cDS_50": 3.9, 187 | "cDS_60": 3.9, 188 | "cDS_70": 3.9, 189 | "cDS_80": 3.9, 190 | "cDS_90": 3.9, 191 | 192 | "cASD_10": 0.0, 193 | "cASD_20": 0.0, 194 | "cASD_30": 0.0, 195 | "cASD_40": 0.0, 196 | "cASD_50": 0.0, 197 | "cASD_60": 0.0, 198 | "cASD_70": 0.0, 199 | "cASD_80": 0.0, 200 | "cASD_90": 0.0, 201 | 202 | "cASA_10" : 11.0, 203 | "cASA_20" : 11.0, 204 | "cASA_30" : 11.0, 205 | "cASA_40" : 11.0, 206 | "cASA_50" : 11.0, 207 | "cASA_60" : 11.0, 208 | "cASA_70" : 11.0, 209 | "cASA_80" : 11.0, 210 | "cASA_90" : 11.0, 211 | 212 | "cZSA_10" : 7.0, 213 | "cZSA_20" : 7.0, 214 | "cZSA_30" : 7.0, 215 | "cZSA_40" : 7.0, 216 | "cZSA_50" : 7.0, 217 | "cZSA_60" : 7.0, 218 | "cZSA_70" : 7.0, 219 | "cZSA_80" : 7.0, 220 | "cZSA_90" : 7.0, 221 | 222 | "LoS_p_10" : 0.282, 223 | "LoS_p_20" : 0.331, 224 | "LoS_p_30" : 0.398, 225 | "LoS_p_40" : 0.468, 226 | "LoS_p_50" : 0.537, 227 | "LoS_p_60" : 0.612, 228 | "LoS_p_70" : 0.738, 229 | "LoS_p_80" : 0.82, 230 | "LoS_p_90" : 0.981, 231 | 232 | "CPhiNLoS" : 0.680, 233 | "CThetaNLoS" : 0.594, 234 | 235 | "corrDistDS_10" : 30.0, 236 | "corrDistDS_20" : 30.0, 237 | "corrDistDS_30" : 30.0, 238 | "corrDistDS_40" : 30.0, 239 | "corrDistDS_50" : 30.0, 240 | "corrDistDS_60" : 30.0, 241 | "corrDistDS_70" : 30.0, 242 | "corrDistDS_80" : 30.0, 243 | "corrDistDS_90" : 30.0, 244 | 245 | "corrDistASD_10" : 18.0, 246 | "corrDistASD_20" : 18.0, 247 | "corrDistASD_30" : 18.0, 248 | "corrDistASD_40" : 18.0, 249 | "corrDistASD_50" : 18.0, 250 | "corrDistASD_60" : 18.0, 251 | "corrDistASD_70" : 18.0, 252 | "corrDistASD_80" : 18.0, 253 | "corrDistASD_90" : 18.0, 254 | 255 | "corrDistASA_10" : 15.0, 256 | "corrDistASA_20" : 15.0, 257 | "corrDistASA_30" : 15.0, 258 | "corrDistASA_40" : 15.0, 259 | "corrDistASA_50" : 15.0, 260 | "corrDistASA_60" : 15.0, 261 | "corrDistASA_70" : 15.0, 262 | "corrDistASA_80" : 15.0, 263 | "corrDistASA_90" : 15.0, 264 | 265 | "corrDistSF_10" : 37.0, 266 | "corrDistSF_20" : 37.0, 267 | "corrDistSF_30" : 37.0, 268 | "corrDistSF_40" : 37.0, 269 | "corrDistSF_50" : 37.0, 270 | "corrDistSF_60" : 37.0, 271 | "corrDistSF_70" : 37.0, 272 | "corrDistSF_80" : 37.0, 273 | "corrDistSF_90" : 37.0, 274 | 275 | "corrDistK_10" : 12.0, 276 | "corrDistK_20" : 12.0, 277 | "corrDistK_30" : 12.0, 278 | "corrDistK_40" : 12.0, 279 | "corrDistK_50" : 12.0, 280 | "corrDistK_60" : 12.0, 281 | "corrDistK_70" : 12.0, 282 | "corrDistK_80" : 12.0, 283 | "corrDistK_90" : 12.0, 284 | 285 | "corrDistZSA_10" : 15.0, 286 | "corrDistZSA_20" : 15.0, 287 | "corrDistZSA_30" : 15.0, 288 | "corrDistZSA_40" : 15.0, 289 | "corrDistZSA_50" : 15.0, 290 | "corrDistZSA_60" : 15.0, 291 | "corrDistZSA_70" : 15.0, 292 | "corrDistZSA_80" : 15.0, 293 | "corrDistZSA_90" : 15.0, 294 | 295 | "corrDistZSD_10" : 15.0, 296 | "corrDistZSD_20" : 15.0, 297 | "corrDistZSD_30" : 15.0, 298 | "corrDistZSD_40" : 15.0, 299 | "corrDistZSD_50" : 15.0, 300 | "corrDistZSD_60" : 15.0, 301 | "corrDistZSD_70" : 15.0, 302 | "corrDistZSD_80" : 15.0, 303 | "corrDistZSD_90" : 15.0, 304 | 305 | "corrASDvsDS_10" : 0.4, 306 | "corrASDvsDS_20" : 0.4, 307 | "corrASDvsDS_30" : 0.4, 308 | "corrASDvsDS_40" : 0.4, 309 | "corrASDvsDS_50" : 0.4, 310 | "corrASDvsDS_60" : 0.4, 311 | "corrASDvsDS_70" : 0.4, 312 | "corrASDvsDS_80" : 0.4, 313 | "corrASDvsDS_90" : 0.4, 314 | 315 | 316 | "corrASAvsDS_10" : 0.8, 317 | "corrASAvsDS_20" : 0.8, 318 | "corrASAvsDS_30" : 0.8, 319 | "corrASAvsDS_40" : 0.8, 320 | "corrASAvsDS_50" : 0.8, 321 | "corrASAvsDS_60" : 0.8, 322 | "corrASAvsDS_70" : 0.8, 323 | "corrASAvsDS_80" : 0.8, 324 | "corrASAvsDS_90" : 0.8, 325 | 326 | "corrASAvsSF_10" : -0.5, 327 | "corrASAvsSF_20" : -0.5, 328 | "corrASAvsSF_30" : -0.5, 329 | "corrASAvsSF_40" : -0.5, 330 | "corrASAvsSF_50" : -0.5, 331 | "corrASAvsSF_60" : -0.5, 332 | "corrASAvsSF_70" : -0.5, 333 | "corrASAvsSF_80" : -0.5, 334 | "corrASAvsSF_90" : -0.5, 335 | 336 | "corrASDvsSF_10" : -0.5, 337 | "corrASDvsSF_20" : -0.5, 338 | "corrASDvsSF_30" : -0.5, 339 | "corrASDvsSF_40" : -0.5, 340 | "corrASDvsSF_50" : -0.5, 341 | "corrASDvsSF_60" : -0.5, 342 | "corrASDvsSF_70" : -0.5, 343 | "corrASDvsSF_80" : -0.5, 344 | "corrASDvsSF_90" : -0.5, 345 | 346 | "corrDSvsSF_10" : -0.4, 347 | "corrDSvsSF_20" : -0.4, 348 | "corrDSvsSF_30" : -0.4, 349 | "corrDSvsSF_40" : -0.4, 350 | "corrDSvsSF_50" : -0.4, 351 | "corrDSvsSF_60" : -0.4, 352 | "corrDSvsSF_70" : -0.4, 353 | "corrDSvsSF_80" : -0.4, 354 | "corrDSvsSF_90" : -0.4, 355 | 356 | "corrASDvsASA_10" : 0.0, 357 | "corrASDvsASA_20" : 0.0, 358 | "corrASDvsASA_30" : 0.0, 359 | "corrASDvsASA_40" : 0.0, 360 | "corrASDvsASA_50" : 0.0, 361 | "corrASDvsASA_60" : 0.0, 362 | "corrASDvsASA_70" : 0.0, 363 | "corrASDvsASA_80" : 0.0, 364 | "corrASDvsASA_90" : 0.0, 365 | 366 | "corrASDvsK_10" : 0.0, 367 | "corrASDvsK_20" : 0.0, 368 | "corrASDvsK_30" : 0.0, 369 | "corrASDvsK_40" : 0.0, 370 | "corrASDvsK_50" : 0.0, 371 | "corrASDvsK_60" : 0.0, 372 | "corrASDvsK_70" : 0.0, 373 | "corrASDvsK_80" : 0.0, 374 | "corrASDvsK_90" : 0.0, 375 | 376 | "corrASAvsK_10" : -0.2, 377 | "corrASAvsK_20" : -0.2, 378 | "corrASAvsK_30" : -0.2, 379 | "corrASAvsK_40" : -0.2, 380 | "corrASAvsK_50" : -0.2, 381 | "corrASAvsK_60" : -0.2, 382 | "corrASAvsK_70" : -0.2, 383 | "corrASAvsK_80" : -0.2, 384 | "corrASAvsK_90" : -0.2, 385 | 386 | 387 | "corrDSvsK_10" : -0.4, 388 | "corrDSvsK_20" : -0.4, 389 | "corrDSvsK_30" : -0.4, 390 | "corrDSvsK_40" : -0.4, 391 | "corrDSvsK_50" : -0.4, 392 | "corrDSvsK_60" : -0.4, 393 | "corrDSvsK_70" : -0.4, 394 | "corrDSvsK_80" : -0.4, 395 | "corrDSvsK_90" : -0.4, 396 | 397 | "corrSFvsK_10" : 0.0, 398 | "corrSFvsK_20" : 0.0, 399 | "corrSFvsK_30" : 0.0, 400 | "corrSFvsK_40" : 0.0, 401 | "corrSFvsK_50" : 0.0, 402 | "corrSFvsK_60" : 0.0, 403 | "corrSFvsK_70" : 0.0, 404 | "corrSFvsK_80" : 0.0, 405 | "corrSFvsK_90" : 0.0, 406 | 407 | "corrZSDvsSF_10" : 0.0, 408 | "corrZSDvsSF_20" : 0.0, 409 | "corrZSDvsSF_30" : 0.0, 410 | "corrZSDvsSF_40" : 0.0, 411 | "corrZSDvsSF_50" : 0.0, 412 | "corrZSDvsSF_60" : 0.0, 413 | "corrZSDvsSF_70" : 0.0, 414 | "corrZSDvsSF_80" : 0.0, 415 | "corrZSDvsSF_90" : 0.0, 416 | 417 | 418 | "corrZSAvsSF_10" : -0.8, 419 | "corrZSAvsSF_20" : -0.8, 420 | "corrZSAvsSF_30" : -0.8, 421 | "corrZSAvsSF_40" : -0.8, 422 | "corrZSAvsSF_50" : -0.8, 423 | "corrZSAvsSF_60" : -0.8, 424 | "corrZSAvsSF_70" : -0.8, 425 | "corrZSAvsSF_80" : -0.8, 426 | "corrZSAvsSF_90" : -0.8, 427 | 428 | "corrZSDvsK_10" : 0.0, 429 | "corrZSDvsK_20" : 0.0, 430 | "corrZSDvsK_30" : 0.0, 431 | "corrZSDvsK_40" : 0.0, 432 | "corrZSDvsK_50" : 0.0, 433 | "corrZSDvsK_60" : 0.0, 434 | "corrZSDvsK_70" : 0.0, 435 | "corrZSDvsK_80" : 0.0, 436 | "corrZSDvsK_90" : 0.0, 437 | 438 | "corrZSAvsK_10" : 0.0, 439 | "corrZSAvsK_20" : 0.0, 440 | "corrZSAvsK_30" : 0.0, 441 | "corrZSAvsK_40" : 0.0, 442 | "corrZSAvsK_50" : 0.0, 443 | "corrZSAvsK_60" : 0.0, 444 | "corrZSAvsK_70" : 0.0, 445 | "corrZSAvsK_80" : 0.0, 446 | "corrZSAvsK_90" : 0.0, 447 | 448 | "corrZSDvsDS_10" : -0.2, 449 | "corrZSDvsDS_20" : -0.2, 450 | "corrZSDvsDS_30" : -0.2, 451 | "corrZSDvsDS_40" : -0.2, 452 | "corrZSDvsDS_50" : -0.2, 453 | "corrZSDvsDS_60" : -0.2, 454 | "corrZSDvsDS_70" : -0.2, 455 | "corrZSDvsDS_80" : -0.2, 456 | "corrZSDvsDS_90" : -0.2, 457 | 458 | "corrZSAvsDS_10" : 0.0, 459 | "corrZSAvsDS_20" : 0.0, 460 | "corrZSAvsDS_30" : 0.0, 461 | "corrZSAvsDS_40" : 0.0, 462 | "corrZSAvsDS_50" : 0.0, 463 | "corrZSAvsDS_60" : 0.0, 464 | "corrZSAvsDS_70" : 0.0, 465 | "corrZSAvsDS_80" : 0.0, 466 | "corrZSAvsDS_90" : 0.0, 467 | 468 | "corrZSDvsASD_10" : 0.5, 469 | "corrZSDvsASD_20" : 0.5, 470 | "corrZSDvsASD_30" : 0.5, 471 | "corrZSDvsASD_40" : 0.5, 472 | "corrZSDvsASD_50" : 0.5, 473 | "corrZSDvsASD_60" : 0.5, 474 | "corrZSDvsASD_70" : 0.5, 475 | "corrZSDvsASD_80" : 0.5, 476 | "corrZSDvsASD_90" : 0.5, 477 | 478 | "corrZSAvsASD_10" : 0.0, 479 | "corrZSAvsASD_20" : 0.0, 480 | "corrZSAvsASD_30" : 0.0, 481 | "corrZSAvsASD_40" : 0.0, 482 | "corrZSAvsASD_50" : 0.0, 483 | "corrZSAvsASD_60" : 0.0, 484 | "corrZSAvsASD_70" : 0.0, 485 | "corrZSAvsASD_80" : 0.0, 486 | "corrZSAvsASD_90" : 0.0, 487 | 488 | "corrZSDvsASA_10" : -0.3, 489 | "corrZSDvsASA_20" : -0.3, 490 | "corrZSDvsASA_30" : -0.3, 491 | "corrZSDvsASA_40" : -0.3, 492 | "corrZSDvsASA_50" : -0.3, 493 | "corrZSDvsASA_60" : -0.3, 494 | "corrZSDvsASA_70" : -0.3, 495 | "corrZSDvsASA_80" : -0.3, 496 | "corrZSDvsASA_90" : -0.3, 497 | 498 | 499 | "corrZSAvsASA_10" : 0.4, 500 | "corrZSAvsASA_20" : 0.4, 501 | "corrZSAvsASA_30" : 0.4, 502 | "corrZSAvsASA_40" : 0.4, 503 | "corrZSAvsASA_50" : 0.4, 504 | "corrZSAvsASA_60" : 0.4, 505 | "corrZSAvsASA_70" : 0.4, 506 | "corrZSAvsASA_80" : 0.4, 507 | "corrZSAvsASA_90" : 0.4, 508 | 509 | 510 | "corrZSDvsZSA_10" : 0.0, 511 | "corrZSDvsZSA_20" : 0.0, 512 | "corrZSDvsZSA_30" : 0.0, 513 | "corrZSDvsZSA_40" : 0.0, 514 | "corrZSDvsZSA_50" : 0.0, 515 | "corrZSDvsZSA_60" : 0.0, 516 | "corrZSDvsZSA_70" : 0.0, 517 | "corrZSDvsZSA_80" : 0.0, 518 | "corrZSDvsZSA_90" : 0.0 519 | 520 | } -------------------------------------------------------------------------------- /OpenNTN/models/Dense_Urban_LOS_Ka_band_UL.json: -------------------------------------------------------------------------------- 1 | { 2 | "muDS_10": -7.43, 3 | "muDS_20": -7.62, 4 | "muDS_30": -7.76, 5 | "muDS_40": -8.02, 6 | "muDS_50": -8.13, 7 | "muDS_60": -8.30, 8 | "muDS_70": -8.34, 9 | "muDS_80": -8.39, 10 | "muDS_90": -8.45, 11 | 12 | "sigmaDS_10": 0.90, 13 | "sigmaDS_20": 0.78, 14 | "sigmaDS_30": 0.80, 15 | "sigmaDS_40": 0.72, 16 | "sigmaDS_50": 0.61, 17 | "sigmaDS_60": 0.47, 18 | "sigmaDS_70": 0.39, 19 | "sigmaDS_80": 0.26, 20 | "sigmaDS_90": 0.01, 21 | 22 | "muASD_10": -3.43, 23 | "muASD_20": -3.06, 24 | "muASD_30": -2.91, 25 | "muASD_40": -2.81, 26 | "muASD_50": -2.74, 27 | "muASD_60": -2.72, 28 | "muASD_70": -2.46, 29 | "muASD_80": -2.30, 30 | "muASD_90": -1.11, 31 | 32 | "sigmaASD_10": 0.54, 33 | "sigmaASD_20": 0.41, 34 | "sigmaASD_30": 0.42, 35 | "sigmaASD_40": 0.34, 36 | "sigmaASD_50": 0.34, 37 | "sigmaASD_60": 0.70, 38 | "sigmaASD_70": 0.40, 39 | "sigmaASD_80": 0.78, 40 | "sigmaASD_90": 0.51, 41 | 42 | "muASA_10": 0.65, 43 | "muASA_20": 0.53, 44 | "muASA_30": 0.60, 45 | "muASA_40": 0.43, 46 | "muASA_50": 0.36, 47 | "muASA_60": 0.16, 48 | "muASA_70": 0.18, 49 | "muASA_80": 0.24, 50 | "muASA_90": 0.36, 51 | 52 | "sigmaASA_10": 0.82, 53 | "sigmaASA_20": 0.78, 54 | "sigmaASA_30": 0.83, 55 | "sigmaASA_40": 0.78, 56 | "sigmaASA_50": 0.77, 57 | "sigmaASA_60": 0.84, 58 | "sigmaASA_70": 0.64, 59 | "sigmaASA_80": 0.81, 60 | "sigmaASA_90": 0.65, 61 | 62 | "muZSA_10" : 0.82, 63 | "muZSA_20" : 0.47, 64 | "muZSA_30" : 0.80, 65 | "muZSA_40" : 1.23, 66 | "muZSA_50" : 1.42, 67 | "muZSA_60" : 1.56, 68 | "muZSA_70" : 1.65, 69 | "muZSA_80" : 1.73, 70 | "muZSA_90" : 1.79, 71 | 72 | "sigmaZSA_10": 0.05, 73 | "sigmaZSA_20": 0.11, 74 | "sigmaZSA_30": 0.05, 75 | "sigmaZSA_40": 0.04, 76 | "sigmaZSA_50": 0.10, 77 | "sigmaZSA_60": 0.06, 78 | "sigmaZSA_70": 0.07, 79 | "sigmaZSA_80": 0.02, 80 | "sigmaZSA_90": 0.01, 81 | 82 | "muZSD_10": -2.75, 83 | "muZSD_20": -2.64, 84 | "muZSD_30": -2.49, 85 | "muZSD_40": -2.51, 86 | "muZSD_50": -2.54, 87 | "muZSD_60": -2.71, 88 | "muZSD_70": -2.85, 89 | "muZSD_80": -3.01, 90 | "muZSD_90": -3.08, 91 | 92 | "sigmaZSD_10": 0.55, 93 | "sigmaZSD_20": 0.64, 94 | "sigmaZSD_30": 0.69, 95 | "sigmaZSD_40": 0.57, 96 | "sigmaZSD_50": 0.50, 97 | "sigmaZSD_60": 0.37, 98 | "sigmaZSD_70": 0.31, 99 | "sigmaZSD_80": 0.45, 100 | "sigmaZSD_90": 0.27, 101 | 102 | "sigmaSF_10": 2.9, 103 | "sigmaSF_20": 2.4, 104 | "sigmaSF_30": 2.7, 105 | "sigmaSF_40": 2.4, 106 | "sigmaSF_50": 2.4, 107 | "sigmaSF_60": 2.7, 108 | "sigmaSF_70": 2.6, 109 | "sigmaSF_80": 2.8, 110 | "sigmaSF_90": 0.6, 111 | 112 | "muK_10": 6.1, 113 | "muK_20": 13.7, 114 | "muK_30": 12.9, 115 | "muK_40": 10.3, 116 | "muK_50": 9.2, 117 | "muK_60": 8.4, 118 | "muK_70": 8.0, 119 | "muK_80": 7.4, 120 | "muK_90": 7.6, 121 | 122 | "sigmaK_10": 2.6, 123 | "sigmaK_20": 6.8, 124 | "sigmaK_30": 6.0, 125 | "sigmaK_40": 3.3, 126 | "sigmaK_50": 2.2, 127 | "sigmaK_60": 1.9, 128 | "sigmaK_70": 1.5, 129 | "sigmaK_80": 1.6, 130 | "sigmaK_90": 1.3, 131 | 132 | "muXPR_10": 24.7, 133 | "muXPR_20": 24.4, 134 | "muXPR_30": 24.4, 135 | "muXPR_40": 24.2, 136 | "muXPR_50": 23.9, 137 | "muXPR_60": 23.3, 138 | "muXPR_70": 22.6, 139 | "muXPR_80": 21.2, 140 | "muXPR_90": 17.6, 141 | 142 | "sigmaXPR_10": 2.1, 143 | "sigmaXPR_20": 2.8, 144 | "sigmaXPR_30": 2.7, 145 | "sigmaXPR_40": 2.7, 146 | "sigmaXPR_50": 3.1, 147 | "sigmaXPR_60": 3.9, 148 | "sigmaXPR_70": 4.8, 149 | "sigmaXPR_80": 6.8, 150 | "sigmaXPR_90": 12.7, 151 | 152 | "rTau_10" : 2.5, 153 | "rTau_20" : 2.5, 154 | "rTau_30" : 2.5, 155 | "rTau_40" : 2.5, 156 | "rTau_50" : 2.5, 157 | "rTau_60" : 2.5, 158 | "rTau_70" : 2.5, 159 | "rTau_80" : 2.5, 160 | "rTau_90" : 2.5, 161 | 162 | "numClusters_10" : 3, 163 | "numClusters_20" : 3, 164 | "numClusters_30" : 3, 165 | "numClusters_40" : 3, 166 | "numClusters_50" : 3, 167 | "numClusters_60" : 3, 168 | "numClusters_70" : 3, 169 | "numClusters_80" : 3, 170 | "numClusters_90" : 3, 171 | 172 | "zeta_10" : 3.0, 173 | "zeta_20" : 3.0, 174 | "zeta_30" : 3.0, 175 | "zeta_40" : 3.0, 176 | "zeta_50" : 3.0, 177 | "zeta_60" : 3.0, 178 | "zeta_70" : 3.0, 179 | "zeta_80" : 3.0, 180 | "zeta_90" : 3.0, 181 | 182 | "cDS_10": 1.6, 183 | "cDS_20": 1.6, 184 | "cDS_30": 1.6, 185 | "cDS_40": 1.6, 186 | "cDS_50": 1.6, 187 | "cDS_60": 1.6, 188 | "cDS_70": 1.6, 189 | "cDS_80": 1.6, 190 | "cDS_90": 1.6, 191 | 192 | "cASD_10": 0.0, 193 | "cASD_20": 0.0, 194 | "cASD_30": 0.0, 195 | "cASD_40": 0.0, 196 | "cASD_50": 0.0, 197 | "cASD_60": 0.0, 198 | "cASD_70": 0.0, 199 | "cASD_80": 0.0, 200 | "cASD_90": 0.0, 201 | 202 | "cASA_10" : 11.0, 203 | "cASA_20" : 11.0, 204 | "cASA_30" : 11.0, 205 | "cASA_40" : 11.0, 206 | "cASA_50" : 11.0, 207 | "cASA_60" : 11.0, 208 | "cASA_70" : 11.0, 209 | "cASA_80" : 11.0, 210 | "cASA_90" : 11.0, 211 | 212 | "cZSA_10" : 7.0, 213 | "cZSA_20" : 7.0, 214 | "cZSA_30" : 7.0, 215 | "cZSA_40" : 7.0, 216 | "cZSA_50" : 7.0, 217 | "cZSA_60" : 7.0, 218 | "cZSA_70" : 7.0, 219 | "cZSA_80" : 7.0, 220 | "cZSA_90" : 7.0, 221 | 222 | "LoS_p_10" : 0.282, 223 | "LoS_p_20" : 0.331, 224 | "LoS_p_30" : 0.398, 225 | "LoS_p_40" : 0.468, 226 | "LoS_p_50" : 0.537, 227 | "LoS_p_60" : 0.612, 228 | "LoS_p_70" : 0.738, 229 | "LoS_p_80" : 0.82, 230 | "LoS_p_90" : 0.981, 231 | 232 | "CPhiNLoS" : 0.680, 233 | "CThetaNLoS" : 0.594, 234 | 235 | "corrDistDS_10" : 30.0, 236 | "corrDistDS_20" : 30.0, 237 | "corrDistDS_30" : 30.0, 238 | "corrDistDS_40" : 30.0, 239 | "corrDistDS_50" : 30.0, 240 | "corrDistDS_60" : 30.0, 241 | "corrDistDS_70" : 30.0, 242 | "corrDistDS_80" : 30.0, 243 | "corrDistDS_90" : 30.0, 244 | 245 | "corrDistASD_10" : 18.0, 246 | "corrDistASD_20" : 18.0, 247 | "corrDistASD_30" : 18.0, 248 | "corrDistASD_40" : 18.0, 249 | "corrDistASD_50" : 18.0, 250 | "corrDistASD_60" : 18.0, 251 | "corrDistASD_70" : 18.0, 252 | "corrDistASD_80" : 18.0, 253 | "corrDistASD_90" : 18.0, 254 | 255 | "corrDistASA_10" : 15.0, 256 | "corrDistASA_20" : 15.0, 257 | "corrDistASA_30" : 15.0, 258 | "corrDistASA_40" : 15.0, 259 | "corrDistASA_50" : 15.0, 260 | "corrDistASA_60" : 15.0, 261 | "corrDistASA_70" : 15.0, 262 | "corrDistASA_80" : 15.0, 263 | "corrDistASA_90" : 15.0, 264 | 265 | "corrDistSF_10" : 37.0, 266 | "corrDistSF_20" : 37.0, 267 | "corrDistSF_30" : 37.0, 268 | "corrDistSF_40" : 37.0, 269 | "corrDistSF_50" : 37.0, 270 | "corrDistSF_60" : 37.0, 271 | "corrDistSF_70" : 37.0, 272 | "corrDistSF_80" : 37.0, 273 | "corrDistSF_90" : 37.0, 274 | 275 | "corrDistK_10" : 12.0, 276 | "corrDistK_20" : 12.0, 277 | "corrDistK_30" : 12.0, 278 | "corrDistK_40" : 12.0, 279 | "corrDistK_50" : 12.0, 280 | "corrDistK_60" : 12.0, 281 | "corrDistK_70" : 12.0, 282 | "corrDistK_80" : 12.0, 283 | "corrDistK_90" : 12.0, 284 | 285 | "corrDistZSA_10" : 15.0, 286 | "corrDistZSA_20" : 15.0, 287 | "corrDistZSA_30" : 15.0, 288 | "corrDistZSA_40" : 15.0, 289 | "corrDistZSA_50" : 15.0, 290 | "corrDistZSA_60" : 15.0, 291 | "corrDistZSA_70" : 15.0, 292 | "corrDistZSA_80" : 15.0, 293 | "corrDistZSA_90" : 15.0, 294 | 295 | "corrDistZSD_10" : 15.0, 296 | "corrDistZSD_20" : 15.0, 297 | "corrDistZSD_30" : 15.0, 298 | "corrDistZSD_40" : 15.0, 299 | "corrDistZSD_50" : 15.0, 300 | "corrDistZSD_60" : 15.0, 301 | "corrDistZSD_70" : 15.0, 302 | "corrDistZSD_80" : 15.0, 303 | "corrDistZSD_90" : 15.0, 304 | 305 | "corrASDvsDS_10" : 0.4, 306 | "corrASDvsDS_20" : 0.4, 307 | "corrASDvsDS_30" : 0.4, 308 | "corrASDvsDS_40" : 0.4, 309 | "corrASDvsDS_50" : 0.4, 310 | "corrASDvsDS_60" : 0.4, 311 | "corrASDvsDS_70" : 0.4, 312 | "corrASDvsDS_80" : 0.4, 313 | "corrASDvsDS_90" : 0.4, 314 | 315 | 316 | "corrASAvsDS_10" : 0.8, 317 | "corrASAvsDS_20" : 0.8, 318 | "corrASAvsDS_30" : 0.8, 319 | "corrASAvsDS_40" : 0.8, 320 | "corrASAvsDS_50" : 0.8, 321 | "corrASAvsDS_60" : 0.8, 322 | "corrASAvsDS_70" : 0.8, 323 | "corrASAvsDS_80" : 0.8, 324 | "corrASAvsDS_90" : 0.8, 325 | 326 | "corrASAvsSF_10" : -0.5, 327 | "corrASAvsSF_20" : -0.5, 328 | "corrASAvsSF_30" : -0.5, 329 | "corrASAvsSF_40" : -0.5, 330 | "corrASAvsSF_50" : -0.5, 331 | "corrASAvsSF_60" : -0.5, 332 | "corrASAvsSF_70" : -0.5, 333 | "corrASAvsSF_80" : -0.5, 334 | "corrASAvsSF_90" : -0.5, 335 | 336 | "corrASDvsSF_10" : -0.5, 337 | "corrASDvsSF_20" : -0.5, 338 | "corrASDvsSF_30" : -0.5, 339 | "corrASDvsSF_40" : -0.5, 340 | "corrASDvsSF_50" : -0.5, 341 | "corrASDvsSF_60" : -0.5, 342 | "corrASDvsSF_70" : -0.5, 343 | "corrASDvsSF_80" : -0.5, 344 | "corrASDvsSF_90" : -0.5, 345 | 346 | "corrDSvsSF_10" : -0.4, 347 | "corrDSvsSF_20" : -0.4, 348 | "corrDSvsSF_30" : -0.4, 349 | "corrDSvsSF_40" : -0.4, 350 | "corrDSvsSF_50" : -0.4, 351 | "corrDSvsSF_60" : -0.4, 352 | "corrDSvsSF_70" : -0.4, 353 | "corrDSvsSF_80" : -0.4, 354 | "corrDSvsSF_90" : -0.4, 355 | 356 | "corrASDvsASA_10" : 0.0, 357 | "corrASDvsASA_20" : 0.0, 358 | "corrASDvsASA_30" : 0.0, 359 | "corrASDvsASA_40" : 0.0, 360 | "corrASDvsASA_50" : 0.0, 361 | "corrASDvsASA_60" : 0.0, 362 | "corrASDvsASA_70" : 0.0, 363 | "corrASDvsASA_80" : 0.0, 364 | "corrASDvsASA_90" : 0.0, 365 | 366 | "corrASDvsK_10" : 0.0, 367 | "corrASDvsK_20" : 0.0, 368 | "corrASDvsK_30" : 0.0, 369 | "corrASDvsK_40" : 0.0, 370 | "corrASDvsK_50" : 0.0, 371 | "corrASDvsK_60" : 0.0, 372 | "corrASDvsK_70" : 0.0, 373 | "corrASDvsK_80" : 0.0, 374 | "corrASDvsK_90" : 0.0, 375 | 376 | "corrASAvsK_10" : -0.2, 377 | "corrASAvsK_20" : -0.2, 378 | "corrASAvsK_30" : -0.2, 379 | "corrASAvsK_40" : -0.2, 380 | "corrASAvsK_50" : -0.2, 381 | "corrASAvsK_60" : -0.2, 382 | "corrASAvsK_70" : -0.2, 383 | "corrASAvsK_80" : -0.2, 384 | "corrASAvsK_90" : -0.2, 385 | 386 | 387 | "corrDSvsK_10" : -0.4, 388 | "corrDSvsK_20" : -0.4, 389 | "corrDSvsK_30" : -0.4, 390 | "corrDSvsK_40" : -0.4, 391 | "corrDSvsK_50" : -0.4, 392 | "corrDSvsK_60" : -0.4, 393 | "corrDSvsK_70" : -0.4, 394 | "corrDSvsK_80" : -0.4, 395 | "corrDSvsK_90" : -0.4, 396 | 397 | "corrSFvsK_10" : 0.0, 398 | "corrSFvsK_20" : 0.0, 399 | "corrSFvsK_30" : 0.0, 400 | "corrSFvsK_40" : 0.0, 401 | "corrSFvsK_50" : 0.0, 402 | "corrSFvsK_60" : 0.0, 403 | "corrSFvsK_70" : 0.0, 404 | "corrSFvsK_80" : 0.0, 405 | "corrSFvsK_90" : 0.0, 406 | 407 | "corrZSDvsSF_10" : 0.0, 408 | "corrZSDvsSF_20" : 0.0, 409 | "corrZSDvsSF_30" : 0.0, 410 | "corrZSDvsSF_40" : 0.0, 411 | "corrZSDvsSF_50" : 0.0, 412 | "corrZSDvsSF_60" : 0.0, 413 | "corrZSDvsSF_70" : 0.0, 414 | "corrZSDvsSF_80" : 0.0, 415 | "corrZSDvsSF_90" : 0.0, 416 | 417 | 418 | "corrZSAvsSF_10" : -0.8, 419 | "corrZSAvsSF_20" : -0.8, 420 | "corrZSAvsSF_30" : -0.8, 421 | "corrZSAvsSF_40" : -0.8, 422 | "corrZSAvsSF_50" : -0.8, 423 | "corrZSAvsSF_60" : -0.8, 424 | "corrZSAvsSF_70" : -0.8, 425 | "corrZSAvsSF_80" : -0.8, 426 | "corrZSAvsSF_90" : -0.8, 427 | 428 | "corrZSDvsK_10" : 0.0, 429 | "corrZSDvsK_20" : 0.0, 430 | "corrZSDvsK_30" : 0.0, 431 | "corrZSDvsK_40" : 0.0, 432 | "corrZSDvsK_50" : 0.0, 433 | "corrZSDvsK_60" : 0.0, 434 | "corrZSDvsK_70" : 0.0, 435 | "corrZSDvsK_80" : 0.0, 436 | "corrZSDvsK_90" : 0.0, 437 | 438 | "corrZSAvsK_10" : 0.0, 439 | "corrZSAvsK_20" : 0.0, 440 | "corrZSAvsK_30" : 0.0, 441 | "corrZSAvsK_40" : 0.0, 442 | "corrZSAvsK_50" : 0.0, 443 | "corrZSAvsK_60" : 0.0, 444 | "corrZSAvsK_70" : 0.0, 445 | "corrZSAvsK_80" : 0.0, 446 | "corrZSAvsK_90" : 0.0, 447 | 448 | "corrZSDvsDS_10" : -0.2, 449 | "corrZSDvsDS_20" : -0.2, 450 | "corrZSDvsDS_30" : -0.2, 451 | "corrZSDvsDS_40" : -0.2, 452 | "corrZSDvsDS_50" : -0.2, 453 | "corrZSDvsDS_60" : -0.2, 454 | "corrZSDvsDS_70" : -0.2, 455 | "corrZSDvsDS_80" : -0.2, 456 | "corrZSDvsDS_90" : -0.2, 457 | 458 | "corrZSAvsDS_10" : 0.0, 459 | "corrZSAvsDS_20" : 0.0, 460 | "corrZSAvsDS_30" : 0.0, 461 | "corrZSAvsDS_40" : 0.0, 462 | "corrZSAvsDS_50" : 0.0, 463 | "corrZSAvsDS_60" : 0.0, 464 | "corrZSAvsDS_70" : 0.0, 465 | "corrZSAvsDS_80" : 0.0, 466 | "corrZSAvsDS_90" : 0.0, 467 | 468 | "corrZSDvsASD_10" : 0.5, 469 | "corrZSDvsASD_20" : 0.5, 470 | "corrZSDvsASD_30" : 0.5, 471 | "corrZSDvsASD_40" : 0.5, 472 | "corrZSDvsASD_50" : 0.5, 473 | "corrZSDvsASD_60" : 0.5, 474 | "corrZSDvsASD_70" : 0.5, 475 | "corrZSDvsASD_80" : 0.5, 476 | "corrZSDvsASD_90" : 0.5, 477 | 478 | "corrZSAvsASD_10" : 0.0, 479 | "corrZSAvsASD_20" : 0.0, 480 | "corrZSAvsASD_30" : 0.0, 481 | "corrZSAvsASD_40" : 0.0, 482 | "corrZSAvsASD_50" : 0.0, 483 | "corrZSAvsASD_60" : 0.0, 484 | "corrZSAvsASD_70" : 0.0, 485 | "corrZSAvsASD_80" : 0.0, 486 | "corrZSAvsASD_90" : 0.0, 487 | 488 | "corrZSDvsASA_10" : -0.3, 489 | "corrZSDvsASA_20" : -0.3, 490 | "corrZSDvsASA_30" : -0.3, 491 | "corrZSDvsASA_40" : -0.3, 492 | "corrZSDvsASA_50" : -0.3, 493 | "corrZSDvsASA_60" : -0.3, 494 | "corrZSDvsASA_70" : -0.3, 495 | "corrZSDvsASA_80" : -0.3, 496 | "corrZSDvsASA_90" : -0.3, 497 | 498 | 499 | "corrZSAvsASA_10" : 0.4, 500 | "corrZSAvsASA_20" : 0.4, 501 | "corrZSAvsASA_30" : 0.4, 502 | "corrZSAvsASA_40" : 0.4, 503 | "corrZSAvsASA_50" : 0.4, 504 | "corrZSAvsASA_60" : 0.4, 505 | "corrZSAvsASA_70" : 0.4, 506 | "corrZSAvsASA_80" : 0.4, 507 | "corrZSAvsASA_90" : 0.4, 508 | 509 | 510 | "corrZSDvsZSA_10" : 0.0, 511 | "corrZSDvsZSA_20" : 0.0, 512 | "corrZSDvsZSA_30" : 0.0, 513 | "corrZSDvsZSA_40" : 0.0, 514 | "corrZSDvsZSA_50" : 0.0, 515 | "corrZSDvsZSA_60" : 0.0, 516 | "corrZSDvsZSA_70" : 0.0, 517 | "corrZSDvsZSA_80" : 0.0, 518 | "corrZSDvsZSA_90" : 0.0 519 | 520 | } -------------------------------------------------------------------------------- /OpenNTN/models/Sub_Urban_LOS_Ka_band_DL.json: -------------------------------------------------------------------------------- 1 | { 2 | "muDS_10": -8.07, 3 | "muDS_20": -8.61, 4 | "muDS_30": -8.72, 5 | "muDS_40": -8.63, 6 | "muDS_50": -8.54, 7 | "muDS_60": -8.48, 8 | "muDS_70": -8.42, 9 | "muDS_80": -8.39, 10 | "muDS_90": -8.37, 11 | 12 | "sigmaDS_10": 0.46, 13 | "sigmaDS_20": 0.45, 14 | "sigmaDS_30": 0.28, 15 | "sigmaDS_40": 0.17, 16 | "sigmaDS_50": 0.14, 17 | "sigmaDS_60": 0.15, 18 | "sigmaDS_70": 0.09, 19 | "sigmaDS_80": 0.05, 20 | "sigmaDS_90": 0.02, 21 | 22 | "muASD_10": "-inf", 23 | "muASD_20": "-inf", 24 | "muASD_30": "-inf", 25 | "muASD_40": "-inf", 26 | "muASD_50": "-inf", 27 | "muASD_60": "-inf", 28 | "muASD_70": "-inf", 29 | "muASD_80": "-inf", 30 | "muASD_90": "-inf", 31 | 32 | "sigmaASD_10": 0.0, 33 | "sigmaASD_20": 0.0, 34 | "sigmaASD_30": 0.0, 35 | "sigmaASD_40": 0.0, 36 | "sigmaASD_50": 0.0, 37 | "sigmaASD_60": 0.0, 38 | "sigmaASD_70": 0.0, 39 | "sigmaASD_80": 0.0, 40 | "sigmaASD_90": 0.0, 41 | 42 | "muASA_10": 0.89, 43 | "muASA_20": 0.31, 44 | "muASA_30": 0.02, 45 | "muASA_40": -0.10, 46 | "muASA_50": -0.19, 47 | "muASA_60": -0.54, 48 | "muASA_70": -0.24, 49 | "muASA_80": -0.52, 50 | "muASA_90": -0.15, 51 | 52 | "sigmaASA_10": 0.67, 53 | "sigmaASA_20": 0.78, 54 | "sigmaASA_30": 0.75, 55 | "sigmaASA_40": 0.65, 56 | "sigmaASA_50": 0.55, 57 | "sigmaASA_60": 0.96, 58 | "sigmaASA_70": 0.43, 59 | "sigmaASA_80": 0.93, 60 | "sigmaASA_90": 0.44, 61 | 62 | "muZSA_10" : 0.63, 63 | "muZSA_20" : 0.76, 64 | "muZSA_30" : 1.11, 65 | "muZSA_40" : 1.37, 66 | "muZSA_50" : 1.53, 67 | "muZSA_60" : 1.65, 68 | "muZSA_70" : 1.74, 69 | "muZSA_80" : 1.82, 70 | "muZSA_90" : 1.87, 71 | 72 | "sigmaZSA_10": 0.35, 73 | "sigmaZSA_20": 0.30, 74 | "sigmaZSA_30": 0.28, 75 | "sigmaZSA_40": 0.23, 76 | "sigmaZSA_50": 0.23, 77 | "sigmaZSA_60": 0.17, 78 | "sigmaZSA_70": 0.11, 79 | "sigmaZSA_80": 0.05, 80 | "sigmaZSA_90": 0.02, 81 | 82 | "muZSD_10": "-inf", 83 | "muZSD_20": "-inf", 84 | "muZSD_30": "-inf", 85 | "muZSD_40": "-inf", 86 | "muZSD_50": "-inf", 87 | "muZSD_60": "-inf", 88 | "muZSD_70": "-inf", 89 | "muZSD_80": "-inf", 90 | "muZSD_90": "-inf", 91 | 92 | "sigmaZSD_10": 0.0, 93 | "sigmaZSD_20": 0.0, 94 | "sigmaZSD_30": 0.0, 95 | "sigmaZSD_40": 0.0, 96 | "sigmaZSD_50": 0.0, 97 | "sigmaZSD_60": 0.0, 98 | "sigmaZSD_70": 0.0, 99 | "sigmaZSD_80": 0.0, 100 | "sigmaZSD_90": 0.0, 101 | 102 | 103 | "sigmaSF_10": 1.9, 104 | "sigmaSF_20": 1.6, 105 | "sigmaSF_30": 1.9, 106 | "sigmaSF_40": 2.3, 107 | "sigmaSF_50": 2.7, 108 | "sigmaSF_60": 3.1, 109 | "sigmaSF_70": 3.0, 110 | "sigmaSF_80": 3.6, 111 | "sigmaSF_90": 0.4, 112 | 113 | "muK_10": 8.90, 114 | "muK_20": 14.00, 115 | "muK_30": 11.30, 116 | "muK_40": 9.00, 117 | "muK_50": 7.50, 118 | "muK_60": 6.60, 119 | "muK_70": 5.90, 120 | "muK_80": 5.50, 121 | "muK_90": 5.40, 122 | 123 | "sigmaK_10": 4.40, 124 | "sigmaK_20": 4.60, 125 | "sigmaK_30": 3.70, 126 | "sigmaK_40": 3.50, 127 | "sigmaK_50": 3.00, 128 | "sigmaK_60": 2.60, 129 | "sigmaK_70": 1.70, 130 | "sigmaK_80": 0.70, 131 | "sigmaK_90": 0.30, 132 | 133 | "muXPR_10": 23.2, 134 | "muXPR_20": 23.6, 135 | "muXPR_30": 23.5, 136 | "muXPR_40": 23.4, 137 | "muXPR_50": 23.2, 138 | "muXPR_60": 23.3, 139 | "muXPR_70": 23.4, 140 | "muXPR_80": 23.2, 141 | "muXPR_90": 23.1, 142 | 143 | "sigmaXPR_10": 5.0, 144 | "sigmaXPR_20": 4.5, 145 | "sigmaXPR_30": 4.7, 146 | "sigmaXPR_40": 5.2, 147 | "sigmaXPR_50": 5.7, 148 | "sigmaXPR_60": 5.9, 149 | "sigmaXPR_70": 6.2, 150 | "sigmaXPR_80": 7.0, 151 | "sigmaXPR_90": 7.6, 152 | 153 | "rTau_10" : 2.5, 154 | "rTau_20" : 2.5, 155 | "rTau_30" : 2.5, 156 | "rTau_40" : 2.5, 157 | "rTau_50" : 2.5, 158 | "rTau_60" : 2.5, 159 | "rTau_70" : 2.5, 160 | "rTau_80" : 2.5, 161 | "rTau_90" : 2.5, 162 | 163 | "numClusters_10" : 3, 164 | "numClusters_20" : 3, 165 | "numClusters_30" : 3, 166 | "numClusters_40" : 3, 167 | "numClusters_50" : 3, 168 | "numClusters_60" : 3, 169 | "numClusters_70" : 2, 170 | "numClusters_80" : 2, 171 | "numClusters_90" : 2, 172 | 173 | "zeta_10" : 3.0, 174 | "zeta_20" : 3.0, 175 | "zeta_30" : 3.0, 176 | "zeta_40" : 3.0, 177 | "zeta_50" : 3.0, 178 | "zeta_60" : 3.0, 179 | "zeta_70" : 3.0, 180 | "zeta_80" : 3.0, 181 | "zeta_90" : 3.0, 182 | 183 | "cDS_10": 1.6, 184 | "cDS_20": 1.6, 185 | "cDS_30": 1.6, 186 | "cDS_40": 1.6, 187 | "cDS_50": 1.6, 188 | "cDS_60": 1.6, 189 | "cDS_70": 1.6, 190 | "cDS_80": 1.6, 191 | "cDS_90": 1.6, 192 | 193 | "cASD_10": 0.0, 194 | "cASD_20": 0.0, 195 | "cASD_30": 0.0, 196 | "cASD_40": 0.0, 197 | "cASD_50": 0.0, 198 | "cASD_60": 0.0, 199 | "cASD_70": 0.0, 200 | "cASD_80": 0.0, 201 | "cASD_90": 0.0, 202 | 203 | "cASA_10" : 11.0, 204 | "cASA_20" : 11.0, 205 | "cASA_30" : 11.0, 206 | "cASA_40" : 11.0, 207 | "cASA_50" : 11.0, 208 | "cASA_60" : 11.0, 209 | "cASA_70" : 11.0, 210 | "cASA_80" : 11.0, 211 | "cASA_90" : 11.0, 212 | 213 | "cZSA_10" : 7.0, 214 | "cZSA_20" : 7.0, 215 | "cZSA_30" : 7.0, 216 | "cZSA_40" : 7.0, 217 | "cZSA_50" : 7.0, 218 | "cZSA_60" : 7.0, 219 | "cZSA_70" : 7.0, 220 | "cZSA_80" : 7.0, 221 | "cZSA_90" : 7.0, 222 | 223 | "LoS_p_10" : 0.782, 224 | "LoS_p_20" : 0.869, 225 | "LoS_p_30" : 0.919, 226 | "LoS_p_40" : 0.929, 227 | "LoS_p_50" : 0.935, 228 | "LoS_p_60" : 0.94, 229 | "LoS_p_70" : 0.949, 230 | "LoS_p_80" : 0.952, 231 | "LoS_p_90" : 0.998, 232 | 233 | "CPhiNLoS" : 0.680, 234 | "CThetaNLoS" : 0.594, 235 | 236 | "corrDistDS_10" : 30.0, 237 | "corrDistDS_20" : 30.0, 238 | "corrDistDS_30" : 30.0, 239 | "corrDistDS_40" : 30.0, 240 | "corrDistDS_50" : 30.0, 241 | "corrDistDS_60" : 30.0, 242 | "corrDistDS_70" : 30.0, 243 | "corrDistDS_80" : 30.0, 244 | "corrDistDS_90" : 30.0, 245 | 246 | "corrDistASD_10" : 18.0, 247 | "corrDistASD_20" : 18.0, 248 | "corrDistASD_30" : 18.0, 249 | "corrDistASD_40" : 18.0, 250 | "corrDistASD_50" : 18.0, 251 | "corrDistASD_60" : 18.0, 252 | "corrDistASD_70" : 18.0, 253 | "corrDistASD_80" : 18.0, 254 | "corrDistASD_90" : 18.0, 255 | 256 | "corrDistASA_10" : 15.0, 257 | "corrDistASA_20" : 15.0, 258 | "corrDistASA_30" : 15.0, 259 | "corrDistASA_40" : 15.0, 260 | "corrDistASA_50" : 15.0, 261 | "corrDistASA_60" : 15.0, 262 | "corrDistASA_70" : 15.0, 263 | "corrDistASA_80" : 15.0, 264 | "corrDistASA_90" : 15.0, 265 | 266 | "corrDistSF_10" : 37.0, 267 | "corrDistSF_20" : 37.0, 268 | "corrDistSF_30" : 37.0, 269 | "corrDistSF_40" : 37.0, 270 | "corrDistSF_50" : 37.0, 271 | "corrDistSF_60" : 37.0, 272 | "corrDistSF_70" : 37.0, 273 | "corrDistSF_80" : 37.0, 274 | "corrDistSF_90" : 37.0, 275 | 276 | "corrDistK_10" : 12.0, 277 | "corrDistK_20" : 12.0, 278 | "corrDistK_30" : 12.0, 279 | "corrDistK_40" : 12.0, 280 | "corrDistK_50" : 12.0, 281 | "corrDistK_60" : 12.0, 282 | "corrDistK_70" : 12.0, 283 | "corrDistK_80" : 12.0, 284 | "corrDistK_90" : 12.0, 285 | 286 | "corrDistZSA_10" : 15.0, 287 | "corrDistZSA_20" : 15.0, 288 | "corrDistZSA_30" : 15.0, 289 | "corrDistZSA_40" : 15.0, 290 | "corrDistZSA_50" : 15.0, 291 | "corrDistZSA_60" : 15.0, 292 | "corrDistZSA_70" : 15.0, 293 | "corrDistZSA_80" : 15.0, 294 | "corrDistZSA_90" : 15.0, 295 | 296 | "corrDistZSD_10" : 15.0, 297 | "corrDistZSD_20" : 15.0, 298 | "corrDistZSD_30" : 15.0, 299 | "corrDistZSD_40" : 15.0, 300 | "corrDistZSD_50" : 15.0, 301 | "corrDistZSD_60" : 15.0, 302 | "corrDistZSD_70" : 15.0, 303 | "corrDistZSD_80" : 15.0, 304 | "corrDistZSD_90" : 15.0, 305 | 306 | "corrASDvsDS_10" : 0.0, 307 | "corrASDvsDS_20" : 0.0, 308 | "corrASDvsDS_30" : 0.0, 309 | "corrASDvsDS_40" : 0.0, 310 | "corrASDvsDS_50" : 0.0, 311 | "corrASDvsDS_60" : 0.0, 312 | "corrASDvsDS_70" : 0.0, 313 | "corrASDvsDS_80" : 0.0, 314 | "corrASDvsDS_90" : 0.0, 315 | 316 | 317 | "corrASAvsDS_10" : 0.8, 318 | "corrASAvsDS_20" : 0.8, 319 | "corrASAvsDS_30" : 0.8, 320 | "corrASAvsDS_40" : 0.8, 321 | "corrASAvsDS_50" : 0.8, 322 | "corrASAvsDS_60" : 0.8, 323 | "corrASAvsDS_70" : 0.8, 324 | "corrASAvsDS_80" : 0.8, 325 | "corrASAvsDS_90" : 0.8, 326 | 327 | "corrASAvsSF_10" : -0.5, 328 | "corrASAvsSF_20" : -0.5, 329 | "corrASAvsSF_30" : -0.5, 330 | "corrASAvsSF_40" : -0.5, 331 | "corrASAvsSF_50" : -0.5, 332 | "corrASAvsSF_60" : -0.5, 333 | "corrASAvsSF_70" : -0.5, 334 | "corrASAvsSF_80" : -0.5, 335 | "corrASAvsSF_90" : -0.5, 336 | 337 | "corrASDvsSF_10" : 0.0, 338 | "corrASDvsSF_20" : 0.0, 339 | "corrASDvsSF_30" : 0.0, 340 | "corrASDvsSF_40" : 0.0, 341 | "corrASDvsSF_50" : 0.0, 342 | "corrASDvsSF_60" : 0.0, 343 | "corrASDvsSF_70" : 0.0, 344 | "corrASDvsSF_80" : 0.0, 345 | "corrASDvsSF_90" : 0.0, 346 | 347 | "corrDSvsSF_10" : -0.4, 348 | "corrDSvsSF_20" : -0.4, 349 | "corrDSvsSF_30" : -0.4, 350 | "corrDSvsSF_40" : -0.4, 351 | "corrDSvsSF_50" : -0.4, 352 | "corrDSvsSF_60" : -0.4, 353 | "corrDSvsSF_70" : -0.4, 354 | "corrDSvsSF_80" : -0.4, 355 | "corrDSvsSF_90" : -0.4, 356 | 357 | "corrASDvsASA_10" : 0.0, 358 | "corrASDvsASA_20" : 0.0, 359 | "corrASDvsASA_30" : 0.0, 360 | "corrASDvsASA_40" : 0.0, 361 | "corrASDvsASA_50" : 0.0, 362 | "corrASDvsASA_60" : 0.0, 363 | "corrASDvsASA_70" : 0.0, 364 | "corrASDvsASA_80" : 0.0, 365 | "corrASDvsASA_90" : 0.0, 366 | 367 | "corrASDvsK_10" : 0.0, 368 | "corrASDvsK_20" : 0.0, 369 | "corrASDvsK_30" : 0.0, 370 | "corrASDvsK_40" : 0.0, 371 | "corrASDvsK_50" : 0.0, 372 | "corrASDvsK_60" : 0.0, 373 | "corrASDvsK_70" : 0.0, 374 | "corrASDvsK_80" : 0.0, 375 | "corrASDvsK_90" : 0.0, 376 | 377 | "corrASAvsK_10" : -0.2, 378 | "corrASAvsK_20" : -0.2, 379 | "corrASAvsK_30" : -0.2, 380 | "corrASAvsK_40" : -0.2, 381 | "corrASAvsK_50" : -0.2, 382 | "corrASAvsK_60" : -0.2, 383 | "corrASAvsK_70" : -0.2, 384 | "corrASAvsK_80" : -0.2, 385 | "corrASAvsK_90" : -0.2, 386 | 387 | 388 | "corrDSvsK_10" : -0.4, 389 | "corrDSvsK_20" : -0.4, 390 | "corrDSvsK_30" : -0.4, 391 | "corrDSvsK_40" : -0.4, 392 | "corrDSvsK_50" : -0.4, 393 | "corrDSvsK_60" : -0.4, 394 | "corrDSvsK_70" : -0.4, 395 | "corrDSvsK_80" : -0.4, 396 | "corrDSvsK_90" : -0.4, 397 | 398 | "corrSFvsK_10" : 0.0, 399 | "corrSFvsK_20" : 0.0, 400 | "corrSFvsK_30" : 0.0, 401 | "corrSFvsK_40" : 0.0, 402 | "corrSFvsK_50" : 0.0, 403 | "corrSFvsK_60" : 0.0, 404 | "corrSFvsK_70" : 0.0, 405 | "corrSFvsK_80" : 0.0, 406 | "corrSFvsK_90" : 0.0, 407 | 408 | "corrZSDvsSF_10" : 0.0, 409 | "corrZSDvsSF_20" : 0.0, 410 | "corrZSDvsSF_30" : 0.0, 411 | "corrZSDvsSF_40" : 0.0, 412 | "corrZSDvsSF_50" : 0.0, 413 | "corrZSDvsSF_60" : 0.0, 414 | "corrZSDvsSF_70" : 0.0, 415 | "corrZSDvsSF_80" : 0.0, 416 | "corrZSDvsSF_90" : 0.0, 417 | 418 | 419 | "corrZSAvsSF_10" : -0.8, 420 | "corrZSAvsSF_20" : -0.8, 421 | "corrZSAvsSF_30" : -0.8, 422 | "corrZSAvsSF_40" : -0.8, 423 | "corrZSAvsSF_50" : -0.8, 424 | "corrZSAvsSF_60" : -0.8, 425 | "corrZSAvsSF_70" : -0.8, 426 | "corrZSAvsSF_80" : -0.8, 427 | "corrZSAvsSF_90" : -0.8, 428 | 429 | "corrZSDvsK_10" : 0.0, 430 | "corrZSDvsK_20" : 0.0, 431 | "corrZSDvsK_30" : 0.0, 432 | "corrZSDvsK_40" : 0.0, 433 | "corrZSDvsK_50" : 0.0, 434 | "corrZSDvsK_60" : 0.0, 435 | "corrZSDvsK_70" : 0.0, 436 | "corrZSDvsK_80" : 0.0, 437 | "corrZSDvsK_90" : 0.0, 438 | 439 | "corrZSAvsK_10" : 0.0, 440 | "corrZSAvsK_20" : 0.0, 441 | "corrZSAvsK_30" : 0.0, 442 | "corrZSAvsK_40" : 0.0, 443 | "corrZSAvsK_50" : 0.0, 444 | "corrZSAvsK_60" : 0.0, 445 | "corrZSAvsK_70" : 0.0, 446 | "corrZSAvsK_80" : 0.0, 447 | "corrZSAvsK_90" : 0.0, 448 | 449 | "corrZSDvsDS_10" : 0.0, 450 | "corrZSDvsDS_20" : 0.0, 451 | "corrZSDvsDS_30" : 0.0, 452 | "corrZSDvsDS_40" : 0.0, 453 | "corrZSDvsDS_50" : 0.0, 454 | "corrZSDvsDS_60" : 0.0, 455 | "corrZSDvsDS_70" : 0.0, 456 | "corrZSDvsDS_80" : 0.0, 457 | "corrZSDvsDS_90" : 0.0, 458 | 459 | "corrZSAvsDS_10" : 0.0, 460 | "corrZSAvsDS_20" : 0.0, 461 | "corrZSAvsDS_30" : 0.0, 462 | "corrZSAvsDS_40" : 0.0, 463 | "corrZSAvsDS_50" : 0.0, 464 | "corrZSAvsDS_60" : 0.0, 465 | "corrZSAvsDS_70" : 0.0, 466 | "corrZSAvsDS_80" : 0.0, 467 | "corrZSAvsDS_90" : 0.0, 468 | 469 | "corrZSDvsASD_10" : 0.0, 470 | "corrZSDvsASD_20" : 0.0, 471 | "corrZSDvsASD_30" : 0.0, 472 | "corrZSDvsASD_40" : 0.0, 473 | "corrZSDvsASD_50" : 0.0, 474 | "corrZSDvsASD_60" : 0.0, 475 | "corrZSDvsASD_70" : 0.0, 476 | "corrZSDvsASD_80" : 0.0, 477 | "corrZSDvsASD_90" : 0.0, 478 | 479 | "corrZSAvsASD_10" : 0.0, 480 | "corrZSAvsASD_20" : 0.0, 481 | "corrZSAvsASD_30" : 0.0, 482 | "corrZSAvsASD_40" : 0.0, 483 | "corrZSAvsASD_50" : 0.0, 484 | "corrZSAvsASD_60" : 0.0, 485 | "corrZSAvsASD_70" : 0.0, 486 | "corrZSAvsASD_80" : 0.0, 487 | "corrZSAvsASD_90" : 0.0, 488 | 489 | "corrZSDvsASA_10" : 0.0, 490 | "corrZSDvsASA_20" : 0.0, 491 | "corrZSDvsASA_30" : 0.0, 492 | "corrZSDvsASA_40" : 0.0, 493 | "corrZSDvsASA_50" : 0.0, 494 | "corrZSDvsASA_60" : 0.0, 495 | "corrZSDvsASA_70" : 0.0, 496 | "corrZSDvsASA_80" : 0.0, 497 | "corrZSDvsASA_90" : 0.0, 498 | 499 | 500 | "corrZSAvsASA_10" : 0.4, 501 | "corrZSAvsASA_20" : 0.4, 502 | "corrZSAvsASA_30" : 0.4, 503 | "corrZSAvsASA_40" : 0.4, 504 | "corrZSAvsASA_50" : 0.4, 505 | "corrZSAvsASA_60" : 0.4, 506 | "corrZSAvsASA_70" : 0.4, 507 | "corrZSAvsASA_80" : 0.4, 508 | "corrZSAvsASA_90" : 0.4, 509 | 510 | 511 | "corrZSDvsZSA_10" : 0.0, 512 | "corrZSDvsZSA_20" : 0.0, 513 | "corrZSDvsZSA_30" : 0.0, 514 | "corrZSDvsZSA_40" : 0.0, 515 | "corrZSDvsZSA_50" : 0.0, 516 | "corrZSDvsZSA_60" : 0.0, 517 | "corrZSDvsZSA_70" : 0.0, 518 | "corrZSDvsZSA_80" : 0.0, 519 | "corrZSDvsZSA_90" : 0.0 520 | 521 | } --------------------------------------------------------------------------------