Quadriga-Lib
C++/MEX/Python Utility library for radio channel modelling and simulations
Data Formats
Overview

- QuaDRiGa Array Antenna Exchange Format (QDANT)

QuaDRiGa Array Antenna Exchange Format (QDANT)

<arrayant> | Describes a single array antenna
<layout> | Defines how multiple <arrayant> objects are arranged into an object array (optional)

QuaDRiGa Array Antenna Exchange Format (QDANT)
QDANT is an XML grammar for exchanging array-antenna pattern data. Tag names are case-sensitive. A file contains a single `<qdant>` root element that may include an optional `<layout>` and one or more `<arrayant>` elements. A namespace is required on the root (with or without a prefix).
Coordinate convention (for interpreting pattern data):

- Spherical (polar-spherical) angles theta (elevation) and phi (azimuth).
- Elevation theta: −90° (down) … 0° (horizon) … +90° (up).
- Azimuth phi: −180° (west) … −90° (south) … 0° (east) … +90° (north) … +180° (west); counting is anti-clockwise.
- Pattern components are resolved along unit vectors ê_theta and ê_phi (far-field, no ê_r component).

See related read / write functions in the API documentation for details on how to use this format:

- C++ QDANT read function (qdant_read)
- C++ QDANT write function (arrayant.qdant_write)
- MATLAB / Octave QDANT read function (arrayant_qdant_read)
- MATLAB / Octave QDANT write function (arrayant_qdant_write)
- Python QDANT read function (qdant_read)
- Python QDANT write function (qdant_write)

<arrayant> - Describes a single array antenna

- Attributes:
  - `id` (integer, required if multiple arrayants present)
    Unique values per file; if `<layout>` is used, each id referenced there must exist.
- Child elements:
  - `<name>` (string, optional)
    Human-readable identifier.
  - `<CenterFrequency>` (Hz, integer or float, optional)
    Default 300 MHz if omitted. When omitted, element positions are interpreted in wavelength multiples (i.e., meters scaled by λ at 300 MHz).
  - `<NoElements>` (integer, required for multi-element arrays)
    Number of elements in this array.
  - `<ElementPosition>` (optional)
    One or more position vectors [x,y,z] in meters, relative to the phase center. Axis orientation: x = east, y = north, z = up. Formatting: Vectors separated by spaces; within each vector, components separated by commas. Requires `<NoElements>` to be defined and to match the number of vectors. Example: `0,0,0 0.05,0,0`
  - `<ElevationGrid>` (degrees, required)
    List of elevation samples (−90 … +90). Example: `-90 -45 0 45 90`
  - `<AzimuthGrid>` (degrees, required)
    List of azimuth samples (−180 … +180; 0 points east; anti-clockwise positive). Example: `-180 -90 0 90 180`
  - `<CouplingAbs>` (optional; only with `<NoElements>`)
    N×M absolute values of the coupling matrix. Column vectors separated by spaces; entries within a column are separated by commas. Dimensions must be consistent with NoElements = N. M is the number of antenna ports. Example (N=2): `1,0 0,1`
  - `<CouplingPhase>` (optional; only with `<NoElements>` and `<CouplingAbs>`)
    N×N phases (degrees) for the same matrix. Column vectors separated by spaces; entries within a column are separated by commas. Dimensions must be consistent with NoElements = N. Example (N=2): `0,0 0,0`
  - `<EthetaMag>` (optional)
    Magnitude in [dB] of the electric field aligned with the ê − θ vector of the spherical coordinate system. One line contains all azimuth values for one elevation angle. The order is given by `AzimuthGrid` (columns) and `ElevationGrid` (rows). If `NoElements` is greater than 1, an additional attribute `<EthetaMag el="[no]">` must be provided. In the first example, the first line contains the values for the -90 degree elevation angle (down) and the last line contains the values for the 90 degree elevation (up). If there is no field in θ-direction, this XML-element can be omitted.
  - `<EthetaPhase>` (optional; only with `<EthetaMag>`)
    Phase in [degree] of the electric field aligned with the ê − θ vector. One line contains all azimuth values for one elevation angle. The order is given by `AzimuthGrid` and `ElevationGrid`. If `NoElements` is greater than 1, an additional attribute `<EthetaPhase el="[no]">` must be provided. EthetaPhase cannot be defined without defining EthetaMag first. If all phases are 0, this XML-element can be omitted.
  - `<EphiMag>` (optional)
    Magnitude in [dB] of the electric field aligned with the ê − φ vector of the spherical coordinate system.
  - `<EphiPhase>` (optional; only with `<EphiMag>`)
    Phase in [degree] of the electric field aligned with the ê − φ vector.
- Validation & Formatting Rules (at a glance):
  - Case-sensitive tag names.
  - `<qdant>` must be present; it may contain 0 or 1 `<layout>` and 1+ `<arrayant>`.
  - If `<layout>` is present, every integer in it must match an existing `<arrayant id="…">`
  - If `NoElements` is provided:
    (1) ElementPosition (if present) must provide exactly NoElements vectors.
    (2) CouplingAbs and CouplingPhase (if present) must be N×N with N = NoElements.
    (3) Pattern tags (Etheta, Ephi) must include el="1" … "N" for per-element data.
  - Pattern blocks: Number of lines = length of `ElevationGrid`. Numbers per line = length of `AzimuthGrid`. Magnitudes in dB; phases in degrees.
  - Omissions: If a component is everywhere zero, omit its Mag (and its Phase). If all phases are zero, *Phase may be omitted.
- Quick Reference:

  Element | Required | Type / Units | Notes |
  --- | --- | --- | --- | ---
  `qdant` | Yes | – | Root; carries namespace |
  `layout` | No | int matrix (text) | Columns separated by spaces; within a column, IDs comma-separated |
  `arrayant@id` | Cond. | int | Unique; referenced by `layout` |
  `name` | No | string | Free text |
  `CenterFrequency` | No | Hz | Default 300 MHz if absent |
  `NoElements` | Cond. | int | Required for multi-element arrays |
  `ElementPosition` | No | meters | Vectors `x,y,z`; vectors space-separated; components comma-separated |
  `ElevationGrid` | Yes | degrees | −90 … +90 |
  `AzimuthGrid` | Yes | degrees | −180 … +180; 0° east; anti-clockwise positive |
  `CouplingAbs` | No | matrix | N×M; columns space-sep; entries comma-sep |
  `CouplingPhase` | No | matrix (deg) | Requires `CouplingAbs`; same shape |
  `EthetaMag` | Cond. | dB grid | Rows = elevations; cols = azimuths; `el="n"` if N>1 |
  `EthetaPhase` | Cond. | deg grid | Only with `EthetaMag`; omit if all zeros |
  `EphiMag` | Cond. | dB grid | Rows = elevations; cols = azimuths; `el="n"` if N>1 |
  `EphiPhase` | Cond. | deg grid | Only with `EphiMag`; omit if all zeros |

- Example:
  2-Element Cross-Polarized Array (minimal pattern values):

      <?xml version="1.0" encoding="UTF-8"?>
      <qdant xmlns="http://www.quadriga-channel-model.de">
        <layout>1</layout>
        <arrayant id="1">
          <name>Simple XPOL</name>
          <CenterFrequency>2600000000</CenterFrequency>
          <NoElements>2</NoElements>
          <ElementPosition>0,0,0 0,0,0</ElementPosition>

          <ElevationGrid>-90 0 90</ElevationGrid>
          <AzimuthGrid>-180 -90 0 90 180</AzimuthGrid>

          <CouplingAbs>1,0 0,1</CouplingAbs>
          <CouplingPhase>0,0 0,0</CouplingPhase>

          <EthetaMag el="1">
            0 0 0 0 0
            0 0 0 0 0
            0 0 0 0 0
          </EthetaMag>
          <EthetaPhase el="1">
            0 0 0 0 0
            0 0 0 0 0
            0 0 0 0 0
          </EthetaPhase>

          <EphiMag el="2">
            0 0 0 0 0
            0 0 0 0 0
            0 0 0 0 0
          </EphiMag>
          <EphiPhase el="2">
            0 0 0 0 0
            0 0 0 0 0
            0 0 0 0 0
          </EphiPhase>
        </arrayant>
      </qdant>

<layout> - Defines how multiple <arrayant> objects are arranged into an object array (optional)

- Content:
  - One or more column vectors, separated by spaces; entries within a vector are comma-separated.
  - Values: Integers that must match the id of corresponding `<arrayant>` elements.
- Examples:
  - Linear list: 1 2 3 (three columns with one entry each).
  - 3×2 matrix of object IDs (3 columns, each a column vector of length 2): 1,2 1,2 2,1