Added wave
This commit is contained in:
11
wave/README.md
Normal file
11
wave/README.md
Normal file
@@ -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)
|
||||||
24
wave/plot.js
Normal file
24
wave/plot.js
Normal file
@@ -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()
|
||||||
|
}
|
||||||
36
wave/script.py
Normal file
36
wave/script.py
Normal file
@@ -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()
|
||||||
8
wave/style.css
Normal file
8
wave/style.css
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
body {
|
||||||
|
padding: 1em;
|
||||||
|
}
|
||||||
|
canvas {
|
||||||
|
background-color: azure;
|
||||||
|
max-width: 1920px;
|
||||||
|
max-height: 800px;
|
||||||
|
}
|
||||||
34
wave/wave.html
Normal file
34
wave/wave.html
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
||||||
|
<title>Schwebung</title>
|
||||||
|
<link rel="icon" type="image/x-icon" href="../assets/favicon.png" />
|
||||||
|
<link rel="stylesheet" href="../assets/pyscript.css" />
|
||||||
|
<script defer src="../assets/pyscript.js"></script>
|
||||||
|
<script src="../assets/chart.js"></script>
|
||||||
|
<link rel="stylesheet" href="style.css" />
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
<py-env>
|
||||||
|
- numpy
|
||||||
|
</py-env>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<fieldset>
|
||||||
|
<legend>f<sub>1</sub> = 440 Hz</legend>
|
||||||
|
f<sub>2</sub> = <label id="freqlabel" for="freq">441</label> Hz<br />
|
||||||
|
<input
|
||||||
|
id="freq"
|
||||||
|
type="range"
|
||||||
|
min="440"
|
||||||
|
max="442"
|
||||||
|
step="0.1"
|
||||||
|
value="441"
|
||||||
|
/>
|
||||||
|
</fieldset>
|
||||||
|
<canvas id="chart"></canvas>
|
||||||
|
<py-script src="script.py"></py-script>
|
||||||
|
<script src="plot.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
Reference in New Issue
Block a user