Skip to content

Commit 0a4a22e

Browse files
gmarcusmjhoydisfaycalaaSebastianCamerlinND
committed
Release v0.18.0
Signed-off-by: The Sionna Team <[email protected]> Merged-by: Guillermo Marcus <[email protected]> Co-authored-by: Jakob Hoydis <[email protected]> Co-authored-by: Fayçal Ait-Aoudia <[email protected]> Co-authored-by: Sebastian Cammerer <[email protected]> Co-authored-by: Guillermo Marcus <[email protected]> Co-authored-by: Merlin Nimier-David <[email protected]> Co-authored-by: Florian Euchner <[email protected]> Co-authored-by: Ainur Ziganshin <[email protected]>
1 parent 1438bbf commit 0a4a22e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

47 files changed

+5466
-374
lines changed

DOCKERFILE

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
FROM tensorflow/tensorflow:2.13.0-gpu-jupyter
1+
FROM tensorflow/tensorflow:2.15.0-gpu-jupyter
22
EXPOSE 8888
33
COPY . /tmp/
44
WORKDIR /tmp/
55
RUN make install
6-
RUN apt-get install llvm -y
6+
RUN apt-get update && \
7+
apt-get install llvm -y && \
8+
rm -rf /var/lib/apt/lists/* && \
9+
rm -rf /var/cache/apt/
710
RUN pip install --upgrade ipykernel
811
RUN pip install --upgrade jupyterlab
912
RUN rm -R /tf/* && cp /tmp/examples/* /tf

Makefile

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ lint:
1717
pylint sionna/
1818

1919
run-docker:
20-
docker run -u $(id -u):$(id -g) -p 8888:8888 --privileged=true $(GPU) --env NVIDIA_DRIVER_CAPABILITIES=graphics,compute,utility --rm -it sionna
20+
docker run -p 8888:8888 --privileged=true $(GPU) --env NVIDIA_DRIVER_CAPABILITIES=graphics,compute,utility --rm -it sionna
2121

2222
test: FORCE
2323
cd test && pytest

README.md

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ In order to run the tutorial notebooks on your machine, you also need [JupyterLa
1515
You can alternatively test them on [Google Colab](https://colab.research.google.com/).
1616
Although not necessary, we recommend running Sionna in a [Docker container](https://www.docker.com).
1717

18-
Sionna requires [TensorFlow 2.10-2.15](https://www.tensorflow.org/install) and Python 3.8-3.11. We recommend Ubuntu 22.04. Earlier versions of TensorFlow may still work but are not recommended because of known, unpatched CVEs.
18+
Sionna requires [TensorFlow 2.13-2.15](https://www.tensorflow.org/install) and Python 3.8-3.11. We recommend Ubuntu 22.04. Earlier versions of TensorFlow may still work but are not recommended because of known, unpatched CVEs.
1919

2020
To run the ray tracer on CPU, [LLVM](https://llvm.org) is required by DrJit. Please check the [installation instructions for the LLVM backend](https://drjit.readthedocs.io/en/latest/firststeps-py.html#llvm-backend).
2121

@@ -38,7 +38,7 @@ On macOS, you need to install [tensorflow-macos](https://github.com/apple/tensor
3838
```
3939
>>> import sionna
4040
>>> print(sionna.__version__)
41-
0.17.0
41+
0.18.0
4242
```
4343

4444
3.) Once Sionna is installed, you can run the [Sionna "Hello, World!" example](https://nvlabs.github.io/sionna/examples/Hello_World.html), have a look at the [quick start guide](https://nvlabs.github.io/sionna/quickstart.html), or at the [tutorials](https://nvlabs.github.io/sionna/tutorials.html).
@@ -97,7 +97,7 @@ We recommend to do this within a [virtual environment](https://docs.python.org/3
9797
```
9898
>>> import sionna
9999
>>> print(sionna.__version__)
100-
0.17.0
100+
0.18.0
101101
```
102102

103103
## License and Citation

doc/source/api/rt.rst

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ The paper `Sionna RT: Differentiable Ray Tracing for Radio Propagation Modeling
2323
.. include:: rt_radio_device.rst.txt
2424
.. include:: rt_antenna_array.rst.txt
2525
.. include:: rt_antenna.rst.txt
26+
.. include:: rt_ris.rst.txt
2627
.. include:: rt_utils.rst.txt
2728

2829
References:

doc/source/api/rt_radio_device.rst.txt

+3-2
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ Radio Devices
33

44
A radio device refers to a :class:`~sionna.rt.Transmitter` or :class:`~sionna.rt.Receiver` equipped
55
with an :class:`~sionna.rt.AntennaArray` as specified by the :class:`~sionna.rt.Scene`'s properties
6-
:attr:`~sionna.rt.Scene.tx_array` and :attr:`~sionna.rt.Scene.rx_array`, respectively.
6+
:attr:`~sionna.rt.Scene.tx_array` and :attr:`~sionna.rt.Scene.rx_array`, respectively. Also
7+
reconfigurable intelligent surfaces (:class:`~sionna.rt.RIS`) inherit from this class.
78

89
The following code snippet shows how to instantiate a :class:`~sionna.rt.Transmitter`
910
equipped with a :math:`4 \times 2` :class:`~sionna.rt.PlanarArray` with cross-polarized isotropic antennas:
@@ -52,4 +53,4 @@ Receiver
5253
.. autoclass:: sionna.rt.Receiver
5354
:members:
5455
:inherited-members:
55-
:exclude-members: scene
56+
:exclude-members: scene

doc/source/api/rt_ris.rst.txt

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
Reconfigurable Intelligent Surfaces (RIS)
2+
*****************************************
3+
4+
RIS
5+
---
6+
.. autoclass:: sionna.rt.RIS
7+
:members:
8+
:inherited-members:
9+
:exclude-members: radio_material, object_id, scene
10+
11+
PhaseProfile
12+
------------
13+
.. autoclass:: sionna.rt.PhaseProfile
14+
:members:
15+
:inherited-members:
16+
:exclude-members:
17+
18+
DiscretePhaseProfile
19+
--------------------
20+
.. autoclass:: sionna.rt.DiscretePhaseProfile
21+
:members:
22+
:inherited-members:
23+
:exclude-members:
24+
25+
AmplitudeProfile
26+
----------------
27+
.. autoclass:: sionna.rt.AmplitudeProfile
28+
:members:
29+
:inherited-members:
30+
:exclude-members:
31+
32+
DiscreteAmplitudeProfile
33+
------------------------
34+
.. autoclass:: sionna.rt.DiscreteAmplitudeProfile
35+
:members:
36+
:inherited-members:
37+
:exclude-members:
38+
39+
ProfileInterpolator
40+
-------------------
41+
.. autoclass:: sionna.rt.ProfileInterpolator
42+
:members:
43+
:inherited-members:
44+
:exclude-members: cell_y_positions, cell_z_positions, num_rows, num_cols, values
45+
46+
LagrangeProfileInterpolator
47+
---------------------------
48+
.. autoclass:: sionna.rt.LagrangeProfileInterpolator
49+
:members:
50+
:inherited-members:
51+
:exclude-members: cell_y_positions, cell_z_positions, num_rows, num_cols, values
52+
53+
CellGrid
54+
--------
55+
.. autoclass:: sionna.rt.CellGrid
56+
:members:
57+
:inherited-members:
58+
:exclude-members:

doc/source/api/rt_utils.rst.txt

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ dot
99
---
1010
.. autofunction:: sionna.rt.dot
1111

12+
outer
13+
-----
14+
.. autofunction:: sionna.rt.outer
15+
1216
normalize
1317
---------
1418
.. autofunction:: sionna.rt.normalize

doc/source/conf.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
# -- Project information -----------------------------------------------------
2525

2626
project = "Sionna"
27-
copyright = "2021-2023 NVIDIA CORPORATION"
27+
copyright = "2021-2024 NVIDIA CORPORATION"
2828

2929
# Read version number from sionna.__init__
3030
from importlib.machinery import SourceFileLoader

doc/source/em_primer.rst

+122-2
Original file line numberDiff line numberDiff line change
@@ -470,7 +470,7 @@ where the former is orthogonal to the plane of incidence and called transverse e
470470
\hat{\mathbf{e}}_{\text{i},\parallel}^\mathsf{T}\hat{\mathbf{e}}_{\text{i},s} & \hat{\mathbf{e}}_{\text{i},\parallel}^\mathsf{T}\hat{\mathbf{e}}_{\text{i},p}
471471
\end{bmatrix}
472472
\begin{bmatrix}E_{\text{i},s} \\ E_{\text{i},p}\end{bmatrix} =
473-
\mathbf{W}\left(\hat{\mathbf{e}}_{\text{i},\perp}, \hat{\mathbf{e}}_{\text{i},\parallel}, \hat{\mathbf{e}}_{\text{i},s}, \hat{\mathbf{e}}_{\text{i},p}\right)
473+
\mathbf{W}\left(\hat{\mathbf{e}}_{\text{i},\perp}, \hat{\mathbf{e}}_{\text{i},\parallel}, \hat{\mathbf{e}}_{\text{i},s}, \hat{\mathbf{e}}_{\text{i},p}\right) \begin{bmatrix}E_{\text{i},s} \\ E_{\text{i},p}\end{bmatrix}
474474
\end{align}
475475
476476
where we have defined the following matrix-valued function
@@ -846,7 +846,121 @@ which ensures the power balance between the incoming, reflected, and refracted f
846846
.. math::
847847
F_{\alpha, \beta}(\theta_i)^{-1} = \Lambda F_\alpha(\theta_i) + (1-\Lambda)F_\beta(\theta_i)
848848
849+
.. _ris_primer:
849850

851+
Reconfigurable Intelligent Surfaces (RIS)
852+
*****************************************
853+
Metasurfaces can manipulate electromagnetic waves in a way that traditional materials cannot. For example, they can be used to create anomalous reflections, focalization, as well as polarization changes. A reconfigurable intelligent surface (RIS) is a special type of metasurface that can be dynamically controlled to achieve favorable propagation conditions in a specific enviroment. While many different ways to model RIS have been proposed in the literature [Di-Renzo20]_, we adopt here the ones described in [Degli-Esposti22]_ and [Vitucci24]_. The former will be used for the computation of channel impulse responses (CIRs) (see :meth:`~sionna.rt.Scene.compute_paths`) while the latter will serve for the computation of coverage maps (see :meth:`~sionna.rt.Scene.coverage_map`).
854+
855+
We consider only lossless RIS, i.e., there is no power dissipation. For waves incident on the front side of an RIS, only the reradiated modes but neither specular nor diffuse reflections are created. For waves incident on the back side, an RIS behaves like a perfect absorber. For coverage maps, diffraction around the RIS' edges is ignored.
856+
857+
An RIS consists of a regular grid of unit cells which impose a spatial modulation, i.e., phase and amplitude changes, on an incident wave. This leads in turn to the creation of :math:`M\ge 1` reradiated modes. Let us denote by :math:`(y,z)` a generic point on the RIS, and by :math:`\chi_m(y,z)` and :math:`A_m(y,z)` the phase and amplitude modulation coefficients of the :math:`m\text{th}` reradiation mode, respectively. We assume that the RIS' normal :math:`\hat{\mathbf{n}}` points toward the positive :math:`x`-axis.
858+
859+
The spatial modulation coefficient :math:`\Gamma(y,z)` is then given as (Eq.12) [Degli-Esposti22]_
860+
861+
.. math::
862+
:label: spatial_modulation_coefficient
863+
864+
\Gamma(y,z) = \sum_{m=1}^M \sqrt{p_m} A_m(y,z) e^{j \chi_m(y,z)}
865+
866+
where :math:`p_m` is the reradiation intensity coefficient of the :math:`m\text{th}` mode. For power conservation reasons, we need to impose that :math:`\sum_{m=1}^M p_m=1` and that the normalized surface integral of :math:`|A_m(y,z)|^2` across the RIS equals one for all :math:`m`.
867+
868+
.. _fig_ris:
869+
.. figure:: figures/ris.svg
870+
:align: center
871+
:width: 50 %
872+
873+
Incident and reradiated field from a reconfigurable intelligent surface (RIS).
874+
875+
876+
Consider now an RIS as shown in :numref:`fig_ris` with an incident electro-magnetic wave with field phasor :math:`\mathbf{E}_i(S)` at point :math:`S\in\mathbb{R}^3`, where :math:`E_{i,\theta}(S)` and :math:`E_{i,\varphi}(S)` denote the vertical and horizontal field components, respectively. The reradiated field from the RIS at point :math:`S'` is computed as (Eq.30) [Degli-Esposti22]_:
877+
878+
.. math::
879+
:label: ris_field
880+
881+
\begin{align}
882+
\mathbf{E}_r(S') =& \sum_{u=1}^{N_Y}\sum_{v=1}^{N_Z} \Gamma(y_u, z_v) \frac{3\lambda}{16\pi} (1+\cos\theta_i(y_u, z_v)) (1+\cos\theta_r(y_u, z_v)) \\
883+
&\quad \times \frac{e^{-jk_0(s_i(y_u, z_v) + s_r(y_u, z_v))}}{s_i(y_u, z_v) s_r(y_u, z_v)} \left( E_{i,\theta}(S) \hat{\boldsymbol{\theta}}(\hat{\mathbf{k}}_r(y_u,z_v)) + E_{i,\varphi}(S) \hat{\boldsymbol{\varphi}}(\hat{\mathbf{k}}_r(y_u,z_v)) \right)
884+
\end{align}
885+
886+
where :math:`N_Y` and :math:`N_Z` are the number of columns and rows of the regular grid of unit cells with coordinates :math:`(y_u, z_v)` for :math:`1\leq u \leq N_Y` and :math:`1\leq v \leq N_Z`, :math:`\hat{\mathbf{k}}_i(y_u,z_v)` and :math:`\hat{\mathbf{k}}_r(y_u,z_v)` are the directions of the incident and reradiated waves at position :math:`(y_u,z_v)`, :math:`\theta_i(y_u, z_v)` and :math:`\theta_r(y_u, z_v)` are the angles between the RIS's normal and the incident and reradiated directions, respectively, and :math:`s_i(y_u, z_v)` and :math:`s_r(y_u, z_v)` are the distances between the unit cell :math:`(y_u, z_v)` and :math:`S, S'`, respectively. With a slight abuse of notation, we denote by :math:`\hat{\boldsymbol{\theta}}(\hat{\mathbf{k}})` and :math:`\hat{\boldsymbol{\varphi}}(\hat{\mathbf{k}})` the spherical unit vectors :eq:`spherical_vecs` for angles defined by :math:`\hat{\mathbf{k}}` according to :eq:`theta_phi`. One can observe from the last equation that the RIS does not impact the polarization.
887+
Note that :eq:`ris_field` is only used in :meth:`~sionna.rt.Scene.compute_paths` for the computation of the channel impulse response.
888+
889+
.. _fig_ris_ray:
890+
.. figure:: figures/ris_ray.svg
891+
:align: center
892+
:width: 35 %
893+
894+
An RIS anomalously reflects an incoming ray due to its phase gradient :math:`\nabla\chi_m`.
895+
896+
For the computation of coverage maps, the ray-based model from [Vitucci24]_ is used. :numref:`fig_ris_ray` shows how an RIS anomalously reflects an incident ray, intersecting the RIS at point :math:`\mathbf{q}\in\mathbb{R}^3` in the y-z plane.
897+
The incident ray with propagation direction :math:`\hat{\mathbf{k}}_i`, representing a locally-plane wavefront, acquires an incident phase gradient :math:`\nabla\chi_i` on the RIS' surface which can be computed as (Eq.9) [Vitucci24]_
898+
899+
.. math::
900+
:label: incident_phase_gradient
901+
902+
\nabla \chi_i = -k_0 \left(\mathbf{I} - \hat{\mathbf{n}}\hat{\mathbf{n}}^\textsf{T} \right) \hat{\mathbf{k}}_i.
903+
904+
Each of the RIS' reradiation modes gives rise to an additional phase gradient :math:`\nabla\chi_m` at the point of intersection, which results in the total phase gradient (Eq.11) [Vitucci24]_
905+
906+
.. math::
907+
:label: total_phase_gradient
908+
909+
\nabla \chi(\mathbf{q}) = \nabla \chi_i + \nabla \chi_m(\mathbf{q}).
910+
911+
It is this total phase gradient that determines the direction of the reflected ray :math:`\hat{\mathbf{k}}_r`
912+
for reradiation mode :math:`m` which can be computed as (Eq.13) [Vitucci24]_
913+
914+
.. math::
915+
:label: ris_reflected_direction
916+
917+
\hat{\mathbf{k}}_r = -\frac{\nabla \chi(\mathbf{q})}{k_0} + \sqrt{1-\left\lVert\frac{\nabla \chi(\mathbf{q})}{k_0} \right\rVert^2} \hat{\mathbf{n}}.
918+
919+
From the last equation, it becomes clear that the phase profile and its derivative must be computed at arbitrary positions on the RIS' surface. However, in Sionna RT, phase and amplitude profiles are only configured as discrete values on a regular grid with :math:`\lambda/2` spacing. For this reason, the discrete profiles are interpolated using a :class:`~sionna.rt.ProfileInterpolator`, such as the :class:`~sionna.rt.LagrangeProfileInterpolator`. It is important to keep in mind that the phase profile typically varies on the wavelength-scale across the RIS, and the amplitude profile at an even larger scale. Both profiles must be carefully chosen to represent a physically realistic device (see, e.g., the discussion after (Eq.16) [Vitucci24]_ ).
920+
921+
.. _asticmatic_ray_tube:
922+
.. figure:: figures/asticmatic_ray_tube.svg
923+
:align: center
924+
:width: 80 %
925+
926+
Infinitely narrow asticmatic ray tube.
927+
928+
A side-effect of the anomalous ray reflection is that the reflected wavefront generally has a different shape as that of the incoming wavefront. The shape of an astigmatic wave (or ray tube), as shown in :numref:`asticmatic_ray_tube`, is represented by the curvature matrix :math:`\mathbf{Q}(s)\in\mathbb{R}^{3\times 3}` along its propagation path (see, e.g., (Appenix I) [Kouyoumjian74]_ ), which can be written as
929+
930+
.. math::
931+
:label: curvature_matrix
932+
933+
\mathbf{Q}(s) = \frac{1}{\rho_1 + s} \hat{\mathbf{x}}_1\hat{\mathbf{x}}_1^\textsf{T} + \frac{1}{\rho_2 + s} \hat{\mathbf{x}}_2\hat{\mathbf{x}}_2^\textsf{T}
934+
935+
where :math:`\rho_1` and :math:`\rho_2` are the principal radii of curvature, and :math:`\hat{\mathbf{x}}_1`
936+
and :math:`\hat{\mathbf{x}}_2` are the corresponding principal directions; both orthogonal to the propagation direction :math:`\mathbf{s}`, where :math:`s` denotes a point on the ray with respect to a reference point :math:`s=0`.
937+
938+
For an incoming ray with curvature matrix :math:`\mathbf{Q}_i(\mathbf{q})` at the intersection point, the curvature matrix :math:`\mathbf{Q}_r(\mathbf{q})` of the outgoing ray can be computed as (Eq.22) [Vitucci24]_
939+
940+
.. math::
941+
:label: ris_curvature_matrix
942+
943+
\mathbf{Q}_r(\mathbf{q}) = \mathbf{L}^\textsf{T}\left(\mathbf{Q}_i(\mathbf{q}) - \frac{1}{k_0}\mathbf{H}_{\chi_m}(\mathbf{q}) \right)\mathbf{L}
944+
945+
where :math:`\mathbf{H}_{\chi_m}(\mathbf{q})\in\mathbb{R}^{3\times 3}` is the Hessian matrix of the phase profile :math:`\chi_m` at the intersection point and
946+
947+
.. math::
948+
:label: ris_l_matrix
949+
950+
\mathbf{L} = \mathbf{I}-\frac{\hat{\mathbf{k}}_r \hat{\mathbf{n}}^\textsf{T}}{\hat{\mathbf{k}}_r^\textsf{T}\hat{\mathbf{n}}}.
951+
952+
The principal radii of curvature of the reflected ray :math:`\rho_1^r` and :math:`\rho_2^r` are the non-zero eigenvalues of :math:`\mathbf{Q}_r(\mathbf{q})` while the principal directions :math:`\hat{\mathbf{x}}_1^r` and :math:`\hat{\mathbf{x}}_2^r` are given by the associated eigenvectors.
953+
With these definitions, we are now able to express the reflected field at point :math:`\mathbf{r} = \mathbf{q}+s\hat{\mathbf{k}}_r` as a function of the incoming field at point :math:`\mathbf{q}` (Eq.23) [Vitucci24]_:
954+
955+
.. math::
956+
:label: ris_ray_field
957+
958+
\begin{align}
959+
\mathbf{E}_{r,m}(\mathbf{r}) =& \sqrt{p_m} A_m(\mathbf{q}) e^{j \chi_m(\mathbf{q})} \sqrt{\frac{\rho_1^r \rho_2^r}{(\rho_1^r + s)(\rho_2^r + s)}} \\
960+
&\quad \times\left(E_{i,\theta}(\mathbf{q}) \hat{\boldsymbol{\theta}}(\hat{\mathbf{k}}_r) + E_{i,\varphi}(\mathbf{q}) \hat{\boldsymbol{\varphi}}(\hat{\mathbf{k}}_r)\right) e^{-jk_0 s}
961+
\end{align}
962+
963+
where we have assumed, as in :eq:`ris_field`, that the RIS does not realize any polarization transformation.
850964

851965
References:
852966
.. [atan2] Wikipedia, "`atan2 <https://en.wikipedia.org/wiki/Atan2>`__," accessed 8 Feb. 2023.
@@ -857,6 +971,10 @@ References:
857971
858972
.. [Degli-Esposti11] Vittorio Degli-Esposti et al., "`Analysis and Modeling on co- and Cross-Polarized Urban Radio Propagation for Dual-Polarized MIMO Wireless Systems <https://ieeexplore.ieee.org/abstract/document/5979177>`_", IEEE Trans. Antennas Propag, vol. 59, no. 11, pp.4247-4256, Nov. 2011.
859973
974+
.. [Degli-Esposti22] Vittorio Degli-Esposti et al., "`Reradiation and Scattering From a Reconfigurable Intelligent Surface: A General Macroscopic Model <https://ieeexplore.ieee.org/abstract/document/9713744>`_", IEEE Trans. Antennas Propag, vol. 70, no. 10, pp.8691-8706, Oct. 2022.
975+
976+
.. [Di-Renzo20] Marco Di Renzo et al., "`Smart Radio Environments Empowered by Reconfigurable Intelligent Surfaces: How It Works, State of Research, and The Road Ahead <https://ieeexplore.ieee.org/document/9140329>`_", IEEE J. Sel. Areas Commun., vol. 38, no. 11 pp.2450-2525, Nov. 2020.
977+
860978
.. [Fresnel] Wikipedia, "`Fresnel integral <https://en.wikipedia.org/wiki/Fresnel_integral>`_," accessed 21 Apr. 2023.
861979
862980
.. [ITURP20402] ITU, "`Recommendation ITU-R P.2040-2: Effects of building materials and structures on radiowave propagation above about 100 MHz <https://www.itu.int/rec/R-REC-P.2040/en>`_". Sep. 2021.
@@ -878,7 +996,9 @@ References:
878996
.. [METIS] METIS Deliverable D1.4, "`METIS Channel Models <https://metis2020.com/wp-content/uploads/deliverables/METIS_D1.4_v1.0.pdf>`_", Feb. 2015.
879997
880998
.. [Tse] D. Tse, P. Viswanath, "`Fundamentals of Wireless Communication <https://web.stanford.edu/~dntse/wireless_book.html>`_", Cambridge University Press, 2005.
881-
999+
1000+
.. [Vitucci24] Enrico Maria Vittuci et al., "`An Efficient Ray-Based Modeling Approach for Scattering From Reconfigurable Intelligent Surfaces <https://ieeexplore.ieee.org/abstract/document/10419169>`_", IEEE Trans. Antennas Propag, vol. 72, no. 3, pp.2673-2685, Mar. 2024.
1001+
8821002
.. [Wiesbeck] N. Geng and W. Wiesbeck, "Planungsmethoden für die Mobilkommunikation," Springer, 1998.
8831003
8841004
.. [Wikipedia] Wikipedia, "`Maximum power transfer theorem <https://en.wikipedia.org/wiki/Maximum_power_transfer_theorem>`_," accessed 7 Oct. 2022.

0 commit comments

Comments
 (0)