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


Overview
Material Properties

1. Material ModelComplex permittivity, permeability, conductivity, and loss parameters with their frequency dependence
2. Electromagnetic InterpretationMapping the column model onto a physical EM material (the model's native domain)
3. Acoustic InterpretationReusing the column model to simulate acoustic propagation with a radio-wave ray tracer
4. Principled BSDFVisual material parameters read from the companion .mtl file
5. Background and ReferencesSources for the material model and its parameters

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)




Material Properties

Materials are stored in a name-keyed table: each triangle references a material by row index (csv_ind or mtl_ind), the row names are returned in csv_names / mtl_names, and the per-material parameters are returned in csv_prop — a map from parameter name to a vector with one entry per material row (so a value is read as csv_prop["a"][csv_ind[face]]). The model is formulated for electromagnetic propagation — complex relative permittivity ε, relative permeability μ, and conductivity σ following Rec. ITU-R P.2040 — and reuses the same parameters for an acoustic interpretation (mass law, coincidence, resonant absorption).

The table is schema-blind: the only required column is name (the join key for .obj materials); every other column is an optional numeric parameter. A parameter the table does not define is simply absent from csv_prop, and downstream consumers substitute its default (listed below). Empty cells parse as 0. The recognized parameters split into three physical roles: Transmission partition. Reflection and transmission are computed independently, not as energy-complementary halves of a single Fresnel split. ε and μ (a, b, e, f, resF…) set reflection and room-side absorption; the lumped (att, coi…) and in-medium (alpha, m) terms set the transmission level. The transmitted field is gated by the index contrast across the crossing: on a light→dense crossing — entering a higher-index medium, Re(ε₁μ₁) < Re(ε₂μ₂) — it is additionally scaled by the Fresnel 1 − abs(R)²; on a dense→light crossing — entering a lower-index medium, Re(ε₁μ₁) > Re(ε₂μ₂) — it is pass-through (abs(R)² is not subtracted). This gate applies only to the two straight-through transmission modes of ray_mesh_interact — type 1 (EM transmission) and type 4 (scalar transmission), which pass the ray through undeviated. Reflection (types 0 and 3) computes the Fresnel abs(R)² directly and never uses the gate; EM refraction (type 2) bends the ray per Snell with (ε₁μ₁)/(ε₂μ₂) and applies the full Fresnel transmission, bypassing the gate entirely — type 2 is the physically correct transmission path, while types 1/4 are the undeviated approximation the gate exists to keep well-behaved. Types 1 and 4 share the one gate; there is no separate scalar rule. The dense→light pass-through prevents spurious amplification and the critical-angle total reflection that an ε < 1 Fresnel transmission would otherwise impose on the undeviated path. On types 1/4 the lumped and in-medium terms set the transmission level (ε/μ do not); on type 2 the Fresnel transmission from ε/μ applies directly. Both domains use the same parameter set but populate it very differently: EM materials have εr > 1 with σ-based loss and μ = 1, whereas acoustic materials use a two-parameter ε, μ — rigid reflectors with εr ≪ 1 and μ = 1, porous absorbers with εr ≈ 1 and a lossy μr > 1 — with the att / alpha / mass-law terms reserved for partitions, coincidence, and resonators. See the Electromagnetic and Acoustic interpretation sections below. See related functions that produce or consume material properties:

1. Material Model

Complex permittivity, permeability, conductivity, and loss parameters with their frequency dependence

Parameters:
Each parameter is one numeric column of the material table and one key of csv_prop. Key is the CSV column name (and the csv_prop key); a parameter absent from the table is substituted with the listed default by downstream consumers. Only the name column is mandatory, and column order does not matter.

Key Property Units Default
a εr at fRef 1.0
b Frequency exponent for εr 0
c σ at fRef S/m 0
d Frequency exponent for σ 0
e μr at fRef 1.0
f Frequency exponent for μr 0
g σμ (magnetic loss) at fRef 0
h Frequency exponent for σμ 0
att Penetration loss at fRef dB 0
attB Frequency exponent for att 0
alpha In-medium absorption at fRef dB/m 0
alphaB Frequency exponent for alpha 0
fRef Reference frequency GHz 1.0
m Mass-law transmission slope dB/decade 0
resF Permittivity resonance frequency GHz 0
resQ Permittivity resonance quality factor 0
resS Permittivity resonance strength 0
coiF Coincidence frequency GHz 0
coiQ Coincidence quality factor 0
coiA Coincidence loss amplitude dB 0
Frequency laws:
f is given in GHz; f/fRef is the relative frequency. resF and coiF are absolute GHz. In the μ(f) and σμ(f) rows the exponent f is the parameter column, not the frequency.

Parameter Formula Unit Meaning
ε(f) a·(f/fRef)^b − i·17.98·σ/f + resS·resF² / (resF² − f² + i·(resF/resQ)·f) relative permittivity (complex)
σ(f) c·(f/fRef)^d [S/m] conductivity (enters ε as the −i term)
μ(f) e·(f/fRef)^f − i·17.98·σμ/f relative permeability (complex)
σμ(f) g·(f/fRef)^h magnetic loss (enters μ as the −i term)
att(f) att·(f/fRef)^attB + coiA / (1 + (coiQ·(f − coiF)/coiF)²) [dB] lumped loss added once on entering
α(f) alpha·(f/fRef)^alphaB [dB/m] explicit in-medium loss × path length
mass(f, L) max(0, m·log10((f/fRef)·L)) [dB] mass-law slope, L = in-medium path length
Mechanisms:


2. Electromagnetic Interpretation

Mapping the column model onto a physical EM material (the model's native domain) Electromagnetic Default Materials
Built-in material library used when no materials_csv is provided. Values follow Rec. ITU-R P.2040-3, Table 3, valid for 1–40 GHz (ground materials limited to 1–10 GHz). The built-in table defines only the parameters a, b, c, d, att; every other parameter is absent (consumers default it, so μ = 1) and fRef = 1 GHz. A scene using only built-in materials therefore exposes the keys a, b, c, d, att in csv_prop, each a vector with one entry per table row. max fGHz is the upper frequency for which each fit is considered valid.

Name a b c d att max fGHz
air 1.0 0.0 0.0 0.0 0.0 100
vacuum 1.0 0.0 0.0 0.0 0.0 100
textiles 1.5 0.0 5e-5 0.62 0.0 100
plastic 2.44 0.0 2.33e-5 1.0 0.0 100
ceramic 6.5 0.0 0.0023 1.32 0.0 100
sea_water 80.0 -0.25 4.0 0.58 0.0 100
sea_ice 3.2 -0.022 1.1 1.5 0.0 100
water 80.0 -0.18 0.6 1.52 0.0 20
water_ice 3.17 -0.005 5.6e-5 1.7 0.0 20
itu_concrete 5.24 0.0 0.0462 0.7822 0.0 100
itu_brick 3.91 0.0 0.0238 0.16 0.0 40
itu_plasterboard 2.73 0.0 0.0085 0.9395 0.0 100
itu_wood 1.99 0.0 0.0047 1.0718 0.0 100
itu_glass 6.31 0.0 0.0036 1.3394 0.0 100
itu_ceiling_board 1.48 0.0 0.0011 1.075 0.0 100
itu_chipboard 2.58 0.0 0.0217 0.78 0.0 100
itu_plywood 2.71 0.0 0.33 0.0 0.0 40
itu_marble 7.074 0.0 0.0055 0.9262 0.0 60
itu_floorboard 3.66 0.0 0.0044 1.3515 0.0 100
itu_metal 1.0 0.0 1.0e7 0.0 0.0 100
itu_very_dry_ground 3.0 0.0 0.00015 2.52 0.0 10
itu_medium_dry_ground 15.0 -0.1 0.035 1.63 0.0 10
itu_wet_ground 30.0 -0.4 0.15 1.3 0.0 10
itu_vegetation 1.0 0.0 1.0e-4 1.1 0.0 100
irr_glass 6.27 0.0 0.0043 1.1925 23.0 100
Notes:

3. Acoustic Interpretation

Reusing the column model to simulate acoustic propagation with a radio-wave ray tracer Wave mapping:
The two material families:
With permeability available, acoustic materials split into two calibration families. ε ↔ compressibility and μ ↔ effective density; the index is n = √(εμ) and the surface impedance is Z = Z₀√(μ/ε). Parameter roles:
Calibrating a porous absorber:
A porous layer is intrinsically a two-parameter medium (independent density and compressibility), so a single ε cannot match its reflection and its bulk loss at once — with one parameter the impedance Z = Z₀/√ε and the index n = √ε are locked together. Permeability breaks the lock: Z = Z₀√(μ/ε), n = √(εμ). Given the material's complex index n(f) = k/k₀ and normalized surface impedance z(f) = Zc/Z₀ (from a Delany-Bazley fit of the flow resistivity, or from measurement), the columns follow in closed form: ε = n / z (compressibility) μ = n · z (density)

Fit ε', ε'', μ', μ'' over the working band as power laws and read off the columns: ε' → (a, b), ε'' → (c, d), μ' → (e, f), μ'' → (g, h). Worked example for mineral wool, flow resistivity ≈ 12000 Pa·s/m²:

a b c d e f g h
1.16 −0.04 0.0038 1.46 1.66 −0.19 0.091 0.13
with fRef = 0.875, att = alpha = m = 0. This matches both the surface reflection and the bulk attenuation against Delany-Bazley across ~250 Hz … 4 kHz simultaneously (the band the power-law fit covers well) — the thing a single ε cannot do. Note where the loss went: ε is nearly real (compressibility ≈ air), and μ carries the viscous loss (density), which is where dissipation physically lives. A single-ε fit was forced to cram that loss into ε'', which over-stated the surface reflection. Rigid-surface absorption (small residual):
For a nominally rigid surface with a small measured absorption α (painted concrete, glass), invert the single-parameter normal-incidence reflection with μ = 1: a = ((1 − √(1−α)) / (1 + √(1−α)))² (small α: a ≈ α²/16)

α at fRef a
0.01 6.3e-6
0.1 6.8e-4
0.3 7.7e-3
0.5 2.9e-2
0.7 7.7e-2
0.9 2.7e-1
1.0 1.0
Layered and mounted materials (no air gap):
Stacked materials with no air between them (a porous absorber glued to a wall, carpet on a wooden floor, wood on concrete) are modeled as two watertight bodies whose shared faces are coincident (within the 1 mm interaction tolerance) with opposing normals. ray_mesh_interact detects this as a material-to-material interface. The reflection branch computes the Fresnel coefficient from the two real materials' ε, μ directly (no air); the transmission branch uses the dense→light / light→dense gate (pass-through entering a lower-index medium, 1 − abs(R)² entering a higher-index medium), partitioned from the lumped/in-medium terms as everywhere else. The wave cascade (entry → internal interface(s) → exit) is traced as separate ray segments by the ray tracer, which must split each interaction into its reflected and transmitted children. Mounted porous absorbers and the standing-wave limit:
A porous layer on a rigid backing (foam on concrete, the canonical broadband absorber) is the one configuration where the geometry-driven volumetric model has a known low-frequency error, and it is worth understanding before trusting the numbers there. The physics: the rigid backing forces a velocity node at the wall, so below the quarter-wave frequency f = c_sound / (4·thickness) the porous material sits in a low-velocity region and dissipates little — real absorption rolls off hard toward zero. This is a standing-wave (phase) effect. A phaseless ray tracer cannot resolve it: tracing the ray into the layer, reflecting off the backing, and summing the return path over-states the low-frequency absorption, because the velocity-node suppression is invisible to it. The error is always an over-prediction of absorption, confined below ~c/4d, and it shrinks as the layer thickens (a thicker layer pushes c/4d down). Above c/4d the backing stops mattering, the layer is effectively anechoic, and the volumetric result is correct. Material classes:
Validity and limitations:
Acoustic Default Materials


4. Principled BSDF

Visual material parameters read from the companion .mtl file When an OBJ file references an .mtl library, the per-material Principled BSDF parameters can be returned as an [n_mtl, 17] matrix (bsdf). These describe visual appearance only and do not affect propagation. Each row corresponds to one entry of mtl_names; if no matching .mtl file is found, the matrix is empty. All color, alpha, and 0–1 parameters are clamped to [0, 1].

Index Field Property Range Default
0 R Base color, red 0 … 1 0.8
1 G Base color, green 0 … 1 0.8
2 B Base color, blue 0 … 1 0.8
3 alpha Opacity 0 … 1 1.0
4 roughness Surface roughness 0 … 1 0.5
5 metallic Metallic factor 0 … 1 0.0
6 ior Index of refraction ≥ 1 1.45
7 specular Specular factor 0 … 1 0.5
8 Re Emission color, red 0 … 1 0.0
9 Ge Emission color, green 0 … 1 0.0
10 Be Emission color, blue 0 … 1 0.0
11 sheen Sheen factor 0 … 1 0.0
12 clearcoat Clearcoat factor 0 … 1 0.0
13 clearcoat_roughness Clearcoat roughness 0 … 1 0.0
14 anisotropic Anisotropy factor 0 … 1 0.0
15 anisotropic_rotation Anisotropy rotation 0 … 1 0.0
16 transmission Transmission factor 0 … 1 0.0
Mapping from .mtl keywords:
.mtl keyword BSDF field Notes
Kd R, G, B Base color
Ke Re, Ge, Be Emission color
Ka metallic
Pm metallic Overrides Ka when present
Ks specular First component only
d alpha
Ni ior
Ns roughness Converted: roughness = 1 − sqrt(Ns · 0.001)
Pr roughness Overrides Ns when present
Ps sheen
Pc clearcoat
Pcr clearcoat_roughness
aniso anisotropic
anisor anisotropic_rotation
Tf transmission First component only


5. Background and References

Sources for the material model and its parameters Primary recommendations: Base EM model (reflection and σ-loss): Acoustic mechanism mapping (the analogy the parameters approximate):


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): See related read / write functions in the API documentation for details on how to use this format:

<arrayant>

Describes a single array antenna

Attributes:
Child elements:
Validation & Formatting Rules (at a glance):
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:
Examples: