├── 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 | }
--------------------------------------------------------------------------------