diff --git a/wave/README.md b/wave/README.md new file mode 100644 index 0000000..4fecfa8 --- /dev/null +++ b/wave/README.md @@ -0,0 +1,11 @@ +# Schwebung + +_Als Schwebung bezeichnet man den Effekt, dass die Resultierende der additiven Überlagerung zweier Schwingungen, die sich in ihrer Frequenz nur wenig voneinander unterscheiden, eine periodisch zu- und abnehmende Amplitude aufweist._ + +→ [Wikipedia](https://de.wikipedia.org/wiki/Schwebung) + +--- + +Mittels NumPy werden die Daten für eine interaktive Demonstration von Schwebung bereitgestellt und mit Chart.js visualisiert. + +[Aufrufbare Instanz](https://checksch.de/pa-pyscript/wave/wave.html) diff --git a/wave/plot.js b/wave/plot.js new file mode 100644 index 0000000..674b9db --- /dev/null +++ b/wave/plot.js @@ -0,0 +1,24 @@ +const chart = new Chart("chart", { + type: "line", + data: { + datasets: [{ + label: "Auslenkung", + borderColor: "teal", + backgroundColor: "teal", + } + ] + }, + options: { + scales: { + x: { + display: false + } + } + } +}) + +function update(x, y) { + chart.data.labels = x + chart.data.datasets[0].data = y + chart.update() +} \ No newline at end of file diff --git a/wave/script.py b/wave/script.py new file mode 100644 index 0000000..342b4ba --- /dev/null +++ b/wave/script.py @@ -0,0 +1,36 @@ +from pyodide import create_proxy, to_js +import numpy as np +import js + +# Auslenkung -> ω * t = 2πft +def deflection(frequency, time): + return np.sin(2 * np.pi * frequency * time) + + +# Schwebung -> y(t) = y^(sin(2πft) + sin(2πft)); Annahme gleicher Amplitude (1), keine Phasenverschiebung +def beat(freq1, freq2, time): + return deflection(freq1, time) + deflection(freq2, time) + + +def freq_update(event): + document.querySelector("#freqlabel").innerText = freq2.value + plot() + + +def plot(): + beat_deflection = beat(freq1, float(freq2.value), time) + js.update(to_js(time), to_js(beat_deflection)) + + +freq1 = 440 +freq2 = document.querySelector("#freq") + +proxy = create_proxy(freq_update) +freq2.addEventListener("input", proxy) + +sampling_frequency = 1920 / 10 * 4 +seconds = 2 +time = np.linspace(0, seconds, int(seconds * sampling_frequency)) + + +plot() diff --git a/wave/style.css b/wave/style.css new file mode 100644 index 0000000..61869a7 --- /dev/null +++ b/wave/style.css @@ -0,0 +1,8 @@ +body { + padding: 1em; +} +canvas { + background-color: azure; + max-width: 1920px; + max-height: 800px; +} diff --git a/wave/wave.html b/wave/wave.html new file mode 100644 index 0000000..14aa719 --- /dev/null +++ b/wave/wave.html @@ -0,0 +1,34 @@ + + + + + + Schwebung + + + + + + + + - numpy + + + +
+ f1 = 440 Hz + f2 = Hz
+ +
+ + + + +