{ "cells": [ { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "# Computergestützte Datenauswertung\n", "**Institut für Experimentelle Teilchenphysik (ETP)**
\n", "**Institut für Theorie der Kondensierten Materie (TKM)**
\n", "Prof. Dr. Ulrich Husemann (ETP)
\n", "Dr. Thorsten Chwalek (ETP), Dr. Andreas Poenicke (TKM)
\n", "[ILIAS-Seite zum Kurs](https://ilias.studium.kit.edu/ilias.php?baseClass=ilrepositorygui&ref_id=2627198)
\n", "Sommersemester 2025 – Blatt 04
\n", "Abgabe: Montag, 26.05.2025, oder Dienstag, 27.05.2025\n", "\n", "---" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "In der [ersten Aufgabe](#Aufgabe1) beschäftigen Sie sich mit der Verarbeitung eines digitalen Signals.\n", "In der [zweiten Aufgabe](#Aufgabe2) betrachten Sie in einer anwendungsorientierten Weise die Grundlagen jeder Parameterschätzung und führen diese an einem einfachen Beispiel selbst durch.\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "# Aufgabe 1: Signaldarstellung und -verarbeitung \n", "---\n", "**Digitale Signalverarbeitung im Praktikum**
\n", "\n", "Messgeräte im physikalischen Praktikum wandeln häufig die Messgröße in analoge elektrische Signal um, z. B. in elektrische Spannungen. Diese analogen Signale sind **kontinuierlich**, sowohl als Funktion der Zeit als auch als Funktion des Signalwerts. Um ein analoges Signal in ein digitales Signal umzuwandeln, muss es mithilfe eines **Analog-Digital-Wandlers** (engl.:analog-to-digital converter, ADC) sowohl in der Zeit als auch im Signalwert in diskrete Werte umgewandelt werden. Solche ADCs sind häufig direkt in den Messgeräten im physikalischen Praktikum verbaut. Sie liefern die Messdaten als **Zeitreihen**, mit einem oder mehreren Messwerten zu festen Zeitpunkten. \n", "\n", "Einfach strukturierte digitale Daten wie solche Messdaten lassen sich in Form von Tabellen aus Gleitkommazahlen abspeichern. Ein sehr gängiges Format für solche Daten ist das **CSV-Format** (engl.: comma-separated values), das Sie bereits im Kurs \"Programmieren und Algorithmen\" kennengelernt haben. Eine solche CSV-Datei mit einem digitalisierten Messsignal soll in dieser Aufgabe eingelesen und verarbeitet werden. Die ersten fünf Zeilen dieser Datei (`signal_raw.csv`) sehen wie folgt aus:\n", "```\n", "time (ms),amplitude(V)\n", "0,-0.0591771826\n", "0.05564830273,0.1081948399\n", "0.1112966055,0.2375716725\n", "0.1669449082,0.03774585915\n", "```\n", "Wie der Name CSV suggeriert, sind die Spalten der Tabelle durch Kommata getrennt. Die erste Zeile ist die Kopfzeile, sie enthält als **Metadaten** die Größen, die in den Spalten dargestellt werden und deren Einheiten. Alle weiteren Zeilen enthalten die Messdaten.\n", "\n", "Mit dem Begriff **Filterung** wird in der Signalverarbeitung das **absichtliche Verändern** von Daten unter Ausnutzung von **Vorwissen** über Signal und Rauschen bezeichnet. Bei der **Glättung** von Signalen wird dabei ausgenutzt, dass sich das Signal nur langsam innerhalb des Datensatzes ändert, während sich das Rauschen schneller ändert. Ein einfaches Filter zur Glättung verwendet den **gleitenden Mittelwert** der Daten (\"Mittelwertfilter\"). Ein digitales Signal aus $N$ Datenpunkten $y_i$ ($i=0,\\dots,N$) besteht, wird dabei wie folgt gefiltert:\n", "$$\n", "m_j = \\frac{1}{2k+1} \\sum_{i = -k}^{k} y_{i+j}.\n", "$$\n", "Das neue Signal $m_j$ besteht also aus dem arithmetischen Mittel über $w=2k+1$ Werte – den Wert $y_i$ und jeweils $k$ Werten links und rechts davon. Als Glättungsparameter wird dann der Parameter $k$ oder $w$ bezeichnet, er muss passend zu Signal und Rauschen gewählt werden. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Die Ziele dieser Aufgabe sind:\n", "1. Auslesen der Messdaten aus der CSV-Datei.\n", "1. Grafische Darstellung der Messdaten: Sie werden feststellen, dass das Signal durch zufällige Beiträge zur Amplitude an jedem Messpunkt sehr verrauscht ist. Eine solche Situation werden Sie ggf. auch im Praktikum vorfinden. \n", "1. Digitale Signalprozessierung: Die verrauschten Werte werden mit einem Mittelwertfilter geglättet.\n", "\n", "**Arbeitsanweisung:**
\n", "Lesen Sie die Datei mit einer geeigneten Methode aus *NumPy* ein. Greifen Sie dazu z. B. Ihre Vorkenntnisse aus dem Kurs \"Programmieren und Algorithmen\" zurück oder schauen Sie sich die Dokumentation zu [`numpy.genfromtxt`](https://numpy.org/doc/stable/reference/generated/numpy.genfromtxt.html) an.\n", "Stellen Sie außerdem das Signal grafisch dar." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Einlesen der Daten aus der Datei\n", "\n", "\n", "# Darstellung des Messsignals\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Glätten das Signal mit einem Mittelwertfilter (siehe Hinweis).\n", "Wählen Sie einen passenden Glättungsparameter $w$ und stellen Sie den geglätteten Signalverlauf dar. \n", "Bilden Sie die Differenz des geglätteten Signals und des Originals und stellen Sie diese ebenfalls grafisch dar. \n", "Was passiert, wenn Sie den Glättungsparameter zu klein oder zu groß wählen?\n", "\n", "**Hinweise:** \n", "1. Für diese Aufgabe geben wir Ihnen eine Implementation eines Mittelwertfilters in *NumPy* vor, die darauf beruht, dass eine Filterung mathematisch einer Faltung des Signals mit der Filterfunktion entspricht: `moving_average(signal, width)`, wobei der Glättungsparameter `width` dem Wert $w=2k+1$ entspricht und eine Ganzzahl sein muss.\n", "1. Zum einfachen visuellen Vergleich verschiedener Glättungsparameter bietet es sich an, das Glätten und Darstellen des Ergebnisses und der Differenz in einer Funktion zu definieren.\n", "1. In Kapitel 4 der Vorlesung wird das Python-Paket [`PhyPraKit`](https://etpwww.etp.kit.edu/~quast/PhyPraKit/htmldoc/) vorgestellt, das auf den Jupyter-Servern des KIT vorinstalliert ist und mit `import PhyPraKit as ppk` eingebunden werden kann. Es enthält ebenfalls eine Implementation eines Mittelwertfilters: [`PhyPraKit.meanFilter(a, width)`](https://github.com/GuenterQuast/PhyPraKit/blob/94779a6fdf6958fac34d8af425644129c1cbc6ff/PhyPraKit/phyTools.py#L872). Hier ist `a` das Array des jeweiligen Signals und `width` ist $w=2k+1$ und bestimmt den Glättungsparameter. \n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Implementation des Mittelwertfilters\n", "def moving_average(signal, width):\n", " \"\"\"compute moving average of dataset averaging over 2k+1 data points\"\"\"\n", " filter = np.ones(width) / width\n", " return np.convolve( signal, filter, mode='same')\n", "\n", "# Aus Hinweis: Funktion zur Berechnung und Darstellung\n", "#def plot_filter(width=4):\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Auswertung der Glättung\n" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "---\n", "# Aufgabe 2: Parameterschätzung Resonanzkurve mit Daten \n", "---\n", "\n", "Die Schätzung von Parametern einer Modellfunktion ist eine typische Aufgabe in der Datenanalyse.\n", "Ziel dieser Übungsaufgabe ist es, sich mit der prinzipiellen Methodik der Parameterschätzung auseinanderzusetzen und die wesentlichen Schritte dabei kennenzulernen.\n", "Ganz allgemein besteht die Parameterschätzung aus drei Aspekten: \n", "1. Ein Modell, welches Sie an Ihre Daten anpassen wollen.\n", "2. Ein Maß (oder Kostenfunktion), welches die Abweichung zwischen den gemessenen Daten und Ihres Modells quantifiziert.\n", "3. Das Finden der optimalen Modellparameter durch Extremwertbetrachtung des Maßes.\n", "\n", "In dieser Aufgabe werden Ihnen die Daten und das zugrunde liegende Modell vorgegeben.\n", "Ihre Aufgabe wird es also sein, mit einem gegebenen Maß die Parameterschätzung durchzuführen.\n", "Hierbei führen Sie die Parameterschätzung erst mal stark vereinfacht durch. In den beiden folgenden Aufgaben können Sie dann testen, wie Sie eine Parameterschätzung im physikalischen Praktikum durchführen können.\n", "\n", "Sie betrachten in dieser Aufgabe die gemessenen Daten einer Resonanzkurve, welche durch folgendes Modell beschrieben wird:\n", "$$\n", "A(\\eta; D)=\\frac{1}{\\sqrt{(1-\\eta^2)^2 + (2\\eta D)^2}} \\,.\n", "$$\n", "Gemessen wurde die Amplitude $A$ einer erzwungenen Schwingung in Abhängigkeit der normierten Frequenz $\\eta\\equiv\\omega/\\omega_0$.\n", "Die Messdaten und deren Unsicherheiten sowie Resonanzkurven für verschiedene Werte von $D$ werden in den folgenden Zellen für Sie dargestellt." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Resonanzfunktion\n", "def resonance(eta, D):\n", " return 1/np.sqrt((1 - eta*eta)**2 + (2*eta*D)**2)\n", "\n", "# Gemessene Datenpunkte\n", "etam = np.array([0.10, 0.30, 0.50, 0.70, 0.90, 1.10, 1.30, 1.50, 1.70, 1.90, 2.10])\n", "Am = np.array([0.97, 0.92, 1.12, 1.09, 1.36, 1.17, 0.76, 0.54, 0.47, 0.41, 0.36])\n", "\n", "# Unsicherheit auf die gemessene Amplitude\n", "Aerr = 0.1" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Darstellung an Funktionenschar der Resonanzkurve\n", "etamin, etamax = 0, 3\n", "npoints = 1000\n", "eta = np.linspace(etamin, etamax, npoints, endpoint=True)\n", "\n", "# Darstellung der verschiedenen Resonanzen\n", "for D in (0.25, 0.35, 0.5, 0.6):\n", " plt.plot(eta, resonance(eta, D), label=f\"$D$={D:.2f}\")\n", "\n", "# Darstellung der Messwerte\n", "plt.errorbar(etam, Am, yerr=Aerr, fmt='ko')\n", "\n", "plt.title('Resonanzkurve')\n", "plt.xlabel(r'$\\eta=\\omega/\\omega_0$', size='x-large')\n", "plt.ylabel('(normierte) Amplidude $A$')\n", "\n", "plt.legend()\n", "plt.show()" ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "Sie sollen nun die Dämpfungskonstante $D$ bestimmen.\n", "Verwenden Sie hier als Maß die von Gauß vorgeschlagene \"Summe der Residuenquadrate\", d.h. die Summe der auf die Messunsicherheit normierten Quadrate der Abweichungen der Messwerte von der Funktion:\n", "$$\n", "S(D)=\\sum_{i=1}^n \\frac{( A_i^\\mathrm{Messung} - A_i^\\mathrm{Modell}(\\eta; D))^2}{\\sigma_i^2} \\,.\n", "$$\n", "Die beste Anpassung nach der \"Methode der kleinsten Quadrate\" finden Sie für denjenigen Wert von $D$, an dem $S(D)$ ein Minimum erreicht." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "**Arbeitsanweisung:**
\n", "Berechnen Sie für 1000 verschiedene Werte $D\\in[0.35, 0.5]$ das Maß $S(D)$ und stellen Sie $S(D)$ grafisch dar.\n", "Bestimmen Sie anschließend mit geeigneten numerischen Methoden (siehe Hinweis) den besten Schätzwert von $D$ und tragen Sie die resultierende Resonanzkurve zusammen mit den Messwerten in eine Grafik ein." ] }, { "attachments": {}, "cell_type": "markdown", "metadata": {}, "source": [ "**Hinweis:**
\n", "Zur Bestimmung des besten Schätzwerts für $D$ könnte [`numpy.argmin`](https://numpy.org/doc/stable/reference/generated/numpy.argmin.html) hilfreich sein. \n", "Denken Sie hierbei an die Verwendung von Indexierung in *Numpy*-Arrays." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Optional: Funktion zur Bestimmung von S(D)\n", "\n", "# Definition von Scanparameter D\n", "\n", "# Berechnung von S\n", "\n", "# Bestimmung des Minimums\n", "\n", "# Darstellung von S(D)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Darstellung der Resonanz beim besten Schätzwert\n", "\n", "# Darstellung der Messwerte\n" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.3" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }