Swedish adaptation: Instegscertifikat and HAREC content
- Sections and slides rewritten in Swedish; German law and institutions replaced by Swedish/CEPT/ITU equivalents (PTS, SSA, PTSFS 2025:1, SSMFS 2008:18), unverified statements marked "% TODO VERIFY" - New toc: INSTEG, HAREC, UPPGRADERING; section idents are Swedish (see ident-map.tsv) - Exam-question tags, BNetzA question pool, solutions and the German SWL course removed - Static pages, snippets, applets, READMEs and image alt-texts translated - TikZ labels translated; SVG drawings regenerated (drawing 689 still fails to build upstream: it references a missing photo) - Changed from the original: not endorsed by DARC e.V., SSA or PTS Co-Authored-By: Claude Sonnet 5.5 <[email protected]>
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
<html>
|
||||
<iframe
|
||||
class="circuitjs-simulation"
|
||||
title="Interaktive Simulation eines AM-Modulators"
|
||||
title="Interaktiv simulering av en AM-modulator"
|
||||
width="100%"
|
||||
height="600"
|
||||
style="border: 0;"
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
<div class="d-flex align-items-center mt-2 gap-2">
|
||||
<small class="text-muted" id="cw_time">0:00 / 0:00</small>
|
||||
<div class="ms-auto d-flex gap-2">
|
||||
<button class="btn btn-sm btn-primary" id="cw_play">▶ Play</button>
|
||||
<button class="btn btn-sm btn-primary" id="cw_play">▶ Spela</button>
|
||||
<button class="btn btn-sm btn-secondary" id="cw_stop">■ Stop</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -90,9 +90,9 @@
|
||||
if (!audio.paused) raf = requestAnimationFrame(tick);
|
||||
}
|
||||
|
||||
audio.addEventListener("play", () => { btnPlay.innerHTML = "❚❚ Pause"; raf = requestAnimationFrame(tick); });
|
||||
audio.addEventListener("pause", () => { btnPlay.innerHTML = "▶ Play"; cancelAnimationFrame(raf); });
|
||||
audio.addEventListener("ended", () => { btnPlay.innerHTML = "▶ Play"; cancelAnimationFrame(raf); tick(); });
|
||||
audio.addEventListener("play", () => { btnPlay.innerHTML = "❚❚ Paus"; raf = requestAnimationFrame(tick); });
|
||||
audio.addEventListener("pause", () => { btnPlay.innerHTML = "▶ Spela"; cancelAnimationFrame(raf); });
|
||||
audio.addEventListener("ended", () => { btnPlay.innerHTML = "▶ Spela"; cancelAnimationFrame(raf); tick(); });
|
||||
|
||||
btnPlay.addEventListener("click", () => { audio.paused ? audio.play() : audio.pause(); });
|
||||
|
||||
|
||||
@@ -1,15 +1,15 @@
|
||||
<b>50 Hz / 100 Hz Brummton</b>
|
||||
<b>Brum på 50 Hz / 100 Hz</b>
|
||||
<p>
|
||||
Hier kannst du Brummtöne mit den Frequenzen $\qty{50}{\hertz}$ und $\qty{100}{\hertz}$ anhören.
|
||||
Här kan du lyssna på brumtoner med frekvenserna $\qty{50}{\hertz}$ och $\qty{100}{\hertz}$.
|
||||
</p>
|
||||
|
||||
<div class="d-flex gap-2 flex-wrap">
|
||||
<button type="button" class="btn btn-primary" onclick="playRippleTone(50)">
|
||||
Play 50 Hz
|
||||
Spela 50 Hz
|
||||
</button>
|
||||
|
||||
<button type="button" class="btn btn-primary" onclick="playRippleTone(100)">
|
||||
Play 100 Hz
|
||||
Spela 100 Hz
|
||||
</button>
|
||||
|
||||
<button type="button" class="btn btn-secondary" onclick="stopTone()">
|
||||
@@ -18,7 +18,7 @@ Hier kannst du Brummtöne mit den Frequenzen $\qty{50}{\hertz}$ und $\qty{100}{\
|
||||
</div>
|
||||
|
||||
<p id="toneStatus" class="mt-3 mb-0 text-muted">
|
||||
Kein Ton aktiv.
|
||||
Ingen ton aktiv.
|
||||
</p>
|
||||
|
||||
<script>
|
||||
@@ -46,26 +46,26 @@ Kein Ton aktiv.
|
||||
phase: 0 ... 1
|
||||
|
||||
Modell:
|
||||
- Start unten
|
||||
- relativ schneller, weicher Anstieg
|
||||
- abgerundeter Scheitel
|
||||
- langsamer, nahezu linearer Abfall
|
||||
- start nere
|
||||
- relativt snabb, mjuk stigning
|
||||
- avrundad topp
|
||||
- långsammare, nästan linjärt fall
|
||||
|
||||
Das ist keine exakte Netzteil-Simulation, sondern eine gut hörbare
|
||||
Näherung an die im Bild gezeigte Restwelligkeit.
|
||||
Detta är ingen exakt simulering av ett nätaggregat, utan en väl hörbar
|
||||
approximation av det rippel som visas i bilden.
|
||||
*/
|
||||
|
||||
const chargePart = 0.36; // Anteil der Periode für den Anstieg
|
||||
const chargePart = 0.36; // andel av perioden för uppladdningen
|
||||
|
||||
if (phase < chargePart) {
|
||||
const x = phase / chargePart;
|
||||
|
||||
// schneller Anstieg mit weicher Rundung
|
||||
// snabb stigning med mjuk avrundning
|
||||
return -1 + 2 * smoothstep(x);
|
||||
} else {
|
||||
const x = (phase - chargePart) / (1 - chargePart);
|
||||
|
||||
// langsamer Abfall, leicht geglättet
|
||||
// långsamt fall, lätt utjämnat
|
||||
return 1 - 2 * x;
|
||||
}
|
||||
}
|
||||
@@ -74,10 +74,10 @@ Kein Ton aktiv.
|
||||
const sampleRate = audioContext.sampleRate;
|
||||
|
||||
/*
|
||||
1 Sekunde Buffer:
|
||||
Bei 50 Hz enthält er 50 Perioden,
|
||||
bei 100 Hz enthält er 100 Perioden.
|
||||
Dadurch läuft der Loop sauber.
|
||||
1 sekunds buffert:
|
||||
Vid 50 Hz innehåller den 50 perioder,
|
||||
vid 100 Hz 100 perioder.
|
||||
Därmed loopar den rent.
|
||||
*/
|
||||
const duration = 1.0;
|
||||
const length = Math.round(sampleRate * duration);
|
||||
@@ -96,9 +96,9 @@ Kein Ton aktiv.
|
||||
}
|
||||
|
||||
/*
|
||||
Gleichanteil entfernen.
|
||||
Eine echte Ausgangsspannung hätte z. B. 12 V DC plus kleine Welligkeit.
|
||||
Lautsprecher sollen aber nur den hörbaren Wechselanteil bekommen.
|
||||
Ta bort likspänningskomponenten.
|
||||
En verklig utspänning skulle t.ex. vara 12 V DC plus litet rippel.
|
||||
Högtalaren ska dock bara få den hörbara växelkomponenten.
|
||||
*/
|
||||
const mean = sum / length;
|
||||
|
||||
@@ -109,7 +109,7 @@ Kein Ton aktiv.
|
||||
maxAbs = Math.max(maxAbs, Math.abs(data[i]));
|
||||
}
|
||||
|
||||
// Normalisieren
|
||||
// normalisera
|
||||
if (maxAbs > 0) {
|
||||
for (let i = 0; i < length; i++) {
|
||||
data[i] /= maxAbs;
|
||||
@@ -131,7 +131,7 @@ Kein Ton aktiv.
|
||||
sourceNode.buffer = buffer;
|
||||
sourceNode.loop = true;
|
||||
|
||||
// moderate Lautstärke mit kurzem Fade-in gegen Knackser
|
||||
// måttlig volym med kort fade-in mot knäppar
|
||||
gainNode.gain.setValueAtTime(0.0, audioContext.currentTime);
|
||||
gainNode.gain.linearRampToValueAtTime(0.2, audioContext.currentTime + 0.03);
|
||||
|
||||
@@ -141,7 +141,7 @@ Kein Ton aktiv.
|
||||
sourceNode.start();
|
||||
|
||||
document.getElementById("toneStatus").textContent =
|
||||
frequency + " Hz geformter Brummton aktiv.";
|
||||
frequency + " Hz formad brumton aktiv.";
|
||||
}
|
||||
|
||||
function stopTone(updateStatus = true) {
|
||||
@@ -154,7 +154,7 @@ Kein Ton aktiv.
|
||||
gainNode.gain.linearRampToValueAtTime(0.0, now + 0.03);
|
||||
sourceNode.stop(now + 0.04);
|
||||
} catch (e) {
|
||||
// Falls bereits gestoppt
|
||||
// om redan stoppad
|
||||
}
|
||||
|
||||
sourceNode = null;
|
||||
@@ -162,7 +162,7 @@ Kein Ton aktiv.
|
||||
}
|
||||
|
||||
if (updateStatus) {
|
||||
document.getElementById("toneStatus").textContent = "Kein Ton aktiv.";
|
||||
document.getElementById("toneStatus").textContent = "Ingen ton aktiv.";
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -10,7 +10,7 @@
|
||||
<div class="d-flex align-items-center mt-2 gap-2">
|
||||
<small class="text-muted" id="chirp_time">0:00 / 0:00</small>
|
||||
<div class="ms-auto d-flex gap-2">
|
||||
<button class="btn btn-sm btn-primary" id="chirp_play">▶ Play</button>
|
||||
<button class="btn btn-sm btn-primary" id="chirp_play">▶ Spela</button>
|
||||
<button class="btn btn-sm btn-secondary" id="chirp_stop">■ Stop</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -90,17 +90,17 @@
|
||||
});
|
||||
|
||||
audio.addEventListener("play", () => {
|
||||
btnPlay.innerHTML = "❚❚ Pause";
|
||||
btnPlay.innerHTML = "❚❚ Paus";
|
||||
raf = requestAnimationFrame(tick);
|
||||
});
|
||||
|
||||
audio.addEventListener("pause", () => {
|
||||
btnPlay.innerHTML = "▶ Play";
|
||||
btnPlay.innerHTML = "▶ Spela";
|
||||
cancelAnimationFrame(raf);
|
||||
});
|
||||
|
||||
audio.addEventListener("ended", () => {
|
||||
btnPlay.innerHTML = "▶ Play";
|
||||
btnPlay.innerHTML = "▶ Spela";
|
||||
cancelAnimationFrame(raf);
|
||||
tick();
|
||||
});
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<div class="d-flex align-items-center mt-2 gap-2">
|
||||
<small class="text-muted" id="chirp2_time">0:00 / 0:00</small>
|
||||
<div class="ms-auto d-flex gap-2">
|
||||
<button class="btn btn-sm btn-primary" id="chirp2_play">▶ Play</button>
|
||||
<button class="btn btn-sm btn-primary" id="chirp2_play">▶ Spela</button>
|
||||
<button class="btn btn-sm btn-secondary" id="chirp2_stop">■ Stop</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -95,17 +95,17 @@
|
||||
});
|
||||
|
||||
audio.addEventListener("play", () => {
|
||||
btnPlay.innerHTML = "❚❚ Pause";
|
||||
btnPlay.innerHTML = "❚❚ Paus";
|
||||
raf = requestAnimationFrame(tick);
|
||||
});
|
||||
|
||||
audio.addEventListener("pause", () => {
|
||||
btnPlay.innerHTML = "▶ Play";
|
||||
btnPlay.innerHTML = "▶ Spela";
|
||||
cancelAnimationFrame(raf);
|
||||
});
|
||||
|
||||
audio.addEventListener("ended", () => {
|
||||
btnPlay.innerHTML = "▶ Play";
|
||||
btnPlay.innerHTML = "▶ Spela";
|
||||
cancelAnimationFrame(raf);
|
||||
tick();
|
||||
});
|
||||
|
||||
@@ -1,20 +1,20 @@
|
||||
<html>
|
||||
<div class="text-start" id="attenuator-calculator">
|
||||
<p>Mit diesem Applet können symmetrische T- und Pi-Dämpfungsglieder für ein 50-Ω-System berechnet werden.</p>
|
||||
<p>Med den här appleten kan du beräkna symmetriska T- och pi-dämpsatser för ett 50-Ω-system.</p>
|
||||
|
||||
<div class="row g-3 align-items-end">
|
||||
<div class="col-12 col-sm-6">
|
||||
<label class="form-label" for="attenuator-db">Dämpfung in dB</label>
|
||||
<label class="form-label" for="attenuator-db">Dämpning i dB</label>
|
||||
<input class="form-control" id="attenuator-db" type="number" min="0.1" max="100" step="0.1" value="6" inputmode="decimal">
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-sm-6">
|
||||
<label class="form-label" for="attenuator-impedance">Systemimpedanz</label>
|
||||
<label class="form-label" for="attenuator-impedance">Systemimpedans</label>
|
||||
<input class="form-control" id="attenuator-impedance" type="text" value="50 Ω" readonly>
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-sm-6">
|
||||
<span class="form-label d-block">Schaltungsform</span>
|
||||
<span class="form-label d-block">Kopplingsform</span>
|
||||
<div class="form-check form-check-inline">
|
||||
<input class="form-check-input" id="attenuator-pi" type="radio" name="attenuator-topology" value="pi" checked>
|
||||
<label class="form-check-label" for="attenuator-pi">Pi</label>
|
||||
@@ -26,7 +26,7 @@
|
||||
</div>
|
||||
|
||||
<div class="col-12 col-sm-6">
|
||||
<label class="form-label" for="attenuator-series">Normreihe</label>
|
||||
<label class="form-label" for="attenuator-series">Standardserie</label>
|
||||
<select class="form-select" id="attenuator-series">
|
||||
<option value="E12">E12</option>
|
||||
<option value="E24" selected>E24</option>
|
||||
@@ -39,13 +39,13 @@
|
||||
<p class="text-danger mt-3" id="attenuator-error" role="alert" hidden></p>
|
||||
|
||||
<div class="mt-4" id="attenuator-output">
|
||||
<p class="mb-1">Die idealen Widerstandswerte betragen:</p>
|
||||
<p class="mb-1">De ideala motståndsvärdena är:</p>
|
||||
<div id="attenuator-ideal-result"></div>
|
||||
|
||||
<p class="mb-1">Die nächsten Widerstandswerte aus der <span id="attenuator-series-name">E24</span>-Reihe betragen:</p>
|
||||
<p class="mb-1">De närmaste motståndsvärdena ur <span id="attenuator-series-name">E24</span>-serien är:</p>
|
||||
<div id="attenuator-standard-result"></div>
|
||||
|
||||
<p class="mb-1">Mit diesen Normwerten wird folgende Dämpfung erreicht:</p>
|
||||
<p class="mb-1">Med dessa standardvärden uppnås följande dämpning:</p>
|
||||
<div id="attenuator-achieved-result"></div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -73,7 +73,7 @@
|
||||
let katexWaitTimer = null;
|
||||
|
||||
function decimalLatex(value, maximumFractionDigits, minimumFractionDigits = 0) {
|
||||
return value.toLocaleString("de-DE", {
|
||||
return value.toLocaleString("sv-SE", {
|
||||
maximumFractionDigits: maximumFractionDigits,
|
||||
minimumFractionDigits: minimumFractionDigits,
|
||||
useGrouping: false
|
||||
@@ -204,7 +204,7 @@
|
||||
const seriesName = seriesSelect.value;
|
||||
|
||||
if (!Number.isFinite(attenuation) || attenuation <= 0 || attenuation > 100) {
|
||||
error.textContent = "Bitte eine Dämpfung zwischen 0,1 dB und 100 dB eingeben.";
|
||||
error.textContent = "Ange en dämpning mellan 0,1 dB och 100 dB.";
|
||||
error.hidden = false;
|
||||
output.hidden = true;
|
||||
return;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<html>
|
||||
<iframe
|
||||
class="circuitjs-simulation"
|
||||
title="Interaktive DSP-Simulation"
|
||||
title="Interaktiv DSP-simulering"
|
||||
width="100%"
|
||||
height="600"
|
||||
style="border: 0;"
|
||||
|
||||
@@ -31,29 +31,29 @@
|
||||
}
|
||||
</style>
|
||||
|
||||
Das folgende Applet visualisiert eine mögliche Filtermethode für die Einseitenbandmodulation. Mit den Buttons kann zwischen LSB und USB gewechselt werden. Die Frequenzen und das Spektrum werden entsprechend angepasst.<br><br>
|
||||
Följande applet visar en möjlig filtermetod för enkelsidbandsmodulation (SSB). Med knapparna kan du växla mellan LSB och USB. Frekvenserna och spektrumet anpassas därefter..<br><br>
|
||||
|
||||
<section class="dsp-filter-applet" aria-label="Filtermethode für Einseitenbandmodulation">
|
||||
<div class="btn-group dsp-filter-applet-controls" role="group" aria-label="Seitenband auswählen">
|
||||
<section class="dsp-filter-applet" aria-label="Filtermetod för enkelsidbandsmodulation">
|
||||
<div class="btn-group dsp-filter-applet-controls" role="group" aria-label="Välj sidband">
|
||||
<button type="button" class="btn btn-primary" data-sideband="lsb" aria-pressed="true">LSB</button>
|
||||
<button type="button" class="btn btn-outline-primary" data-sideband="usb" aria-pressed="false">USB</button>
|
||||
</div>
|
||||
|
||||
<div data-sideband-panel="lsb">
|
||||
<figure>
|
||||
<img src="pictures/831.svg" alt="Frequenzen mit der Filtermethode bei LSB">
|
||||
<img src="pictures/831.svg" alt="Frekvenser med filtermetoden vid LSB">
|
||||
</figure>
|
||||
<figure>
|
||||
<img src="pictures/940.svg" alt="Spektrum mit der Filtermethode bei LSB">
|
||||
<img src="pictures/940.svg" alt="Spektrum med filtermetoden vid LSB">
|
||||
</figure>
|
||||
</div>
|
||||
|
||||
<div data-sideband-panel="usb" hidden>
|
||||
<figure>
|
||||
<img src="pictures/832.svg" alt="Frequenzen mit der Filtermethode bei USB">
|
||||
<img src="pictures/832.svg" alt="Frekvenser med filtermetoden vid USB">
|
||||
</figure>
|
||||
<figure>
|
||||
<img src="pictures/941.svg" alt="Spektrum mit der Filtermethode bei USB">
|
||||
<img src="pictures/941.svg" alt="Spektrum med filtermetoden vid USB">
|
||||
</figure>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
Mit dem folgenden Applet kann man beide Halbperioden getrennt anschauen.<br><br>
|
||||
Med följande applet kan du titta på de båda halvperioderna var för sig.<br><br>
|
||||
|
||||
<html>
|
||||
<script src="https://www.50ohm.de/assets/jquery/3.7.1/jquery.min.js"></script>
|
||||
<script src="https://www.50ohm.de/assets/chartjs/4.4.1/chart.min.js"></script>
|
||||
|
||||
<button id="button0">Keine Aktion</button>
|
||||
<button id="button1">1. Halbperiode</button>
|
||||
<button id="button2">2. Halbperiode</button>
|
||||
<button id="button0">Ingen åtgärd</button>
|
||||
<button id="button1">Halvperiod 1</button>
|
||||
<button id="button2">Halvperiod 2</button>
|
||||
|
||||
<img id="GR1" width="100%"/>
|
||||
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
Mit dem folgenden Applet kann man beide Halbperioden getrennt anschauen.<br><br>
|
||||
Med följande applet kan du titta på de båda halvperioderna var för sig.<br><br>
|
||||
|
||||
<html>
|
||||
<script src="https://www.50ohm.de/assets/jquery/3.7.1/jquery.min.js"></script>
|
||||
<script src="https://www.50ohm.de/assets/chartjs/4.4.1/chart.min.js"></script>
|
||||
|
||||
<button id="button0">Keine Aktion</button>
|
||||
<button id="button1">1. Halbperiode</button>
|
||||
<button id="button2">2. Halbperiode</button>
|
||||
<button id="button0">Ingen åtgärd</button>
|
||||
<button id="button1">Halvperiod 1</button>
|
||||
<button id="button2">Halvperiod 2</button>
|
||||
|
||||
<img id="GR1" width="100%"/>
|
||||
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<p>Phase:</p>
|
||||
<p>Fas:</p>
|
||||
</td>
|
||||
<td>
|
||||
<input type="range" class="slider" value="90" min="0" max="360" id="phase">
|
||||
@@ -36,7 +36,7 @@
|
||||
data: [],
|
||||
},
|
||||
{
|
||||
label: "Überlagerung",
|
||||
label: "Överlagrad signal",
|
||||
fill: false,
|
||||
pointRadius: 0,
|
||||
borderColor: "#40C08C",
|
||||
@@ -50,7 +50,7 @@
|
||||
x: {
|
||||
title: {
|
||||
display: true,
|
||||
text: 'Zeit'
|
||||
text: 'Tid'
|
||||
},
|
||||
ticks: {
|
||||
callback: function (val, index) {
|
||||
@@ -77,7 +77,7 @@
|
||||
labels: [],
|
||||
datasets: [
|
||||
{
|
||||
label: "Summiertes Signal",
|
||||
label: "Summerad signal",
|
||||
fill: false,
|
||||
pointRadius: 0,
|
||||
borderColor: "#ED7D71",
|
||||
@@ -99,7 +99,7 @@
|
||||
x: {
|
||||
title: {
|
||||
display: true,
|
||||
text: 'Zeit'
|
||||
text: 'Tid'
|
||||
},
|
||||
ticks: {
|
||||
callback: function (val, index) {
|
||||
@@ -125,30 +125,30 @@
|
||||
});
|
||||
|
||||
function generateValues(i1, i2, step = 1) {
|
||||
// Reset all values:
|
||||
interferenz.data.datasets[0].data = []; // Nutzsignal
|
||||
interferenz.data.datasets[1].data = []; // Gefadetes Signal
|
||||
// Återställ alla värden:
|
||||
interferenz.data.datasets[0].data = []; // nyttosignal
|
||||
interferenz.data.datasets[1].data = []; // fadad signal
|
||||
sum.data.datasets[0].data = [];
|
||||
sum.data.labels = [];
|
||||
interferenz.data.labels = [];
|
||||
|
||||
// Generate new Data:
|
||||
// Generera nya data:
|
||||
for (let x = i1; x <= i2; x += step) {
|
||||
// Nutzsignal:
|
||||
// nyttosignal:
|
||||
interferenz.data.datasets[0].data.push(100 * Math.sin(x));
|
||||
interferenz.data.labels.push(x);
|
||||
// Gefadetes Signal:
|
||||
// fadad signal:
|
||||
interferenz.data.datasets[1].data.push(amplitude * Math.sin(x + (phase / 360) * 2 * Math.PI));
|
||||
// Set Sum:
|
||||
// Sätt summa:
|
||||
sum.data.datasets[0].data.push(100 * Math.sin(x) + amplitude * Math.sin(x + (phase / 360) * 2 * Math.PI))
|
||||
sum.data.labels.push(x);
|
||||
}
|
||||
|
||||
// Update Graphs
|
||||
// Uppdatera diagram
|
||||
interferenz.update();
|
||||
sum.update();
|
||||
|
||||
// Set Text:
|
||||
// Sätt text:
|
||||
$('#phaseV').html(phase + "°");
|
||||
|
||||
}
|
||||
|
||||
@@ -28,11 +28,11 @@
|
||||
<br>
|
||||
<canvas id="IQ" style="width:100%; min-height:100px; max-width:600px"></canvas>
|
||||
|
||||
$A=$<div id="ares" style="display:inline;">0</div> und $\phi=$<div id="phires" style="display:inline;">0</div>
|
||||
$A=$<div id="ares" style="display:inline;">0</div> och $\phi=$<div id="phires" style="display:inline;">0</div>
|
||||
|
||||
<canvas id="SUM" style="width:100%; min-height:100px; max-width:600px"></canvas>
|
||||
<br>
|
||||
Man kann das auch als Konstellationsdiagramm betrachten:
|
||||
Du kan också betrakta det som ett konstellationsdiagram:
|
||||
<br>
|
||||
<canvas id="KONST" style="max-height:200px; max-width:200px"></canvas>
|
||||
|
||||
@@ -46,14 +46,14 @@
|
||||
labels: [],
|
||||
datasets: [
|
||||
{
|
||||
label: "I-Anteil",
|
||||
label: "I-komponent",
|
||||
fill: false,
|
||||
pointRadius: 0,
|
||||
borderColor: "#00AEDF",
|
||||
data: [],
|
||||
},
|
||||
{
|
||||
label: "Q-Anteil",
|
||||
label: "Q-komponent",
|
||||
fill: false,
|
||||
pointRadius: 0,
|
||||
borderColor: "#40C08C",
|
||||
@@ -67,7 +67,7 @@
|
||||
x: {
|
||||
title: {
|
||||
display: true,
|
||||
text: 'Zeit'
|
||||
text: 'Tid'
|
||||
},
|
||||
ticks: {
|
||||
callback: function(val, index) {
|
||||
@@ -94,7 +94,7 @@
|
||||
labels: [],
|
||||
datasets: [
|
||||
{
|
||||
label: "Summiertes IQ-Signal",
|
||||
label: "Summerad IQ-signal",
|
||||
fill: false,
|
||||
pointRadius: 0,
|
||||
borderColor: "#ED7D71",
|
||||
@@ -116,7 +116,7 @@
|
||||
x: {
|
||||
title: {
|
||||
display: true,
|
||||
text: 'Zeit'
|
||||
text: 'Tid'
|
||||
},
|
||||
ticks: {
|
||||
callback: function(val, index) {
|
||||
@@ -135,7 +135,7 @@
|
||||
labels: [],
|
||||
datasets: [
|
||||
{
|
||||
label: "IQ-Signal",
|
||||
label: "IQ-signal",
|
||||
fill: false,
|
||||
pointRadius: 5,
|
||||
borderColor: "#ED7D71",
|
||||
|
||||
@@ -115,37 +115,37 @@
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="iq169-applet" aria-label="I/Q-Modulation im Format 16 zu 9">
|
||||
<div class="iq169-applet" aria-label="I/Q-modulation i formatet 16:9">
|
||||
<div class="iq169-controls">
|
||||
<label style="color:var(--iq169-i)"><var>I</var></label>
|
||||
<input data-iq169-i type="range" min="-100" max="100" step="1" value="50" aria-label="I-Anteil">
|
||||
<input data-iq169-i type="range" min="-100" max="100" step="1" value="50" aria-label="I-komponent">
|
||||
<output data-iq169-i-output>50 %</output>
|
||||
|
||||
<label style="color:var(--iq169-q)"><var>Q</var></label>
|
||||
<input data-iq169-q type="range" min="-100" max="100" step="1" value="50" aria-label="Q-Anteil">
|
||||
<input data-iq169-q type="range" min="-100" max="100" step="1" value="50" aria-label="Q-komponent">
|
||||
<output data-iq169-q-output>50 %</output>
|
||||
</div>
|
||||
|
||||
<div class="iq169-content">
|
||||
<div class="iq169-waves">
|
||||
<figure>
|
||||
<figcaption>I- und Q-Anteil</figcaption>
|
||||
<figcaption>I- och Q-komponent</figcaption>
|
||||
<div class="iq169-canvas-wrap">
|
||||
<canvas data-iq169-parts aria-label="I- und Q-Anteil"></canvas>
|
||||
<canvas data-iq169-parts aria-label="I- och Q-komponent"></canvas>
|
||||
</div>
|
||||
</figure>
|
||||
<figure>
|
||||
<figcaption>Summiertes I/Q-Signal</figcaption>
|
||||
<figcaption>Summerad I/Q-signal</figcaption>
|
||||
<div class="iq169-canvas-wrap">
|
||||
<canvas data-iq169-sum aria-label="Summiertes I/Q-Signal"></canvas>
|
||||
<canvas data-iq169-sum aria-label="Summerad I/Q-signal"></canvas>
|
||||
</div>
|
||||
</figure>
|
||||
</div>
|
||||
|
||||
<figure class="iq169-constellation-panel">
|
||||
<figcaption>Konstellationsdiagramm</figcaption>
|
||||
<figcaption>Konstellationsdiagram</figcaption>
|
||||
<div class="iq169-canvas-wrap">
|
||||
<canvas data-iq169-constellation aria-label="Konstellationsdiagramm"></canvas>
|
||||
<canvas data-iq169-constellation aria-label="Konstellationsdiagram"></canvas>
|
||||
</div>
|
||||
<div class="iq169-result">
|
||||
<span><var>A</var> = <strong data-iq169-a>71 %</strong></span>
|
||||
|
||||
@@ -86,25 +86,25 @@
|
||||
}
|
||||
</style>
|
||||
|
||||
<section class="iq-pointer-applet" aria-label="Zeiger mit Sinus- und Cosinusprojektion">
|
||||
<section class="iq-pointer-applet" aria-label="Visare med sinus- och cosinusprojektion">
|
||||
<div class="iq-pointer-controls">
|
||||
<label>Amplitude <var>A</var></label>
|
||||
<label>Amplitud <var>A</var></label>
|
||||
<input data-iq-amplitude type="range" min="0" max="1" step="0.01" value="0.75"
|
||||
aria-label="Amplitude A">
|
||||
aria-label="Amplitud A">
|
||||
<output data-iq-amplitude-output>0,75</output>
|
||||
|
||||
<label>Phase <var>φ</var></label>
|
||||
<label>Fas <var>φ</var></label>
|
||||
<input data-iq-phase type="range" min="-180" max="180" step="1" value="0"
|
||||
aria-label="Phase Phi">
|
||||
aria-label="Fas fi">
|
||||
<output data-iq-phase-output>0°</output>
|
||||
|
||||
<button data-iq-toggle type="button" class="btn btn-outline-primary btn-sm iq-pointer-toggle"
|
||||
aria-pressed="false">Zeiger drehen lassen</button>
|
||||
aria-pressed="false">Låt visaren rotera</button>
|
||||
</div>
|
||||
|
||||
<figure>
|
||||
<figcaption data-iq-caption>Anfangszustand des Symbols bei <var>t</var> = 0</figcaption>
|
||||
<canvas data-iq-diagram aria-label="Zeiger sowie daraus entstehende Sinus- und Cosinusschwingung"></canvas>
|
||||
<figcaption data-iq-caption>Symbolens begynnelsetillstånd vid <var>t</var> = 0</figcaption>
|
||||
<canvas data-iq-diagram aria-label="Visare samt den sinus- och cosinussvängning som uppstår"></canvas>
|
||||
</figure>
|
||||
|
||||
<div class="iq-pointer-values" aria-live="polite">
|
||||
@@ -115,7 +115,7 @@
|
||||
</div>
|
||||
|
||||
<p class="iq-pointer-note" data-iq-note>
|
||||
Bei <var>t</var> = 0 ist die waagerechte Projektion der I-Anteil und die senkrechte Projektion der Q-Anteil.
|
||||
Vid <var>t</var> = 0 är den vågräta projektionen I-komponenten och den lodräta projektionen Q-komponenten.
|
||||
</p>
|
||||
|
||||
<script>
|
||||
@@ -138,7 +138,7 @@
|
||||
|
||||
function formatNumber(value) {
|
||||
const normalized = Math.abs(value) < .005 ? 0 : value;
|
||||
return normalized.toLocaleString('de-DE', {
|
||||
return normalized.toLocaleString('sv-SE', {
|
||||
minimumFractionDigits: 2,
|
||||
maximumFractionDigits: 2
|
||||
});
|
||||
@@ -208,7 +208,7 @@
|
||||
ctx.font = (compact ? '11px' : '13px') + ' system-ui, sans-serif';
|
||||
ctx.fillStyle = textColor;
|
||||
|
||||
// I/Q-Ebene und Kreisbahn
|
||||
// I/Q-plan och cirkelbana
|
||||
ctx.strokeStyle = gridColor;
|
||||
ctx.lineWidth = 1;
|
||||
ctx.beginPath();
|
||||
@@ -220,7 +220,7 @@
|
||||
ctx.fillText('I', cx + radius + 16, cy - 7);
|
||||
ctx.fillText('Q', cx + 7, cy - radius - 13);
|
||||
|
||||
// Phasenwinkel nur beim Anfangszustand
|
||||
// fasvinkel endast i begynnelsetillståndet
|
||||
if (!running && Math.abs(phase) > .02) {
|
||||
const angleRadius = radius * .27;
|
||||
ctx.strokeStyle = vectorColor;
|
||||
@@ -233,18 +233,18 @@
|
||||
ctx.fillText('φ', cx + angleRadius * 1.35 * Math.cos(phase / 2), cy - angleRadius * 1.35 * Math.sin(phase / 2));
|
||||
}
|
||||
|
||||
// Rotierender Zeiger
|
||||
// roterande visare
|
||||
if (amplitude > 0) arrow(ctx, cx, cy, tipX, tipY, vectorColor, 3);
|
||||
ctx.fillStyle = vectorColor;
|
||||
ctx.beginPath(); ctx.arc(tipX, tipY, 4.5, 0, 2 * Math.PI); ctx.fill();
|
||||
|
||||
// Sinusschwingung rechts: senkrechte Projektion
|
||||
// sinussvängning åt höger: lodrät projektion
|
||||
ctx.strokeStyle = axisColor;
|
||||
arrow(ctx, rightStart, cy, rightEnd, cy, axisColor, 1);
|
||||
line(ctx, rightStart, cy + radius + 8, rightStart, cy - radius - 8);
|
||||
ctx.fillStyle = qColor;
|
||||
ctx.font = '600 ' + (compact ? '10px' : '12px') + ' system-ui, sans-serif';
|
||||
ctx.fillText('Q: Sinus', rightStart, cy - radius - 13);
|
||||
ctx.fillText('Q: sinus', rightStart, cy - radius - 13);
|
||||
ctx.strokeStyle = qColor;
|
||||
ctx.lineWidth = 2.5;
|
||||
ctx.beginPath();
|
||||
@@ -256,13 +256,13 @@
|
||||
}
|
||||
ctx.stroke();
|
||||
|
||||
// Cosinusschwingung nach unten: waagerechte Projektion
|
||||
// cosinussvängning nedåt: vågrät projektion
|
||||
ctx.strokeStyle = axisColor;
|
||||
arrow(ctx, cx, bottomStart, cx, bottomEnd, axisColor, 1);
|
||||
line(ctx, cx - radius - 8, bottomStart, cx + radius + 8, bottomStart);
|
||||
ctx.fillStyle = iColor;
|
||||
ctx.font = '600 ' + (compact ? '10px' : '12px') + ' system-ui, sans-serif';
|
||||
ctx.fillText('I: Cosinus', cx + radius + 13, bottomStart + 4);
|
||||
ctx.fillText('I: cosinus', cx + radius + 13, bottomStart + 4);
|
||||
ctx.strokeStyle = iColor;
|
||||
ctx.lineWidth = 2.5;
|
||||
ctx.beginPath();
|
||||
@@ -274,7 +274,7 @@
|
||||
}
|
||||
ctx.stroke();
|
||||
|
||||
// Projektionen des aktuellen Augenblickswerts
|
||||
// projektioner av det aktuella ögonblicksvärdet
|
||||
ctx.setLineDash([5, 4]);
|
||||
ctx.lineWidth = 1.5;
|
||||
ctx.strokeStyle = qColor;
|
||||
@@ -308,15 +308,15 @@
|
||||
running = enabled;
|
||||
timePhase = 0;
|
||||
toggleButton.setAttribute('aria-pressed', String(enabled));
|
||||
toggleButton.textContent = enabled ? 'Anfangszustand anzeigen' : 'Zeiger drehen lassen';
|
||||
toggleButton.textContent = enabled ? 'Visa begynnelsetillstånd' : 'Låt visaren rotera';
|
||||
toggleButton.classList.toggle('btn-primary', enabled);
|
||||
toggleButton.classList.toggle('btn-outline-primary', !enabled);
|
||||
caption.innerHTML = enabled
|
||||
? 'Laufender Zeiger und seine beiden Projektionen'
|
||||
: 'Anfangszustand des Symbols bei <var>t</var> = 0';
|
||||
? 'Roterande visare och dess två projektioner'
|
||||
: 'Symbolens begynnelsetillstånd vid <var>t</var> = 0';
|
||||
note.innerHTML = enabled
|
||||
? 'Die gestrichelten Linien verbinden die Zeigerspitze mit den momentanen Werten beider Schwingungen.'
|
||||
: 'Bei <var>t</var> = 0 ist die waagerechte Projektion der I-Anteil und die senkrechte Projektion der Q-Anteil.';
|
||||
? 'De streckade linjerna förbinder visarens spets med de momentana värdena för båda svängningarna.'
|
||||
: 'Vid <var>t</var> = 0 är den vågräta projektionen I-komponenten och den lodräta projektionen Q-komponenten.';
|
||||
update();
|
||||
}
|
||||
|
||||
|
||||
@@ -3,17 +3,17 @@
|
||||
<html>
|
||||
<script src="https://www.50ohm.de/assets/jquery/3.7.1/jquery.min.js"></script>
|
||||
<script src="https://www.50ohm.de/assets/chartjs/4.4.1/chart.min.js"></script>
|
||||
<p>Hier gibt es die Möglichkeit das Ganze nochmal auszuprobieren. An dem Regler kann man die Wellenlänge $\lambda$ einstellen. Die Frequenz wird automatisch berechnet.</p>
|
||||
<p>Här kan du prova det hela en gång till. Med reglaget ställer du in våglängden $\lambda$. Frekvensen beräknas automatiskt.</p>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
Periode:
|
||||
Period:
|
||||
</td>
|
||||
<td>
|
||||
<input type="range" class="slider" value="69" min="50" max="1000" id="period">
|
||||
</td>
|
||||
<td>
|
||||
$\lambda$=<div id="twl" style="display:inline-block;">1s</div> und $f$=<div id="tfrequency" style="display:inline-block;">1Hz</div>
|
||||
$\lambda$=<div id="twl" style="display:inline-block;">1s</div> och $f$=<div id="tfrequency" style="display:inline-block;">1Hz</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -63,7 +63,7 @@
|
||||
max: 10,
|
||||
title: {
|
||||
display: true,
|
||||
text: 'Abstand'
|
||||
text: 'Avstånd'
|
||||
},
|
||||
ticks: {
|
||||
stepSize: 1,
|
||||
@@ -105,7 +105,7 @@
|
||||
|
||||
// Set Text:
|
||||
$('#twl').html(lambda+"m");
|
||||
$('#tfrequency').html((299.792458/lambda).toFixed(2)+" MHz");
|
||||
$('#tfrequency').html((299.792458/lambda).toFixed(2).replace(".", ",")+" MHz");
|
||||
}
|
||||
</script>
|
||||
</html>
|
||||
|
||||
@@ -129,9 +129,9 @@
|
||||
<!-- Controls -->
|
||||
<div class="controls">
|
||||
<div class="control-row">
|
||||
<span class="control-label">Abtastrate $f_\text{s}$:</span>
|
||||
<span class="control-label">Samplingsfrekvens $f_\text{s}$:</span>
|
||||
<input type="range" id="sliderFs" min="1.0" max="8.0" step="0.025" value="3.0">
|
||||
<span class="control-value" id="labelFs">3.0 kHz</span>
|
||||
<span class="control-value" id="labelFs">3,0 kHz</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
<div class="panel">
|
||||
<div class="panel-label">
|
||||
<span class="dot" style="background:var(--signal-color)"></span>
|
||||
Originalsignal — Sinus mit 1kHz
|
||||
Originalsignal — sinus på 1 kHz
|
||||
</div>
|
||||
<canvas id="canvasOriginal" height="300"></canvas>
|
||||
</div>
|
||||
@@ -148,7 +148,7 @@
|
||||
<div class="panel">
|
||||
<div class="panel-label">
|
||||
<span class="dot" style="background:var(--sample-color)"></span>
|
||||
Abgetastetes Signal
|
||||
Samplad signal
|
||||
</div>
|
||||
<canvas id="canvasSampled" height="300"></canvas>
|
||||
</div>
|
||||
@@ -157,15 +157,15 @@
|
||||
<div class="panel">
|
||||
<div class="panel-label">
|
||||
<span class="dot" style="background:var(--recon-color)"></span>
|
||||
Rekonstruiertes Signal
|
||||
Rekonstruerad signal
|
||||
</div>
|
||||
<canvas id="canvasRecon" height="300"></canvas>
|
||||
</div>
|
||||
|
||||
<!-- Info box -->
|
||||
<div class="info-box" id="infoBox">
|
||||
<strong>✓ Nyquist-Bedingung erfüllt:</strong>
|
||||
f<sub>s</sub> = 3.0 kHz ≥ 2 · 1 kHz. Das rekonstruierte Signal stimmt mit dem Original überein.
|
||||
<strong>✓ Nyquistvillkoret är uppfyllt:</strong>
|
||||
f<sub>s</sub> = 3,0 kHz ≥ 2 · 1 kHz. Den rekonstruerade signalen stämmer överens med originalet.
|
||||
</div><br>
|
||||
</div>
|
||||
</div>
|
||||
@@ -173,13 +173,13 @@
|
||||
|
||||
<script>
|
||||
// ============================================================
|
||||
// Signal- und Darstellungsparameter
|
||||
// Signal- och visningsparametrar
|
||||
// ============================================================
|
||||
const F_SIG = 1.0; // Signalfrequenz (normiert auf 1)
|
||||
const T_SHOW = 3.0; // Angezeigte Zeitdauer in Perioden
|
||||
const N_DRAW = 1000; // Stützpunkte für analoge Kurve
|
||||
const F_SIG = 1.0; // signalfrekvens (normerad till 1)
|
||||
const T_SHOW = 3.0; // visad tidslängd i perioder
|
||||
const N_DRAW = 1000; // punkter för den analoga kurvan
|
||||
|
||||
// Sinc-Funktion (normierte Version: sinc(u) = sin(πu)/(πu))
|
||||
// sinc-funktion (normerad version: sinc(u) = sin(πu)/(πu))
|
||||
function sinc(u) {
|
||||
if (Math.abs(u) < 1e-10) return 1.0;
|
||||
return Math.sin(Math.PI * u) / (Math.PI * u);
|
||||
@@ -190,7 +190,7 @@ function signal(t) {
|
||||
return Math.sin(2 * Math.PI * F_SIG * t);
|
||||
}
|
||||
|
||||
// Whittaker-Shannon-Rekonstruktion
|
||||
// Whittaker–Shannon-rekonstruktion
|
||||
function reconstruct(t, samples, fs) {
|
||||
let sum = 0;
|
||||
for (let n = 0; n < samples.length; n++) {
|
||||
@@ -200,7 +200,7 @@ function reconstruct(t, samples, fs) {
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// Canvas-Hilfsklasse
|
||||
// Hjälpklass för canvas
|
||||
// ============================================================
|
||||
class Plot {
|
||||
constructor(canvas, yMin=-1.3, yMax=1.3) {
|
||||
@@ -325,7 +325,7 @@ class Plot {
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// Globale Plot-Objekte
|
||||
// Globala plotobjekt
|
||||
// ============================================================
|
||||
let plotOrig, plotSamp, plotRecon;
|
||||
|
||||
@@ -336,11 +336,11 @@ function initPlots() {
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// Haupt-Render-Funktion
|
||||
// Huvudfunktion för rendering
|
||||
// ============================================================
|
||||
function render(fs) {
|
||||
// --- 1. Abtastwerte erzeugen ---
|
||||
const Ts = 1 / fs; // Abtastintervall (in Perioden des Signals)
|
||||
// --- 1. Skapa samplingsvärden ---
|
||||
const Ts = 1 / fs; // samplingsintervall (i signalperioder)
|
||||
const nSamples = Math.floor(T_SHOW * fs) + 2;
|
||||
const samples = [];
|
||||
for (let n = 0; n < nSamples; n++) {
|
||||
@@ -348,81 +348,84 @@ function render(fs) {
|
||||
samples.push({ t, y: signal(t) });
|
||||
}
|
||||
|
||||
// --- 2. Analoge Kurve erzeugen ---
|
||||
// --- 2. Skapa analog kurva ---
|
||||
const analogPts = [];
|
||||
for (let i = 0; i <= N_DRAW; i++) {
|
||||
const t = (i / N_DRAW) * T_SHOW;
|
||||
analogPts.push({ t, y: signal(t) });
|
||||
}
|
||||
|
||||
// --- 3. Rekonstruktion (Sinc-Interpolation) ---
|
||||
// --- 3. Rekonstruktion (sinc-interpolation) ---
|
||||
const reconPts = [];
|
||||
for (let i = 0; i <= N_DRAW; i++) {
|
||||
const t = (i / N_DRAW) * T_SHOW;
|
||||
reconPts.push({ t, y: reconstruct(t, samples, fs) });
|
||||
}
|
||||
|
||||
// --- 4. Panel 1: Original ---
|
||||
// --- 4. Panel 1: original ---
|
||||
plotOrig.clear();
|
||||
plotOrig.drawLine(analogPts, '#47ABE8', 2.2);
|
||||
|
||||
// --- 5. Panel 2: Samples (analog + stems) ---
|
||||
// --- 5. Panel 2: samplingar (analog + stolpar) ---
|
||||
plotSamp.clear();
|
||||
plotSamp.drawLine(analogPts, '#47ABE8', 1.5); // leicht gedämpft im Hintergrund
|
||||
plotSamp.drawLine(analogPts, '#47ABE8', 1.5); // svagt dämpad i bakgrunden
|
||||
plotSamp.drawStems(samples, '#FE756C');
|
||||
|
||||
// --- 6. Panel 3: Rekonstruktion ---
|
||||
// --- 6. Panel 3: rekonstruktion ---
|
||||
const nyquistOk = fs >= 2 * F_SIG;
|
||||
const reconColor = nyquistOk ? '#3BB583' : '#FE756C';
|
||||
plotRecon.clear();
|
||||
// Original als gestrichelte Referenz
|
||||
// Original som streckad referens
|
||||
const ctx = plotRecon.ctx;
|
||||
ctx.save();
|
||||
ctx.setLineDash([5, 5]);
|
||||
plotRecon.drawLine(analogPts, '#47ABE8', 1.2);
|
||||
ctx.setLineDash([]);
|
||||
ctx.restore();
|
||||
// Rekonstruiertes Signal
|
||||
// Rekonstruerad signal
|
||||
plotRecon.drawLine(reconPts, reconColor, 2.2);
|
||||
|
||||
// --- 7. UI-Updates ---
|
||||
// --- 7. UI-uppdateringar ---
|
||||
updateUI(fs, nyquistOk);
|
||||
}
|
||||
|
||||
// decimalkomma i visade värden
|
||||
function sv(s) { return String(s).replace(".", ","); }
|
||||
|
||||
function updateUI(fs, ok) {
|
||||
const infoBox = document.getElementById('infoBox');
|
||||
|
||||
const ratio = (fs / F_SIG).toFixed(2);
|
||||
const fAlias = Math.abs(fs - F_SIG).toFixed(2); // Aliasing-Frequenz (vereinfacht)
|
||||
const fAlias = Math.abs(fs - F_SIG).toFixed(2); // aliasfrekvens (förenklad)
|
||||
|
||||
|
||||
if (ok) {
|
||||
infoBox.style.borderLeftColor = '#1565c0';
|
||||
infoBox.style.background = '#DAEEFA';
|
||||
infoBox.innerHTML =
|
||||
`<strong>✓ Nyquist-Bedingung erfüllt:</strong> ` +
|
||||
`f<sub>s</sub> = ${fs.toFixed(2)} kHz ≥ 2 · ${F_SIG} kHz = ${(2*F_SIG).toFixed(2)} kHz. ` +
|
||||
`Das rekonstruierte Signal stimmt mit dem Original überein.`;
|
||||
`<strong>✓ Nyquistvillkoret är uppfyllt:</strong> ` +
|
||||
`f<sub>s</sub> = ${sv(fs.toFixed(2))} kHz ≥ 2 · ${sv(String(F_SIG))} kHz = ${sv((2*F_SIG).toFixed(2))} kHz. ` +
|
||||
`Den rekonstruerade signalen stämmer överens med originalet.`;
|
||||
} else {
|
||||
infoBox.style.borderLeftColor = '#c62828';
|
||||
infoBox.style.background = '#FFE3E2';
|
||||
infoBox.innerHTML =
|
||||
`<strong>⚠ Aliasing:</strong> f<sub>s</sub> = ${fs.toFixed(2)} kHz < 2 · ${F_SIG} kHz. ` +
|
||||
`Das rekonstruierte Signal erscheint mit Aliasing-Frequenz ` +
|
||||
`f<sub>Alias</sub> = |f<sub>s</sub> − f<sub>Signal</sub>| ≈ ${fAlias} kHz. ` +
|
||||
`Erhöhe die Abtastrate über ${(2*F_SIG).toFixed(1)} kHz, um das Signal korrekt darzustellen.`;
|
||||
`<strong>⚠ Aliasing:</strong> f<sub>s</sub> = ${sv(fs.toFixed(2))} kHz < 2 · ${sv(String(F_SIG))} kHz. ` +
|
||||
`Den rekonstruerade signalen uppträder med aliasfrekvensen ` +
|
||||
`f<sub>alias</sub> = |f<sub>s</sub> − f<sub>signal</sub>| ≈ ${sv(fAlias)} kHz. ` +
|
||||
`Öka samplingsfrekvensen över ${sv((2*F_SIG).toFixed(1))} kHz för att återge signalen korrekt.`;
|
||||
}
|
||||
}
|
||||
|
||||
// ============================================================
|
||||
// Event-Listener & Init
|
||||
// Händelselyssnare och init
|
||||
// ============================================================
|
||||
const slider = document.getElementById('sliderFs');
|
||||
const labelFs = document.getElementById('labelFs');
|
||||
|
||||
slider.addEventListener('input', () => {
|
||||
const fs = parseFloat(slider.value);
|
||||
labelFs.textContent = fs.toFixed(2) + ' kHz';
|
||||
labelFs.textContent = sv(fs.toFixed(2)) + ' kHz';
|
||||
render(fs);
|
||||
});
|
||||
|
||||
@@ -436,11 +439,11 @@ function onResize() {
|
||||
|
||||
window.addEventListener('resize', onResize);
|
||||
|
||||
// Erst nach dem Laden initialisieren, wenn Canvas-Dimensionen bekannt sind
|
||||
// Initiera först efter laddning, när canvasdimensionerna är kända
|
||||
window.addEventListener('load', () => {
|
||||
initPlots();
|
||||
const fs = parseFloat(slider.value);
|
||||
labelFs.textContent = fs.toFixed(2) + ' kHz';
|
||||
labelFs.textContent = sv(fs.toFixed(2)) + ' kHz';
|
||||
render(fs);
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -1,18 +1,18 @@
|
||||
<div class="container" style="max-width:860px;">
|
||||
<div class="mb-2">
|
||||
<div class="small text-secondary fw-semibold mb-1">Modulierendes Signal (Nachricht)</div>
|
||||
<div class="small text-secondary fw-semibold mb-1">Modulerande signal (meddelande)</div>
|
||||
<canvas id="fmpm-c0" height="140" class="w-100 d-block rounded"></canvas>
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<div class="small text-secondary fw-semibold mb-1">Trägersignal (unmoduliert)</div>
|
||||
<div class="small text-secondary fw-semibold mb-1">Bärvåg (omodulerad)</div>
|
||||
<canvas id="fmpm-c1" height="70" class="w-100 d-block rounded"></canvas>
|
||||
</div>
|
||||
<div class="mb-2">
|
||||
<div class="small text-secondary fw-semibold mb-1">FM – Frequenz des Trägers folgt dem Signal-Wert</div>
|
||||
<div class="small text-secondary fw-semibold mb-1">FM – bärvågens frekvens följer signalvärdet</div>
|
||||
<canvas id="fmpm-c2" height="70" class="w-100 d-block rounded"></canvas>
|
||||
</div>
|
||||
<div class="mb-3">
|
||||
<div class="small text-secondary fw-semibold mb-1">PM – Phase des Trägers folgt dem Signal-Wert direkt</div>
|
||||
<div class="small text-secondary fw-semibold mb-1">PM – bärvågens fas följer signalvärdet direkt</div>
|
||||
<canvas id="fmpm-c3" height="70" class="w-100 d-block rounded"></canvas>
|
||||
</div>
|
||||
<hr>
|
||||
@@ -24,9 +24,9 @@
|
||||
<div class="col">
|
||||
<select class="form-select form-select-sm" id="fmpm-shape">
|
||||
<option value="sine">Sinus</option>
|
||||
<option value="square">Rechteck</option>
|
||||
<option value="saw">Sägezahn</option>
|
||||
<option value="ramp">Linearer Anstieg</option>
|
||||
<option value="square">Fyrkant</option>
|
||||
<option value="saw">Sågtand</option>
|
||||
<option value="ramp">Linjär ramp</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -92,22 +92,22 @@
|
||||
}
|
||||
</style>
|
||||
|
||||
<section class="qpsk-applet" aria-label="QPSK-Übertragung mit Rauschen">
|
||||
<section class="qpsk-applet" aria-label="QPSK-överföring med brus">
|
||||
<div class="qpsk-controls">
|
||||
<button data-qpsk-start type="button" class="btn btn-primary btn-sm">Übertragung starten</button>
|
||||
<button data-qpsk-new type="button" class="btn btn-outline-secondary btn-sm">Neuer Bitstrom</button>
|
||||
<button data-qpsk-start type="button" class="btn btn-primary btn-sm">Starta överföring</button>
|
||||
<button data-qpsk-new type="button" class="btn btn-outline-secondary btn-sm">Ny bitström</button>
|
||||
</div>
|
||||
|
||||
<div class="qpsk-noise-control">
|
||||
<label for="qpsk-noise">Rauschen</label>
|
||||
<label for="qpsk-noise">Brus</label>
|
||||
<input data-qpsk-noise id="qpsk-noise" type="range" min="0" max="60" step="1" value="18">
|
||||
<output data-qpsk-noise-output>18 %</output>
|
||||
</div>
|
||||
|
||||
<div data-qpsk-stream class="qpsk-stream" aria-label="Zu übertragender Bitstrom"></div>
|
||||
<div data-qpsk-stream class="qpsk-stream" aria-label="Bitström som ska överföras"></div>
|
||||
|
||||
<figure>
|
||||
<canvas data-qpsk-canvas aria-label="QPSK-Konstellationsdiagramm"></canvas>
|
||||
<canvas data-qpsk-canvas aria-label="QPSK-konstellationsdiagram"></canvas>
|
||||
</figure>
|
||||
|
||||
<script>
|
||||
@@ -223,7 +223,7 @@
|
||||
if (currentIndex >= symbols.length - 1) makeBitstream();
|
||||
running = true;
|
||||
startButton.disabled = true;
|
||||
startButton.textContent = 'Übertragung läuft …';
|
||||
startButton.textContent = 'Överföring pågår …';
|
||||
newButton.disabled = true;
|
||||
transmitNext();
|
||||
timer = window.setInterval(transmitNext, 420);
|
||||
@@ -234,7 +234,7 @@
|
||||
window.clearInterval(timer);
|
||||
startButton.disabled = false;
|
||||
newButton.disabled = false;
|
||||
startButton.textContent = finished ? 'Erneut übertragen' : 'Übertragung starten';
|
||||
startButton.textContent = finished ? 'Överför igen' : 'Starta överföring';
|
||||
}
|
||||
|
||||
function setupCanvas() {
|
||||
@@ -307,7 +307,7 @@
|
||||
ctx.fillStyle = 'rgba(22,138,173,.035)';
|
||||
ctx.fillRect(cx, cy, width - cx, height - cy);
|
||||
|
||||
// Kreis und Achsen
|
||||
// cirkel och axlar
|
||||
ctx.strokeStyle = 'rgba(120,130,140,.32)';
|
||||
ctx.lineWidth = 1;
|
||||
ctx.beginPath();
|
||||
@@ -321,7 +321,7 @@
|
||||
ctx.fillText('I', x(limit) - 7, cy - 9);
|
||||
ctx.fillText('Q', cx + 9, y(limit) + 11);
|
||||
|
||||
// Ideale Symbole und Beschriftungen
|
||||
// ideala symboler och etiketter
|
||||
symbolOrder.forEach(function (bits) {
|
||||
const symbol = mapping[bits];
|
||||
drawCross(ctx, x(symbol.i), y(symbol.q), 6, pointColors[bits]);
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
<script src="https://www.50ohm.de/assets/jquery/3.7.1/jquery.min.js"></script>
|
||||
<script src="https://www.50ohm.de/assets/chartjs/4.4.1/chart.min.js"></script>
|
||||
|
||||
<p>Hier kann die Fourier-Näherung eines symmetrischen Rechtecksignals mit einer variablen Anzahl ungerader Harmonischer untersucht werden. Die Schalter erlauben Werte von 1 bis 500.</p>
|
||||
<p>Här kan du undersöka Fourierapproximationen av en symmetrisk fyrkantsignal med ett valbart antal udda övertoner. Reglagen tillåter värden från 1 till 500.</p>
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td>Harmonische $N$:</td>
|
||||
<td>Övertoner $N$:</td>
|
||||
<td>
|
||||
<input type="range" id="harmonicsRange" min="1" max="499" value="1" step="2">
|
||||
</td>
|
||||
@@ -30,7 +30,7 @@
|
||||
data: {
|
||||
datasets: [
|
||||
{
|
||||
label: 'Rechteck ideal',
|
||||
label: 'Fyrkant, ideal',
|
||||
borderColor: '#ED7D71',
|
||||
backgroundColor: 'transparent',
|
||||
pointRadius: 0,
|
||||
@@ -38,7 +38,7 @@
|
||||
data: []
|
||||
},
|
||||
{
|
||||
label: 'Fourier-Näherung',
|
||||
label: 'Fourierapproximation',
|
||||
borderColor: '#00AEDF',
|
||||
backgroundColor: 'transparent',
|
||||
pointRadius: 0,
|
||||
@@ -71,7 +71,7 @@
|
||||
if (Math.abs(value + Math.PI) < 1e-8) return '-π';
|
||||
if (Math.abs(value - 1.5 * Math.PI) < 1e-8) return '3π/2';
|
||||
if (Math.abs(value + 1.5 * Math.PI) < 1e-8) return '-3π/2';
|
||||
return value.toFixed(2);
|
||||
return value.toFixed(2).replace(".", ",");
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -85,7 +85,7 @@
|
||||
ticks: {
|
||||
stepSize: 0.5,
|
||||
callback: function(value) {
|
||||
return value.toFixed(1);
|
||||
return value.toFixed(1).replace(".", ",");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
Mit dem folgenden Applet kann man beide Schaltzustände des Ringmodulators getrennt betrachten. Dabei werden die Schwellspannungen der Diode vernachlässigt und angenommen, dass die Übertrager 1:1 übertragen. Außerdem wird für $U_2$ eine rechteckförmige Spannung angenommen. Das führt dazu, dass hart umgeschaltet wird. Ein Ausgangsfilter muss die hohen Frequenzen, die dadurch entstehen, später filtern.<br><br>
|
||||
Med följande applet kan du titta på ringmodulatorns båda kopplingstillstånd var för sig. Dioderna antas sakna tröskelspänning och transformatorerna antas överföra 1:1. Dessutom antas en fyrkantsformad spänning för $U_2$, vilket ger hård omkoppling. Ett utgångsfilter måste sedan filtrera bort de höga frekvenser som uppstår.<br><br>
|
||||
|
||||
<html>
|
||||
<button id="button0">Keine Aktion</button>
|
||||
<button id="button0">Ingen åtgärd</button>
|
||||
<button id="button1">Fall 1: U₂ > 0, U₃ = U₁</button>
|
||||
<button id="button2">Fall 2: U₂ < 0, U₃ = −U₁</button>
|
||||
|
||||
<img id="ringmodulator" width="100%" style="display: block; margin-top: 1rem;" alt="Schaltzustände des Ringmodulators"/>
|
||||
<img id="ringmodulator" width="100%" style="display: block; margin-top: 1rem;" alt="Ringmodulatorns kopplingstillstånd"/>
|
||||
|
||||
<div id="ringmodulator-formula1" class="ringmodulator-formula" style="display: none; margin-top: 1rem;">
|
||||
Die Ausgangsspannung ergibt sich also zu:
|
||||
Utspänningen blir alltså:
|
||||
|
||||
<br>
|
||||
<br>
|
||||
@@ -18,11 +18,11 @@ Mit dem folgenden Applet kann man beide Schaltzustände des Ringmodulators getre
|
||||
<br>
|
||||
<br>
|
||||
|
||||
Die Multiplikation von $U_1$ und $U_2$ funktioniert!
|
||||
Multiplikationen av $U_1$ och $U_2$ fungerar!
|
||||
</div>
|
||||
|
||||
<div id="ringmodulator-formula2" class="ringmodulator-formula" style="display: none; margin-top: 1rem;">
|
||||
Die Ausgangsspannung ergibt sich also zu:
|
||||
Utspänningen blir alltså:
|
||||
|
||||
<br>
|
||||
<br>
|
||||
@@ -32,7 +32,7 @@ Mit dem folgenden Applet kann man beide Schaltzustände des Ringmodulators getre
|
||||
<br>
|
||||
<br>
|
||||
|
||||
Die Multiplikation von $U_1$ und $U_2$ funktioniert!
|
||||
Multiplikationen av $U_1$ och $U_2$ fungerar!
|
||||
</div>
|
||||
|
||||
<script>
|
||||
|
||||
@@ -2,11 +2,11 @@
|
||||
<script src="https://www.50ohm.de/assets/jquery/3.7.1/jquery.min.js"></script>
|
||||
<script src="https://www.50ohm.de/assets/chartjs/4.4.1/chart.min.js"></script>
|
||||
<link rel="stylesheet" href="https://www.50ohm.de/assets/katex/katex.min.css">
|
||||
<p>Hier gibt es die Möglichkeit das Ganze nochmal auszuprobieren. An den Reglern kann man die Amplitude $a$ und die Periode $T$ einer Sinusschwingung einstellen.</p>
|
||||
<p>Här kan du prova det hela en gång till. Med reglagen ställer du in amplituden $a$ och perioden $T$ för en sinussvängning.</p>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
Amplitude:
|
||||
Amplitud:
|
||||
</td>
|
||||
<td>
|
||||
<input type="range" class="slider" value="50" min="0" max="100" id="amplitude">
|
||||
@@ -17,13 +17,13 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
Periode:
|
||||
Period:
|
||||
</td>
|
||||
<td>
|
||||
<input type="range" class="slider" value="1" min="1" max="10" id="period">
|
||||
</td>
|
||||
<td>
|
||||
$T$=<div id="tperiod" style="display:inline-block;">1s</div> und $f$=<div id="tfrequency" style="display:inline-block;">1Hz</div>
|
||||
$T$=<div id="tperiod" style="display:inline-block;">1s</div> och $f$=<div id="tfrequency" style="display:inline-block;">1Hz</div>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
@@ -73,7 +73,7 @@
|
||||
max: 24,
|
||||
title: {
|
||||
display: true,
|
||||
text: 'Zeit'
|
||||
text: 'Tid'
|
||||
},
|
||||
ticks: {
|
||||
stepSize: 1,
|
||||
@@ -116,7 +116,7 @@
|
||||
// Set Text:
|
||||
$('#tamplitude').html(a+"%");
|
||||
$('#tperiod').html(p+"s");
|
||||
$('#tfrequency').html((1/p).toFixed(2)+" Hz");
|
||||
$('#tfrequency').html((1/p).toFixed(2).replace(".", ",")+" Hz");
|
||||
}
|
||||
</script>
|
||||
</html>
|
||||
@@ -85,20 +85,20 @@
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="traps-applet" aria-label="Wirksame Länge eines Trap-Dipols">
|
||||
<div class="traps-controls" role="group" aria-label="Anregungsfrequenz auswählen">
|
||||
<button type="button" data-traps-state="off" aria-pressed="true">Keine Anregung</button>
|
||||
<div class="traps-applet" aria-label="Effektiv längd hos en trapdipol">
|
||||
<div class="traps-controls" role="group" aria-label="Välj excitationsfrekvens">
|
||||
<button type="button" data-traps-state="off" aria-pressed="true">Ingen excitation</button>
|
||||
<button type="button" data-traps-state="3.5" aria-pressed="false">3,5 MHz</button>
|
||||
<button type="button" data-traps-state="7.05" aria-pressed="false">7,05 MHz</button>
|
||||
<button type="button" data-traps-state="14" aria-pressed="false">14 MHz</button>
|
||||
</div>
|
||||
|
||||
<div class="traps-visual">
|
||||
<img data-traps-image src="pictures/235.svg" alt="Trap-Dipol ohne Anregung">
|
||||
<img data-traps-image src="pictures/235.svg" alt="Trapdipol utan excitation">
|
||||
</div>
|
||||
|
||||
<p class="traps-state" data-traps-description aria-live="polite">
|
||||
<strong class="traps-relation">Keine Anregung:</strong> Kein Antennenteil ist aktiv.
|
||||
<strong class="traps-relation">Ingen excitation:</strong> Ingen del av antennen är aktiv.
|
||||
</p>
|
||||
|
||||
<script>
|
||||
@@ -110,23 +110,23 @@
|
||||
const states = {
|
||||
off: {
|
||||
image: 'pictures/235.svg',
|
||||
alt: 'Trap-Dipol ohne Anregung',
|
||||
description: '<strong class="traps-relation">Keine Anregung:</strong> Kein Antennenteil ist aktiv.'
|
||||
alt: 'Trapdipol utan excitation',
|
||||
description: '<strong class="traps-relation">Ingen excitation:</strong> Ingen del av antennen är aktiv.'
|
||||
},
|
||||
'14': {
|
||||
image: 'pictures/1136.svg',
|
||||
alt: 'Bei 14 Megahertz kann der Strom die Traps passieren und der gesamte Draht ist stromführend',
|
||||
description: '<strong class="traps-relation">14 MHz > 7,05 MHz:</strong> Die kapazitive Wirkung der Traps überwiegt – der Strahler wird elektrisch verkürzt.'
|
||||
alt: 'Vid 14 megahertz kan strömmen passera trapparna och hela tråden för ström',
|
||||
description: '<strong class="traps-relation">14 MHz > 7,05 MHz:</strong> Trapparnas kapacitiva verkan dominerar – strålaren förkortas elektriskt.'
|
||||
},
|
||||
'7.05': {
|
||||
image: 'pictures/1135.svg',
|
||||
alt: 'Bei 7,05 Megahertz ist nur der innere Teil des Trap-Dipols aktiv',
|
||||
description: '<strong class="traps-relation">7,05 MHz = f<sub>res</sub>:</strong> Die Traps sperren. Wirksame Länge: 2 × 10,07 m = 20,14 m.'
|
||||
alt: 'Vid 7,05 megahertz är bara den inre delen av trapdipolen aktiv',
|
||||
description: '<strong class="traps-relation">7,05 MHz = f<sub>res</sub>:</strong> Trapparna spärrar. Effektiv längd: 2 × 10,07 m = 20,14 m.'
|
||||
},
|
||||
'3.5': {
|
||||
image: 'pictures/1136.svg',
|
||||
alt: 'Bei 3,5 Megahertz ist der gesamte Trap-Dipol aktiv',
|
||||
description: '<strong class="traps-relation">3,5 MHz < 7,05 MHz:</strong> Die induktive Wirkung überwiegt – die Traps verlängern den Strahler elektrisch.'
|
||||
alt: 'Vid 3,5 megahertz är hela trapdipolen aktiv',
|
||||
description: '<strong class="traps-relation">3,5 MHz < 7,05 MHz:</strong> Den induktiva verkan dominerar – trapparna förlänger strålaren elektriskt.'
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<html>
|
||||
Auf dieser interaktiven Karte kann man sich APRS-Aussendungen anschauen:
|
||||
På den här interaktiva kartan kan du se APRS-utsändningar:
|
||||
<iframe
|
||||
width="100%"
|
||||
height="100%"
|
||||
src="https://aprs.fi/#!lat=51.2537&lng=9.4146">
|
||||
src="https://aprs.fi/#!lat=62&lng=15">
|
||||
</iframe>
|
||||
</html>
|
||||
@@ -4,7 +4,7 @@
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<p>Amplitude: </p>
|
||||
<p>Amplitud: </p>
|
||||
</td>
|
||||
<td>
|
||||
<input type="range" class="slider" value="80" min="0" max="100" id="amplitude">
|
||||
@@ -15,7 +15,7 @@
|
||||
</tr>
|
||||
<tr>
|
||||
<td>
|
||||
<p>Phase:</p>
|
||||
<p>Fas:</p>
|
||||
</td>
|
||||
<td>
|
||||
<input type="range" class="slider" value="180" min="0" max="360" id="phase">
|
||||
@@ -40,14 +40,14 @@
|
||||
labels: [],
|
||||
datasets: [
|
||||
{
|
||||
label: "Raumwelle",
|
||||
label: "Rymdvåg",
|
||||
fill: false,
|
||||
pointRadius: 0,
|
||||
borderColor: "#00AEDF",
|
||||
data: [],
|
||||
},
|
||||
{
|
||||
label: "Bodenwelle",
|
||||
label: "Markvåg",
|
||||
fill: false,
|
||||
pointRadius: 0,
|
||||
borderColor: "#40C08C",
|
||||
@@ -62,7 +62,7 @@
|
||||
x: {
|
||||
title: {
|
||||
display: true,
|
||||
text: 'Zeit'
|
||||
text: 'Tid'
|
||||
},
|
||||
ticks: {
|
||||
callback: function(val, index) {
|
||||
@@ -89,7 +89,7 @@
|
||||
labels: [],
|
||||
datasets: [
|
||||
{
|
||||
label: "Summiertes Signal",
|
||||
label: "Summerad signal",
|
||||
fill: false,
|
||||
pointRadius: 0,
|
||||
borderColor: "#ED7D71",
|
||||
@@ -112,7 +112,7 @@
|
||||
x: {
|
||||
title: {
|
||||
display: true,
|
||||
text: 'Zeit'
|
||||
text: 'Tid'
|
||||
},
|
||||
ticks: {
|
||||
callback: function(val, index) {
|
||||
@@ -140,7 +140,7 @@
|
||||
function generateValues(i1, i2, step = 1) {
|
||||
// Reset all values:
|
||||
fading.data.datasets[0].data = []; // Nutzsignal
|
||||
fading.data.datasets[1].data = []; // Gefadetes Signal
|
||||
fading.data.datasets[1].data = []; // fadad signal
|
||||
sum.data.datasets[0].data = [];
|
||||
sum.data.labels = [];
|
||||
fading.data.labels = [];
|
||||
@@ -150,7 +150,7 @@
|
||||
// Nutzsignal:
|
||||
fading.data.datasets[0].data.push(100*Math.sin(x));
|
||||
fading.data.labels.push(x);
|
||||
// Gefadetes Signal:
|
||||
// fadad signal:
|
||||
fading.data.datasets[1].data.push(amplitude*Math.sin(x+(phase/360)*2*Math.PI));
|
||||
// Set Sum:
|
||||
sum.data.datasets[0].data.push(100*Math.sin(x) + amplitude*Math.sin(x+(phase/360)*2*Math.PI))
|
||||
|
||||
@@ -68,16 +68,16 @@
|
||||
}
|
||||
</style>
|
||||
<br>
|
||||
<p><b>Zeit-/Frequenzdomäne</b></p>
|
||||
<p>Im folgenden Applett kann man das ausprobieren: Mit den Frequenzreglern kann man die Amplitude der einzelnen Sinusschwingungen erhöhen. Mit dem Preset "Rechteck" kann man sehen, dass ein Rechteck aus vielen Sinusschwingungen besteht.</p>
|
||||
<p><b>Tids- och frekvensdomän</b></p>
|
||||
<p>I följande applet kan du prova detta: Med frekvensreglagen kan du öka amplituden för de enskilda sinussvängningarna. Med förinställningen ”Fyrkant” ser du att en fyrkantvåg består av många sinussvängningar.</p>
|
||||
<div id="presets">
|
||||
Presets:
|
||||
Förinställningar:
|
||||
</div>
|
||||
<div id="cameraPresets">
|
||||
Ansicht:
|
||||
Vy:
|
||||
</div>
|
||||
<div id="numberOfFreqs">
|
||||
Anzahl Frequenzen:
|
||||
Antal frekvenser:
|
||||
<input type="range" id="numOfFreqs" min=1 max=30 value=9>
|
||||
</div>
|
||||
<div>
|
||||
@@ -112,7 +112,7 @@
|
||||
phases: []
|
||||
},
|
||||
{
|
||||
label: "Rechteck",
|
||||
label: "Fyrkant",
|
||||
defaultAmplitude: 0,
|
||||
amplitudes: amplitudesSquare,
|
||||
defaultPhase: 0,
|
||||
@@ -124,8 +124,8 @@
|
||||
|
||||
const cameraPresets = [
|
||||
{ label: "Standard", camera: 0, d: 3, theta: 90, phi: 48 },
|
||||
{ label: "Zeit", camera: 0, d: 3, theta: 20, phi: 48 },
|
||||
{ label: "Frequenz", camera: 0, d: 3, theta: 160, phi: 48 },
|
||||
{ label: "Tid", camera: 0, d: 3, theta: 20, phi: 48 },
|
||||
{ label: "Frekvens", camera: 0, d: 3, theta: 160, phi: 48 },
|
||||
// { label: "Zeit", camera: 1, d: 1, theta: 90, phi: 40 },
|
||||
// { label: "Frequenz", camera: 1, d: 1, theta: 90, phi: 0 }
|
||||
];
|
||||
@@ -240,7 +240,7 @@
|
||||
|
||||
function initFreqInput(norender = false) {
|
||||
const inputEl = document.getElementById("input");
|
||||
inputEl.innerHTML = '<div class="head"></div><div class="head">Amplitude</div><div class="head">Phase</div>';
|
||||
inputEl.innerHTML = '<div class="head"></div><div class="head">Amplitud</div><div class="head">Fas</div>';
|
||||
for (var i = 0; i < numOfFreqs; i++) {
|
||||
const labelEl = document.createElement("div");
|
||||
inputEl.appendChild(labelEl);
|
||||
|
||||
@@ -4,14 +4,14 @@
|
||||
<p>
|
||||
<div id="mapbox" width="100%">
|
||||
<canvas id="map">
|
||||
Your browser does not support HTML5 canvas.
|
||||
Din webbläsare stöder inte HTML5 canvas.
|
||||
</canvas>
|
||||
</div>
|
||||
</p>
|
||||
Aktuelle Zeit: <div id="twl" style="display:inline-block;">time</div>
|
||||
Aktuell tid: <div id="twl" style="display:inline-block;">time</div>
|
||||
<div id="slidebox" style="width: 100%;">
|
||||
<input type="range" class="slider" value="0" min="0" max="24" id="time" style="width: 100%;">
|
||||
<button onclick="drawDayNightMap(true)">Zurücksetzen</button>
|
||||
<button onclick="drawDayNightMap(true)">Återställ</button>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
@@ -901,7 +901,7 @@ Aktuelle Zeit: <div id="twl" style="display:inline-block;">time</div>
|
||||
date = new Date(current.getUTCFullYear(),current.getUTCMonth(),current.getDate(),hours,minutes)
|
||||
}
|
||||
performCalculations(date);
|
||||
$('#twl').html(date);
|
||||
$('#twl').html(date.toLocaleString('sv-SE'));
|
||||
|
||||
var northSun = DECsun >= 0;
|
||||
var startFrom = northSun? 0: (mapHeight - 1);
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
<html>
|
||||
Auf dieser interaktiven Karte kann man sich die Funkverbindungen im HAMNET anschauen:
|
||||
På den här interaktiva kartan kan du se radiolänkarna i HAMNET:
|
||||
<iframe
|
||||
width="100%"
|
||||
height="400"
|
||||
src="https://hamnetdb.net/map.cgi?site=db0hq">
|
||||
src="https://hamnetdb.net/map.cgi">
|
||||
</iframe>
|
||||
</html>
|
||||
@@ -3,11 +3,11 @@
|
||||
<script src="https://www.50ohm.de/assets/leaflet/leaflet.js"></script>
|
||||
<script src="https://www.50ohm.de/assets/leaflet/L.Maidenhead.js"></script>
|
||||
|
||||
Mit dieser interkativen Karte, kann man sich die Maidenhead-Locators anschauen. Wenn du immer weiter Reinzoomst kommst du zur DARC Geschäftsstelle.
|
||||
Med den här interaktiva kartan kan du titta på Maidenhead-lokatorer (QTH-lokatorer). Zooma in för att se rutnätet bli finare och hitta din egen lokator.
|
||||
<div id="map" style="width:100%; min-width: 600px; height: 400px; position: relative;"></div>
|
||||
|
||||
<script>
|
||||
const map = L.map('map').setView([51.266975978176504, 9.426289780347057], 2);
|
||||
const map = L.map('map').setView([62, 15], 4);
|
||||
|
||||
const tiles = L.tileLayer('https://tile.openstreetmap.org/{z}/{x}/{y}.png', {
|
||||
maxZoom: 19,
|
||||
|
||||
@@ -73,19 +73,19 @@
|
||||
}
|
||||
</style>
|
||||
|
||||
<div class="sq-applet" aria-label="Sampling und Quantisierung ausprobieren">
|
||||
<div class="sq-applet" aria-label="Prova sampling och kvantisering">
|
||||
<div class="sq-controls">
|
||||
<label>Zeit-Sampling:</label>
|
||||
<input data-sq-time type="range" value="4" min="1" max="10" step="1" aria-label="Samplingrate">
|
||||
<output data-sq-time-output>16 Samples/s</output>
|
||||
<label>Tidssampling:</label>
|
||||
<input data-sq-time type="range" value="4" min="1" max="10" step="1" aria-label="Samplingfrekvens">
|
||||
<output data-sq-time-output>16 sampel/s</output>
|
||||
|
||||
<label>Wert-Quantisierung:</label>
|
||||
<input data-sq-value type="range" value="16" min="1" max="16" step="1" aria-label="Quantisierungsbits">
|
||||
<output data-sq-value-output>16 Bit</output>
|
||||
<label>Värdekvantisering:</label>
|
||||
<input data-sq-value type="range" value="16" min="1" max="16" step="1" aria-label="Kvantiseringsbitar">
|
||||
<output data-sq-value-output>16 bit</output>
|
||||
</div>
|
||||
|
||||
<div class="sq-chart-wrap">
|
||||
<canvas data-sq-chart aria-label="Zeitkontinuierliches sowie zeit- und wertdiskretes Signal"></canvas>
|
||||
<canvas data-sq-chart aria-label="Tidskontinuerlig samt tids- och värdediskret signal"></canvas>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
@@ -104,7 +104,7 @@
|
||||
data: {
|
||||
datasets: [
|
||||
{
|
||||
label: 'Wert- und zeitdiskretes Signal',
|
||||
label: 'Värde- och tidsdiskret signal',
|
||||
data: [],
|
||||
borderColor: '#00AEDF',
|
||||
borderWidth: 2,
|
||||
@@ -113,7 +113,7 @@
|
||||
stepped: true
|
||||
},
|
||||
{
|
||||
label: 'Zeitkontinuierliches Signal',
|
||||
label: 'Tidskontinuerlig signal',
|
||||
data: [],
|
||||
borderColor: '#999999',
|
||||
borderWidth: 2,
|
||||
@@ -151,7 +151,7 @@
|
||||
x: {
|
||||
min: 0,
|
||||
max: duration,
|
||||
title: { display: true, text: 'Zeit' },
|
||||
title: { display: true, text: 'Tid' },
|
||||
ticks: {
|
||||
stepSize: 1,
|
||||
callback: function (value) { return value + ' s'; }
|
||||
@@ -186,8 +186,8 @@
|
||||
chart.data.datasets[0].data = quantized;
|
||||
chart.data.datasets[1].data = continuous;
|
||||
chart.update('none');
|
||||
timeOutput.textContent = samples + ' Samples/s';
|
||||
valueOutput.textContent = bits + ' Bit';
|
||||
timeOutput.textContent = samples + ' sampel/s';
|
||||
valueOutput.textContent = bits + ' bit';
|
||||
}
|
||||
|
||||
timeInput.addEventListener('input', update);
|
||||
|
||||
@@ -3,16 +3,16 @@
|
||||
<script src="https://www.50ohm.de/assets/chartjs/4.4.1/chart.min.js"></script>
|
||||
|
||||
<p>
|
||||
Durch Druck auf den nächsten Button, wird das Mikrofon des Browsers
|
||||
aktiviert. Danach kann man das Spektrum der eigenen Sprache betrachten.
|
||||
När du trycker på nästa knapp aktiveras webbläsarens mikrofon.
|
||||
Därefter kan du se spektrumet av din egen röst.
|
||||
</p>
|
||||
<p>
|
||||
<button onclick="start()">Mikrofon Einschalten</button>
|
||||
<button onclick="start()">Slå på mikrofonen</button>
|
||||
</p>
|
||||
<p>
|
||||
<canvas id="Spectrum" style="max-height:200px;"></canvas>
|
||||
</p>
|
||||
Stärkste Amplitude bei der Frequenz $f$ = <div id="mainfrequency" style="display:inline-block;">0</div> $\unit{\hertz}$<br>
|
||||
Starkaste amplitud vid frekvensen $f$ = <div id="mainfrequency" style="display:inline-block;">0</div> $\unit{\hertz}$<br>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
||||
@@ -64,7 +64,7 @@
|
||||
type: 'logarithmic',
|
||||
title: {
|
||||
display: true,
|
||||
text: 'Frequenz'
|
||||
text: 'Frekvens'
|
||||
},
|
||||
ticks: {
|
||||
callback: function(val, index) {
|
||||
@@ -103,7 +103,7 @@
|
||||
audioContext = new AudioContext();
|
||||
binSize = (audioContext.sampleRate) / fftSize; // Bin Size in Hz
|
||||
} catch (e) {
|
||||
alert('Die Web Audio API wird in diesem Browser leider nicht unterstützt!');
|
||||
alert('Web Audio API stöds tyvärr inte i den här webbläsaren!');
|
||||
}
|
||||
|
||||
const update = (timestamp) => {
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
<html>
|
||||
<script src="https://www.50ohm.de/assets/jquery/3.7.1/jquery.min.js"></script>
|
||||
<p>Hier kann man das Ganze interaktiv ausprobieren. Wenn der Abstrahlwinkel flach ist steigt die Reichweite. Ist der Abstrahlwinkel steil, so verkürzt sich die Reichweite.</p><br>
|
||||
<p>Här kan du prova det hela interaktivt. Om utstrålningsvinkeln är flack ökar räckvidden. Är utstrålningsvinkeln brant blir räckvidden kortare.</p><br>
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
Abstrahlwinkel $\alpha$:
|
||||
Utstrålningsvinkel $\alpha$:
|
||||
</td>
|
||||
<td>
|
||||
<input type="range" class="slider" value="0" min="0" max="90" id="beamAngle">
|
||||
@@ -15,7 +15,7 @@
|
||||
</tr>
|
||||
</table>
|
||||
<canvas id="myCanvas" style="border:0px; width:100%; display: block;">
|
||||
Sorry, your browser does not support canvas.
|
||||
Din webbläsare stöder inte canvas.
|
||||
</canvas>
|
||||
|
||||
<script>
|
||||
|
||||
Reference in New Issue
Block a user