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:
2026-10-10 15:03:03 +02:00
co-authored by Claude Sonnet 5.5
parent 0d034a0902
commit f7fa8cfbc1
3234 changed files with 84960 additions and 137393 deletions
+1 -1
View File
@@ -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;"
+4 -4
View File
@@ -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">&#9654; Play</button>
<button class="btn btn-sm btn-primary" id="cw_play">&#9654; Spela</button>
<button class="btn btn-sm btn-secondary" id="cw_stop">&#9632; Stop</button>
</div>
</div>
@@ -90,9 +90,9 @@
if (!audio.paused) raf = requestAnimationFrame(tick);
}
audio.addEventListener("play", () => { btnPlay.innerHTML = "&#10074;&#10074; Pause"; raf = requestAnimationFrame(tick); });
audio.addEventListener("pause", () => { btnPlay.innerHTML = "&#9654; Play"; cancelAnimationFrame(raf); });
audio.addEventListener("ended", () => { btnPlay.innerHTML = "&#9654; Play"; cancelAnimationFrame(raf); tick(); });
audio.addEventListener("play", () => { btnPlay.innerHTML = "&#10074;&#10074; Paus"; raf = requestAnimationFrame(tick); });
audio.addEventListener("pause", () => { btnPlay.innerHTML = "&#9654; Spela"; cancelAnimationFrame(raf); });
audio.addEventListener("ended", () => { btnPlay.innerHTML = "&#9654; Spela"; cancelAnimationFrame(raf); tick(); });
btnPlay.addEventListener("click", () => { audio.paused ? audio.play() : audio.pause(); });
+26 -26
View File
@@ -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>
+4 -4
View File
@@ -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">&#9654; Play</button>
<button class="btn btn-sm btn-primary" id="chirp_play">&#9654; Spela</button>
<button class="btn btn-sm btn-secondary" id="chirp_stop">&#9632; Stop</button>
</div>
</div>
@@ -90,17 +90,17 @@
});
audio.addEventListener("play", () => {
btnPlay.innerHTML = "&#10074;&#10074; Pause";
btnPlay.innerHTML = "&#10074;&#10074; Paus";
raf = requestAnimationFrame(tick);
});
audio.addEventListener("pause", () => {
btnPlay.innerHTML = "&#9654; Play";
btnPlay.innerHTML = "&#9654; Spela";
cancelAnimationFrame(raf);
});
audio.addEventListener("ended", () => {
btnPlay.innerHTML = "&#9654; Play";
btnPlay.innerHTML = "&#9654; Spela";
cancelAnimationFrame(raf);
tick();
});
+4 -4
View File
@@ -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">&#9654; Play</button>
<button class="btn btn-sm btn-primary" id="chirp2_play">&#9654; Spela</button>
<button class="btn btn-sm btn-secondary" id="chirp2_stop">&#9632; Stop</button>
</div>
</div>
@@ -95,17 +95,17 @@
});
audio.addEventListener("play", () => {
btnPlay.innerHTML = "&#10074;&#10074; Pause";
btnPlay.innerHTML = "&#10074;&#10074; Paus";
raf = requestAnimationFrame(tick);
});
audio.addEventListener("pause", () => {
btnPlay.innerHTML = "&#9654; Play";
btnPlay.innerHTML = "&#9654; Spela";
cancelAnimationFrame(raf);
});
audio.addEventListener("ended", () => {
btnPlay.innerHTML = "&#9654; Play";
btnPlay.innerHTML = "&#9654; Spela";
cancelAnimationFrame(raf);
tick();
});
+10 -10
View File
@@ -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 -1
View File
@@ -1,7 +1,7 @@
<html>
<iframe
class="circuitjs-simulation"
title="Interaktive DSP-Simulation"
title="Interaktiv DSP-simulering"
width="100%"
height="600"
style="border: 0;"
+7 -7
View File
@@ -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>
+4 -4
View File
@@ -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 -4
View File
@@ -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%"/>
+14 -14
View File
@@ -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 + "&deg;");
}
+8 -8
View File
@@ -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",
+9 -9
View File
@@ -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>
+23 -23
View File
@@ -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>&phi;</var></label>
<label>Fas <var>&phi;</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&deg;</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();
}
+5 -5
View File
@@ -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>
+42 -39
View File
@@ -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>
+7 -7
View File
@@ -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>
+10 -10
View File
@@ -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]);
+6 -6
View File
@@ -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(".", ",");
}
}
}
+7 -7
View File
@@ -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₂ &gt; 0, U₃ = U₁</button>
<button id="button2">Fall 2: U₂ &lt; 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>
+13 -13
View File
@@ -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 &gt; 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 &gt; 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 &lt; 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 &lt; 7,05 MHz:</strong> Den induktiva verkan dominerar – trapparna förlänger strålaren elektriskt.'
}
};
+2 -2
View File
@@ -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>
+9 -9
View File
@@ -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))
+9 -9
View File
@@ -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 -4
View File
@@ -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);
+2 -2
View File
@@ -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>
+2 -2
View File
@@ -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,
+13 -13
View File
@@ -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);
+6 -6
View File
@@ -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) => {
+3 -3
View File
@@ -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>