Differences
This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
kurse:efcomputergrafik:kw45 [2019/11/05 09:39] Marcel Metzler |
kurse:efcomputergrafik:kw45 [2019/11/06 07:55] (current) Ivo Blöchliger ↷ Page name changed from kurse:efcomputergrafik:kw45m to kurse:efcomputergrafik:kw45 |
||
---|---|---|---|
Line 1: | Line 1: | ||
====KW45: Abschluss Fourier==== | ====KW45: Abschluss Fourier==== | ||
===Runden beim Typ Float=== | ===Runden beim Typ Float=== | ||
- | Die Datenpunkte $P(x|y)$ werden von Tigerjython | + | Die Datenpunkte $P(x|y)$ werden von Tigerjython |
<code python> | <code python> | ||
Line 11: | Line 11: | ||
c=complex(round(c.real, | c=complex(round(c.real, | ||
</ | </ | ||
+ | |||
+ | ===Maximaler Index $k_{max}$ der Fourierkoeffizienten $c_k$=== | ||
+ | Sei $n$ die Anzahl Punkte, wie viele Fourierkoeffizienten $c_k$ können, dürfen wir berechnen? Dazu müssen wir uns die Formel zur Berechnung der Fourierkoeffizienten genauer anschauen. | ||
+ | $$c_k=\int_0^1 f(t)\cdot e^{-2 \pi ikt}dt \approx \sum_{j=0}^{n-1}f(j\cdot \Delta t)\cdot e^{-2 \pi ikj\cdot \Delta t}\cdot \Delta t$$ | ||
+ | Relevant ist dabei die komplexe Exponentialfunktion, | ||
+ | $$c_k=\sum_{j=0}^{n-1}f(j\cdot \Delta t)\cdot e^{-2 \pi ikj\cdot \Delta t}\cdot \Delta t$$ | ||
+ | Die komplexe Exponentialfunktion als Funktion von $k$ lautet dann | ||
+ | $$f_j(k)= e^{-2 \pi ikj\cdot \Delta t} \qquad j\in\{0, | ||
+ | Zudem ist $\Delta t = \frac{1}{n-1}$. Setzen wir dies ein, so erkennen wir | ||
+ | $$f_j(k)= e^{-2 \pi i k j\cdot \frac{1}{n-1}}$$ | ||
+ | Sobald $k=n-1$ ist, wiederholt sich die Funktion. D.h. wir haben eine Periode von $n-1$. Es gilt: $$f_j(k)=f_j(k+\lambda\cdot (n-1)) $$ | ||
+ | Wenn $k_{max}=n-1$ ist, dann würden wir (2n-1) Fourierkoeffizienten berechnen, da unsere $c_k$ von $-(n-1)\leq k \leq (n-1)$ durchlaufen. Dies sind zuviele Fourierkoeffzienten. Es gilt die Regel, dass aus $n$ Datenpunkten höchsten $n$ Fourierkoeffizienten berechnet werden können. Somit liegt der maximale Index $k_{max}$ bei $$k_{max} = \lfloor \frac{n-1}{2} \rfloor$$. Das sind i.d.R. immer noch zu viele Fourierkoeffizienten. | ||
+ | |||
+ | **Aufgabe 1** | ||
+ | |||
+ | | ||
+ | |||
+ | < | ||
+ | <code python Fourier_Rek.py> | ||
+ | from gpanel import * | ||
+ | import math | ||
+ | import cmath | ||
+ | import csv | ||
+ | |||
+ | # | ||
+ | # Einlesen der Daten | ||
+ | # | ||
+ | Koordinaten=[] | ||
+ | print(' | ||
+ | with open(' | ||
+ | reader=csv.DictReader(csvfile) | ||
+ | for row in reader: | ||
+ | Koordinaten.append([float(row[' | ||
+ | print(' | ||
+ | # | ||
+ | # Bild zeichnen | ||
+ | # | ||
+ | makeGPanel(0, | ||
+ | move(Koordinaten[0][0], | ||
+ | for ko in Koordinaten: | ||
+ | draw(ko[0], | ||
+ | delay(1000) | ||
+ | clear() | ||
+ | # | ||
+ | # Berechnen der Fourierkoeffizienten | ||
+ | # Teil 1: Init. | ||
+ | # | ||
+ | anzP=len(Koordinaten) | ||
+ | dt=1/ | ||
+ | kMax=int(math.floor(anzP/ | ||
+ | print(str(anzP)+' | ||
+ | print(str(2*kMax+1)+" | ||
+ | c=[] | ||
+ | for k in range(2*kMax+1): | ||
+ | c.append(complex(0, | ||
+ | f=open(' | ||
+ | # | ||
+ | # Berechnen der Fourierkoeffizienten | ||
+ | # Teil 2: c_k von -kmax <= k <= kmax | ||
+ | # | ||
+ | for k in range(-kMax, | ||
+ | for i in range(anzP): | ||
+ | kshift=k+kMax | ||
+ | c[kshift]=c[kshift]+complex(Koordinaten[i][0], | ||
+ | c[kshift]=complex(round(c[kshift].real, | ||
+ | f.write(str(c[kshift]) + ' | ||
+ | f.close() | ||
+ | print(' | ||
+ | # | ||
+ | # Rekonstruktion des Bildes | ||
+ | # | ||
+ | setColor(' | ||
+ | t=[] | ||
+ | t.append(0) | ||
+ | for i in range(anzP-1): | ||
+ | t.append(t[i]+dt) | ||
+ | # | ||
+ | # Startpunkt berechnen und Corsor | ||
+ | # dort abstellen | ||
+ | # | ||
+ | f=0 | ||
+ | for k in range(-kMax, | ||
+ | kshift=k+kMax | ||
+ | f=f+c[kshift]*cmath.exp(2*math.pi*k*t[0]*1j) | ||
+ | move(f.real, | ||
+ | f=0 | ||
+ | # | ||
+ | # Rest zeichnen | ||
+ | # | ||
+ | for i in range(anzP): | ||
+ | for k in range(-kMax, | ||
+ | kshift=k+kMax | ||
+ | f=f+c[kshift]*cmath.exp(2*math.pi*k*t[i]*1j) | ||
+ | draw(f.real, | ||
+ | delay(10) | ||
+ | f=0 | ||
+ | print(' | ||
+ | </ | ||
+ | </ |