kurse:efcomputergrafik:kw45

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

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 auf eine Nachkommastelle zurückgegeben. Die berechneten Fourierkoeffizienten werden aber mit 13 Nachkommastellen ausgegeben. Damit wird unsere Datenreduktion um den Faktor 13 verschlechtert. Abhilfe schafft runden der Fourierkoeffizienten auf zwei oder drei Nachkommastellen.+Die Datenpunkte $P(x|y)$ werden von Tigerjython mit einer Nachkommastelle zurückgegeben. Die berechneten Fourierkoeffizienten haben aber 13 Nachkommastellen. Damit wird unsere Datenreduktion um den Faktor 13 verschlechtert. Abhilfe schafft runden der Fourierkoeffizienten auf zwei oder drei Nachkommastellen.
  
 <code python> <code python>
Line 11: Line 11:
 c=complex(round(c.real,2),round(c.imag,2)) c=complex(round(c.real,2),round(c.imag,2))
 </code> </code>
 +
 +===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, welche $2\pi$-periodisch ist. Wir berechnen die $c_k$ über eine endliche Summe.
 +$$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,1,...,n-1\}$$ 
 +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**
 +
 + Ermittle für den Datesatz "Daten_ksg.txt" ein optimales $k_{max}$. Optimal ist in diesem Fall individuel und nicht mathematisch exakt und daher nicht eindeutig.
 +
 +<hidden>
 +<code python Fourier_Rek.py>
 +from gpanel import *
 +import math
 +import cmath
 +import csv
 +
 +#-----------------------------------------
 +# Einlesen der Daten
 +#-----------------------------------------
 +Koordinaten=[]
 +print('Daten lesen Start')
 +with open('Daten_ksbg.txt') as csvfile:
 +    reader=csv.DictReader(csvfile)
 +    for row in reader:
 +        Koordinaten.append([float(row['x']),float(row['y'])])
 +print('Daten lesen Ende')
 +#-----------------------------------------
 +# Bild zeichnen
 +#-----------------------------------------
 +makeGPanel(0,100,0,100)
 +move(Koordinaten[0][0], Koordinaten[0][1])
 +for ko in Koordinaten:
 +    draw(ko[0],ko[1])
 +delay(1000)
 +clear()
 +#-----------------------------------------
 +# Berechnen der Fourierkoeffizienten
 +# Teil 1: Init.
 +#-----------------------------------------
 +anzP=len(Koordinaten)
 +dt=1/(anzP-1)
 +kMax=int(math.floor(anzP/32)) # Datenkomprimierung
 +print(str(anzP)+' Datenpunkte')
 +print(str(2*kMax+1)+" Fourierkoeffizienten")
 +c=[]
 +for k in range(2*kMax+1):
 +    c.append(complex(0,0))
 +f=open('Fourier_Test_ksbg.txt','w')
 +#-----------------------------------------
 +# Berechnen der Fourierkoeffizienten
 +# Teil 2: c_k von -kmax <= k <= kmax 
 +#-----------------------------------------
 +for k in range(-kMax,kMax+1):
 +    for i in range(anzP):
 +        kshift=k+kMax
 +        c[kshift]=c[kshift]+complex(Koordinaten[i][0],Koordinaten[i][1])*cmath.exp(-2*math.pi*k*i*dt*1j)*dt
 +    c[kshift]=complex(round(c[kshift].real,2),round(c[kshift].imag,2))
 +    f.write(str(c[kshift]) + '\n')
 +f.close()    
 +print('Fourierkoeffizienten berechnet')
 +#-----------------------------------------
 +# Rekonstruktion des Bildes
 +#-----------------------------------------
 +setColor('red')
 +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,kMax+1):
 +    kshift=k+kMax
 +    f=f+c[kshift]*cmath.exp(2*math.pi*k*t[0]*1j)
 +move(f.real,f.imag)
 +f=0
 +#---------------------------------------
 +# Rest zeichnen
 +#---------------------------------------
 +for i in range(anzP):
 +    for k in range(-kMax,kMax+1):
 +        kshift=k+kMax
 +        f=f+c[kshift]*cmath.exp(2*math.pi*k*t[i]*1j)
 +    draw(f.real,f.imag)
 +    delay(10)
 +    f=0   
 +print('Bild gezeichnet'
 +</code>
 +</hidden>
  • kurse/efcomputergrafik/kw45.1572943168.txt.gz
  • Last modified: 2019/11/05 09:39
  • by Marcel Metzler