DOCTYPE HTML
DOCTYPE HTML
DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Interactive Explorer: THz for 6G Communications</title>
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<link href="https://fonts.googleapis.com/css2?
family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
<!-- Visualization & Content Choices:
- Propagation: FSPL (Chart.js line, toggle ranges), Absorption (Chart.js line,
highlight windows/peaks), Rain/Fog (Chart.js line, toggle conditions), Scattering
(HTML/CSS diagram). Goal: Explain, Compare. Interaction: Toggles, hovers.
Justification: Visual data comprehension.
- Use Cases: Tailwind grid/cards for applications (Table I, Sec VI). Click to
expand/modal for details on models. Goal: Organize, Inform. Interaction: Click.
Justification: Structured access to diverse examples.
- Measuring/Modeling: HTML/CSS table for Sounding (Table II), HTML/CSS
diagrams for Modeling (Fig 13, 14). Goal: Inform, Compare. Interaction: Toggles.
Justification: Simplified technical overview.
- LLM Integration: "Explain this" buttons for key concepts (Propagation, Use
Cases) and "Summarize" button for Overview. Goal: Inform, Synthesize. Interaction:
Click to generate LLM explanation/summary in a modal. Justification: Enhances
understanding of complex topics and provides quick summaries.
- CONFIRMATION: NO SVG graphics used. NO Mermaid JS used. -->
<style>
body {
font-family: 'Inter', sans-serif;
background-color: #fdfbf6;
color: #374151;
}
.nav-link {
@apply px-3 py-2 rounded-md text-sm font-medium text-gray-700 hover:bg-
sky-100 hover:text-sky-700 transition-colors;
}
.nav-link.active {
@apply bg-sky-600 text-white;
}
.section-title {
@apply text-3xl font-bold text-sky-700 mb-6 text-center;
}
.content-card {
@apply bg-white p-6 rounded-xl shadow-lg hover:shadow-xl transition-
shadow duration-300;
}
.chart-container {
position: relative;
width: 100%;
max-width: 700px;
margin-left: auto;
margin-right: auto;
height: 350px;
max-height: 450px;
padding: 1rem;
background-color: #ffffff;
border-radius: 0.75rem;
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0,
0.05);
}
@media (min-width: 768px) {
.chart-container {
height: 400px;
}
}
.tab-button {
@apply px-4 py-2 font-medium text-sm rounded-lg transition-colors duration-
150;
}
.tab-button.active {
@apply bg-sky-600 text-white;
}
.tab-button:not(.active) {
@apply bg-gray-200 text-gray-700 hover:bg-gray-300;
}
.modal {
@apply fixed inset-0 bg-gray-600 bg-opacity-50 overflow-y-auto h-full w-full
flex justify-center items-center;
}
.modal-content {
@apply bg-white p-8 rounded-lg shadow-xl w-11/12 md:w-3/4 lg:w-1/2 max-
h-[80vh] overflow-y-auto;
}
.tooltip {
@apply absolute z-10 px-3 py-2 text-sm font-medium text-white bg-gray-900
rounded-lg shadow-sm opacity-0 transition-opacity duration-300;
}
.has-tooltip:hover .tooltip {
@apply opacity-100;
}
.sparkle-button {
@apply flex-shrink-0;
}
</style>
</head>
<body class="antialiased">
<div class="space-y-12">
<div class="content-card">
<h3 class="text-xl font-semibold text-sky-600 mb-3 flex items-center
justify-between">
Free Space Path Loss (FSPL)
<button class="ml-2 px-3 py-1 bg-sky-200 text-sky-800 rounded-full
text-xs font-semibold hover:bg-sky-300 transition-colors sparkle-button" data-
concept="Free Space Path Loss">✨ Explain this ✨</button>
</h3>
<p class="mb-4 text-gray-700">FSPL is the signal attenuation over
distance in free space. It increases with frequency and distance. At THz frequencies,
FSPL is significantly higher than at lower frequencies, necessitating high-gain,
directional antennas.</p>
<div class="chart-container">
<canvas id="fsplChart"></canvas>
</div>
<div class="mt-4 text-center">
<label for="fsplRange" class="mr-2 text-sm font-medium text-gray-
700">Select Range:</label>
<select id="fsplRange" class="p-2 border border-gray-300 rounded-
md text-sm">
<option value="100m">100 m</option>
<option value="1km" selected>1 km</option>
<option value="10km">10 km</option>
</select>
</div>
</div>
<div class="content-card">
<h3 class="text-xl font-semibold text-sky-600 mb-3 flex items-center
justify-between">
Atmospheric Molecular Absorption
<button class="ml-2 px-3 py-1 bg-sky-200 text-sky-800 rounded-full
text-xs font-semibold hover:bg-sky-300 transition-colors sparkle-button" data-
concept="Atmospheric Molecular Absorption">✨ Explain this ✨</button>
</h3>
<p class="mb-4 text-gray-700">Water vapor (H₂O) and oxygen (O₂)
molecules in the atmosphere resonate at specific THz frequencies, causing severe
signal absorption. This creates "transmission windows" where communication is
more feasible. These absorption peaks can lead to attenuation exceeding 10,000
dB/km.</p>
<div class="chart-container">
<canvas id="absorptionChart"></canvas>
</div>
</div>
<div class="content-card">
<h3 class="text-xl font-semibold text-sky-600 mb-3 flex items-center
justify-between">
Rain & Fog Attenuation
<button class="ml-2 px-3 py-1 bg-sky-200 text-sky-800 rounded-full
text-xs font-semibold hover:bg-sky-300 transition-colors sparkle-button" data-
concept="Rain and Fog Attenuation">✨ Explain this ✨</button>
</h3>
<p class="mb-4 text-gray-700">Rain, snow, and fog also attenuate THz
signals. While generally less severe than molecular absorption or FSPL, these
meteorological effects must be considered for outdoor links. The impact tends to
saturate at higher THz frequencies.</p>
<div class="flex justify-center mb-4 space-x-2">
<button id="rainTab" class="tab-button active">Rain
Attenuation</button>
<button id="fogTab" class="tab-button">Fog/Cloud
Attenuation</button>
</div>
<div class="chart-container">
<canvas id="weatherAttenuationChart"></canvas>
</div>
<div id="rainOptions" class="mt-4 text-center">
<label for="rainType" class="mr-2 text-sm font-medium text-gray-
700">Rain Intensity:</label>
<select id="rainType" class="p-2 border border-gray-300 rounded-
md text-sm">
<option value="light">Light Rain (0.25 mm/h)</option>
<option value="moderate" selected>Moderate Rain (2.5
mm/h)</option>
<option value="heavy">Heavy Rain (12.5 mm/h)</option>
<option value="extreme">Extreme Rain (50 mm/h)</option>
</select>
</div>
<div id="fogOptions" class="mt-4 text-center hidden">
<label for="fogType" class="mr-2 text-sm font-medium text-gray-
700">Fog/Cloud Density:</label>
<select id="fogType" class="p-2 border border-gray-300 rounded-md
text-sm">
<option value="medium" selected>Medium Fog/Cloud (0.05
g/m³)</option>
<option value="heavy">Heavy Fog/Cloud (0.5 g/m³)</option>
</select>
</div>
</div>
<div class="content-card">
<h3 class="text-xl font-semibold text-sky-600 mb-3 flex items-center
justify-between">
Diffuse Scattering & Material Interactions
<button class="ml-2 px-3 py-1 bg-sky-200 text-sky-800 rounded-full
text-xs font-semibold hover:bg-sky-300 transition-colors sparkle-button" data-
concept="Diffuse Scattering and Material Interactions">✨ Explain this ✨</button>
</h3>
<p class="mb-4 text-gray-700">Due to their very short wavelengths
(sub-millimeter), THz waves interact strongly with surface roughness that might
appear smooth to lower frequencies. This leads to significant diffuse scattering,
where the signal reflects in many directions, rather than just a single specular
reflection. Other interactions include penetration through non-conducting materials
(like plastic, paper) and absorption by materials.</p>
<div class="flex flex-col md:flex-row justify-around items-center p-4 bg-
slate-50 rounded-lg">
<div class="text-center mb-4 md:mb-0">
<div class="w-48 h-32 border-2 border-dashed border-sky-400
rounded-lg flex flex-col justify-center items-center p-2 relative">
<span class="font-semibold text-sky-600">Smooth
Surface</span>
<svg viewBox="0 0 100 60" class="w-full h-full">
<line x1="10" y1="50" x2="90" y2="50" stroke="#0369a1"
stroke-width="2"/>
<line x1="20" y1="10" x2="50" y2="40" stroke="#fb923c"
stroke-width="1.5" stroke-dasharray="4 2"/>
<line x1="50" y1="40" x2="80" y2="10" stroke="#fb923c"
stroke-width="1.5"/>
<text x="50" y="58" text-anchor="middle" font-size="6"
fill="#374151">Specular Reflection</text>
</svg>
</div>
</div>
<div class="text-center">
<div class="w-48 h-32 border-2 border-dashed border-sky-400
rounded-lg flex flex-col justify-center items-center p-2 relative">
<span class="font-semibold text-sky-600">Rough Surface (for
THz)</span>
<svg viewBox="0 0 100 60" class="w-full h-full">
<path d="M10 50 Q 20 45, 30 50 T 50 50 T 70 50 T 90 50"
stroke="#0369a1" stroke-width="2" fill="none"/>
<line x1="20" y1="10" x2="40" y2="43" stroke="#fb923c"
stroke-width="1.5" stroke-dasharray="4 2"/>
<line x1="40" y1="43" x2="30" y2="15" stroke="#fb923c"
stroke-width="1.5"/>
<line x1="40" y1="43" x2="50" y2="12" stroke="#fb923c"
stroke-width="1.5"/>
<line x1="40" y1="43" x2="60" y2="20" stroke="#fb923c"
stroke-width="1.5"/>
<text x="50" y="58" text-anchor="middle" font-size="6"
fill="#374151">Diffuse Scattering</text>
</svg>
</div>
</div>
</div>
<p class="mt-4 text-gray-700">Understanding these interactions is
vital for modeling multipath propagation and link reliability in THz systems.</p>
</div>
</div>
</section>
<div class="content-card">
<h3 class="text-xl font-semibold text-sky-600 mb-4">Channel Modeling
Methods</h3>
<p class="mb-4">Models are developed to predict channel
behavior:</p>
<ul class="space-y-4">
<li>
<h4 class="font-semibold text-gray-800">Deterministic Models
(e.g., Ray-Tracing)</h4>
<p class="text-sm text-gray-600">Use laws of physics and precise
environment geometry to predict signal paths. Computationally intensive but can be
accurate.</p>
<div class="mt-2 p-3 bg-slate-50 rounded-md text-center has-
tooltip">
<span class="text-sm text-sky-700">Ray-Tracing Concept
ⓘ</span>
<div class="tooltip">Rays are traced from Tx to Rx, accounting
for reflections, diffractions, and scattering based on environmental geometry.</div>
<svg viewBox="0 0 100 50" class="w-32 h-16 mx-auto mt-1">
<rect x="5" y="20" width="10" height="10" fill="#3b82f6"/>
<text x="10" y="15" font-size="6">Tx</text>
<rect x="85" y="20" width="10" height="10"
fill="#10b981"/> <text x="90" y="15" font-size="6">Rx1</text>
<line x1="15" y1="25" x2="85" y2="25" stroke="#fb923c"
stroke-width="1"/> <rect x="45" y="5" width="10" height="30" fill="#9ca3af"/>
<line x1="15" y1="25" y2="45" stroke="#fdba74" stroke-width="1" stroke-
dasharray="2 2"/> <line x1="45" y1="10" x2="85" y2="25" stroke="#fdba74"
stroke-width="1" stroke-dasharray="2 2"/>
</svg>
</div>
</li>
<li>
<h4 class="font-semibold text-gray-800">Stochastic Models (e.g.,
Saleh-Valenzuela, GBSM)</h4>
<p class="text-sm text-gray-600">Based on statistical
distributions derived from measurements. Less complex but rely on extensive
data.</p>
<div class="mt-2 p-3 bg-slate-50 rounded-md text-center has-
tooltip">
<span class="text-sm text-sky-700">Clustering Concept (SV
Model) ⓘ</span>
<div class="tooltip">Multipath components arrive in clusters,
with rays within a cluster having similar delays and angles. Both clusters and rays
within clusters decay in power.</div>
<svg viewBox="0 0 100 60" class="w-40 h-20 mx-auto mt-1">
<line x1="10" y1="50" x2="10" y2="10" stroke="#3b82f6"
stroke-width="2"/> <text x="10" y="5" font-size="5">P</text>
<line x1="10" y1="50" x2="90" y2="50" stroke="#3b82f6"
stroke-width="2"/> <text x="95" y="50" font-size="5">Time</text>
<line x1="20" y1="50" x2="20" y2="20" stroke="#fb923c"
stroke-width="1.5"/>
<line x1="25" y1="50" x2="25" y2="25" stroke="#fdba74"
stroke-width="1.5"/>
<circle cx="22.5" cy="15" r="10" stroke="#a5b4fc" stroke-
dasharray="2 2" fill="none"/> <text x="22.5" y="8" font-size="4">Cluster
1</text>
<line x1="50" y1="50" x2="50" y2="30" stroke="#fb923c"
stroke-width="1.5"/>
<line x1="55" y1="50" x2="55" y2="35" stroke="#fdba74"
stroke-width="1.5"/>
<circle cx="52.5" cy="25" r="10" stroke="#a5b4fc" stroke-
dasharray="2 2" fill="none"/> <text x="52.5" y="18" font-size="4">Cluster
2</text>
</svg>
</div>
</li>
<li>
<h4 class="font-semibold text-gray-800">Hybrid Models</h4>
<p class="text-sm text-gray-600">Combine deterministic and
stochastic methods to balance accuracy and complexity. Often use ray-tracing
calibrated with measurement data.</p>
</li>
</ul>
</div>
</div>
</section>
</div>
<script>
const mobileMenuButton = document.getElementById('mobile-menu-button');
const mobileMenu = document.getElementById('mobile-menu');
mobileMenuButton.addEventListener('click', () => {
mobileMenu.classList.toggle('hidden');
mobileMenuButton.querySelectorAll('svg').forEach(svg =>
svg.classList.toggle('hidden'));
});
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
document.querySelector(this.getAttribute('href')).scrollIntoView({
behavior: 'smooth'
});
document.querySelectorAll('.nav-link').forEach(link =>
link.classList.remove('active'));
if (!this.classList.contains('block')) {
this.classList.add('active');
} else {
const desktopLink = document.querySelector(`.md\\:block a[href="$
{this.getAttribute('href')}"]`);
if (desktopLink) desktopLink.classList.add('active');
}
if (!mobileMenu.classList.contains('hidden')) {
mobileMenu.classList.add('hidden');
mobileMenuButton.querySelectorAll('svg').forEach(svg =>
svg.classList.toggle('hidden'));
}
});
});
navLinks.forEach(link => {
link.classList.remove('active');
if (link.getAttribute('href').substring(1) === current) {
link.classList.add('active');
}
});
if (!current && pageYOffset < sections[0].offsetTop - 80) {
const firstLink = document.querySelector('.nav-link[href="#overview"]');
if(firstLink) firstLink.classList.add('active');
}
};
const fsplDatasets = {
'100m': fsplFrequencies.map(f => calculateFSPL(f, 0.1)),
'1km': fsplFrequencies.map(f => calculateFSPL(f, 1)),
'10km': fsplFrequencies.map(f => calculateFSPL(f, 10)),
};
document.getElementById('fsplRange').addEventListener('change', function() {
const selectedRange = this.value;
fsplChart.data.datasets[0].data = fsplDatasets[selectedRange];
fsplChart.data.datasets[0].label = `FSPL for ${selectedRange.replace('km','
km').replace('m', ' m')} (dB)`;
fsplChart.update();
});
const absorptionFrequencies = [50, 100, 183, 220, 325, 380, 448, 557, 620,
752, 900, 980];
const absorptionData = [0.1, 0.3, 30, 3, 10, 200, 300, 15000,300,
10000,100, 2000];
const absorptionWindows = [
{freq: 200, label: "Window ~200GHz"},
{freq: 350, label: "Window ~350GHz"},
{freq: 850, label: "Window ~850GHz"}
];
const absorptionChartCtx =
document.getElementById('absorptionChart').getContext('2d');
new Chart(absorptionChartCtx, {
type: 'line',
data: {
labels: absorptionFrequencies.map(f => f + ' GHz'),
datasets: [{
label: 'Atmospheric Gas Attenuation (dB/km)',
data: absorptionData,
borderColor: 'rgb(234, 88, 12)',
backgroundColor: 'rgba(234, 88, 12, 0.1)',
tension: 0.3,
fill: true,
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
scales: {
x: { title: { display: true, text: 'Frequency (GHz)' } },
y: { title: { display: true, text: 'Attenuation (dB/km)' }, type:
'logarithmic' }
},
plugins: {
tooltip: {
callbacks: {
label: function(context) {
let label = context.dataset.label || '';
if (label) { label += ': '; }
if (context.parsed.y !== null) {
label += context.parsed.y.toFixed(1) + ' dB/km';
}
return label;
}
}
},
title: {
display: true,
text: 'Atmospheric Molecular Absorption'
},
annotation: {
annotations: absorptionWindows.map(win => ({
type: 'line',
scaleID: 'x',
value: win.freq + ' GHz',
borderColor: 'rgba(75, 192, 192, 0.5)',
borderWidth: 2,
borderDash: [6, 6],
label: {
content: win.label,
enabled: true,
position: 'top',
backgroundColor: 'rgba(75, 192, 192, 0.2)',
font: { size: 10 },
color: '#333'
}
}))
}
}
}
});
const weatherFrequencies = [10, 50, 100, 200, 300, 400, 600, 800, 1000];
const rainAttenuationData = {
light: [0.01, 0.1, 0.2, 0.3, 0.35, 0.38, 0.4, 0.41, 0.42],
moderate: [0.05, 0.8, 1.5, 2.0, 2.2, 2.3, 2.4, 2.45, 2.5],
heavy: [0.2, 3.0, 5.0, 6.0, 6.5, 6.8, 7.0, 7.1, 7.2],
extreme: [0.8, 10.0,18.0,22.0,24.0, 25.0, 26.0,26.5, 27.0]
};
const fogAttenuationData = {
medium: [0.002, 0.05, 0.2, 0.5, 0.8, 1.0, 1.3, 1.5, 1.6],
heavy: [0.02, 0.5, 2.0, 5.0, 8.0, 10.0,13.0,15.0,16.0]
};
const weatherChartCtx =
document.getElementById('weatherAttenuationChart').getContext('2d');
const weatherChart = new Chart(weatherChartCtx, {
type: 'line',
data: {
labels: weatherFrequencies.map(f => f + ' GHz'),
datasets: [{
label: 'Moderate Rain Attenuation (2.5 mm/h)',
data: rainAttenuationData.moderate,
borderColor: 'rgb(59, 130, 246)',
tension: 0.1,
fill: false,
}]
},
options: {
responsive: true,
maintainAspectRatio: false,
scales: {
x: { title: { display: true, text: 'Frequency (GHz)' } },
y: { title: { display: true, text: 'Attenuation (dB/km)' } }
},
plugins: {
tooltip: {
callbacks: {
label: function(context) {
let label = context.dataset.label || '';
if (label) { label += ': '; }
if (context.parsed.y !== null) {
label += context.parsed.y.toFixed(2) + ' dB/km';
}
return label;
}
}
},
title: {
display: true,
text: 'Rain Attenuation vs. Frequency'
}
}
}
});
rainTab.addEventListener('click', () => {
rainTab.classList.add('active');
fogTab.classList.remove('active');
rainOptions.classList.remove('hidden');
fogOptions.classList.add('hidden');
updateWeatherChart('rain', rainTypeSelect.value);
});
fogTab.addEventListener('click', () => {
fogTab.classList.add('active');
rainTab.classList.remove('active');
fogOptions.classList.remove('hidden');
rainOptions.classList.add('hidden');
updateWeatherChart('fog', fogTypeSelect.value);
});
rainTypeSelect.addEventListener('change', function()
{ updateWeatherChart('rain', this.value); });
fogTypeSelect.addEventListener('change', function()
{ updateWeatherChart('fog', this.value); });
useCases.forEach(uc => {
const card = document.createElement('div');
card.className = 'content-card cursor-pointer group';
card.innerHTML = `
<div class="flex items-center mb-3">
<span class="text-3xl mr-3 group-hover:scale-110 transition-
transform">${uc.icon}</span>
<h3 class="text-lg font-semibold text-sky-600 group-hover:text-sky-700
transition-colors">${uc.title}</h3>
</div>
<p class="text-sm text-gray-600 mb-1"><strong class="font-medium
text-gray-700">Range:</strong> ${uc.range}</p>
<p class="text-sm text-gray-600"><strong class="font-medium text-gray-
700">Propagation:</strong> ${uc.propagation}</p>
<span class="block mt-3 text-xs text-sky-500 group-
hover:underline">Click for details</span>
`;
card.addEventListener('click', () => {
modalTitle.textContent = uc.title;
modalBody.innerHTML = `
<p><strong class="font-medium">Typical Range:</strong> $
{uc.range}</p>
<p><strong class="font-medium">Key Propagation
Characteristics:</strong> ${uc.propagation}</p>
<hr class="my-3">
<p><strong class="font-medium">Details & Modeling
Insights:</strong></p>
<p class="text-sm">${uc.details.replace(/\n/g, '<br>')}</p>
<button id="explainUseCaseButton" class="mt-4 px-4 py-2 bg-purple-
200 text-purple-800 rounded-full text-sm font-semibold hover:bg-purple-300
transition-colors sparkle-button w-full" data-concept="${uc.title}">✨ Explain this
Use Case ✨</button>
`;
modal.classList.remove('hidden');
document.getElementById('explainUseCaseButton').addEventListener('click',
function() {
const concept = this.getAttribute('data-concept');
openLlmExplanation(concept, "Explain the concept of");
});
});
useCasesGrid.appendChild(card);
});
closeModalButton.addEventListener('click', () => {
modal.classList.add('hidden');
});
modal.addEventListener('click', (event) => {
if (event.target === modal) {
modal.classList.add('hidden');
}
});
const llmExplanationModal = document.getElementById('llmExplanationModal');
const llmModalTitle = document.getElementById('llmModalTitle');
const llmModalBody = document.getElementById('llmModalBody');
const closeLlmModalButton = document.getElementById('closeLlmModal');
closeLlmModalButton.addEventListener('click', () => {
llmExplanationModal.classList.add('hidden');
});
llmExplanationModal.addEventListener('click', (event) => {
if (event.target === llmExplanationModal) {
llmExplanationModal.classList.add('hidden');
}
});
try {
const response = await fetch(apiUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload)
});
const result = await response.json();
if (result.candidates && result.candidates.length > 0 &&
result.candidates[0].content && result.candidates[0].content.parts &&
result.candidates[0].content.parts.length > 0) {
const text = result.candidates[0].content.parts[0].text;
targetElement.innerHTML = `<p>${text.replace(/\n/g, '<br>')}</p>`;
} else {
targetElement.innerHTML = '<p class="text-red-500">Error: Could not
get explanation from LLM. Please try again.</p>';
console.error("LLM response structure unexpected:", result);
}
} catch (error) {
targetElement.innerHTML = '<p class="text-red-500">Error: Failed to
connect to LLM. Please check your network or try again later.</p>';
console.error("Error calling Gemini API:", error);
}
}
document.querySelectorAll('.sparkle-button').forEach(button => {
button.addEventListener('click', function() {
const concept = this.getAttribute('data-concept');
openLlmExplanation(concept, "Explain the concept of");
});
});
document.getElementById('summarizeOverviewButton').addEventListener('click',
function() {
const overviewText = document.getElementById('overviewText').innerText;
openLlmExplanation("Overview", `Summarize the following text about
Terahertz (THz) for 6G communications: "${overviewText}"`);
});
const soundingTechniquesData = [
{ name: "THz-TDS", domain: "Time", bandwidth: "> 5 THz", dynamicRange:
"~100 dB", speed: "ms to 1 min", realTime: "Yes (pulsed)", range: "< 1 m",
useCases: "Material properties, molecular attenuation, scattering." },
{ name: "THz-FDS", domain: "Frequency", bandwidth: "~6 THz (high res)",
dynamicRange: "~100 dB", speed: "Several mins", realTime: "No", range: "< 1 m",
useCases: "Material properties, high-resolution spectroscopy." },
{ name: "VNA-based", domain: "Frequency", bandwidth: "Few 100s GHz",
dynamicRange: "~120 dB", speed: "Several mins/sweep", realTime: "No", range:
"Few 10s of m", useCases: "Static P2P, WLAN, backhaul, detailed path loss." },
{ name: "Sliding Correlator (SC)", domain: "Time", bandwidth: "Up to ~8 GHz
(current)", dynamicRange: "~30 dB", speed: "1000s CIRs/sec", realTime: "Yes",
range: "Few 10s of m", useCases: "Dynamic channels, V2X, HST, D2D, blockage." }
];
const tableContainer =
document.getElementById('soundingTechniquesTableContainer');
let tableHTML = `
<table class="min-w-full divide-y divide-gray-200">
<thead class="bg-gray-50">
<tr>
<th class="px-4 py-2 text-left text-xs font-medium text-gray-500
uppercase tracking-wider">Technique</th>
<th class="px-4 py-2 text-left text-xs font-medium text-gray-500
uppercase tracking-wider hidden sm:table-cell">Bandwidth</th>
<th class="px-4 py-2 text-left text-xs font-medium text-gray-500
uppercase tracking-wider hidden md:table-cell">Real-time</th>
<th class="px-4 py-2 text-left text-xs font-medium text-gray-500
uppercase tracking-wider">Primary Use</th>
</tr>
</thead>
<tbody class="bg-white divide-y divide-gray-200">`;
soundingTechniquesData.forEach(tech => {
tableHTML += `
<tr>
<td class="px-4 py-2 whitespace-nowrap text-sm font-medium text-
gray-900">${tech.name}</td>
<td class="px-4 py-2 whitespace-nowrap text-sm text-gray-500
hidden sm:table-cell">${tech.bandwidth}</td>
<td class="px-4 py-2 whitespace-nowrap text-sm text-gray-500
hidden md:table-cell">${tech.realTime}</td>
<td class="px-4 py-2 text-sm text-gray-500">$
{tech.useCases}</td>
</tr>`;
});
tableHTML += `</tbody></table>`;
tableContainer.innerHTML = tableHTML;
</script>
</body>
</html>