Zum Inhalt springen

Ing Mathematik: FFT und Wavelets

Aus Wikibooks


Fourierreihen

[Bearbeiten]
Jean Baptiste Joseph Fourier (französischer Mathematiker und Physiker, 1768 - 1830)

bzw. in komplexer Schreibweise

Beispiel: Gegeben sei eine Rechteckfunktion. Sie soll mit der Fourierreihe angenähert werden.

Dazugehöriger Python-Code (rudimentär):

from scipy import integrate
import numpy as np
import matplotlib.pyplot as plt

def ak(k):
    def y(x):
        if x <= -1 or x >= 2:
            return 0
        else:
            return 10 * np.cos(x*k)

    I, err = integrate.quad(y, -np.pi, np.pi)
    return 1./np.pi * I

def bk(k):
    def y(x):
        if x <= -1 or x >= 2:
            return 0
        else:
            return 10 * np.sin(x*k)

    I, err = integrate.quad(y, -np.pi, np.pi)
    return 1./np.pi * I

n = 2

a = np.zeros([n+1])
b = np.zeros([n+1])

for i in np.arange(0, n):
    a[i] = ak(i)
    b[i] = bk(i)

fx = a[0]/2.

x = np.arange(-1, 2.01, 0.01)

for i in np.arange(1, n):
    fx += a[i]*np.cos(i*x) + b[i]*np.sin(i*x)

plt.plot([-1,2], [10,10], color="green")
plt.plot([-1,-1], [0,10], color="green")
plt.plot([2,2], [0,10], color="green")
plt.plot(x, fx, label="n = " + str(n))
plt.legend()
plt.show()

Siehe auch  Fourierreihe

Fourier-Transformation

[Bearbeiten]

.

Siehe auch  Fourier-Transformation

DFT - Diskrete Fourier Transformation

[Bearbeiten]

Diskrete Fourier-Transformation: ;

Matrix-Vektor-Form: mit

Inverse Diskrete Fourier-Transformation, iDFT: für

iDFT in Matrix-Vektor-Form: mit


Siehe auch  Diskrete Fourier-Transformation

FFT - Fast Fourier Transformation

[Bearbeiten]

Eine effizientere Methode ist die FFT. Sie verwendet die Divide-and-Conquer-Methode. Zu diesem Verfahren gibt es vorgefertigte SciPy-Funktionen. Siehe z.B. [1]

Python-Code: FFT und Rücktransformation

import numpy as np
from scipy.fftpack import fft, ifft

y = np.array([1., 0.5, 2.5, 0.5, 3.5, 2.5]) 

u = fft(y)
v = ifft(u)

print("Messwerte = ", y)
print("FFT = ", u)
print("inverse FFT = ", v)

Ausgabe:

Messwerte =  [1.  0.5 2.5 0.5 3.5 2.5]
FFT =  [10.5-0.j         -1. +2.59807621j -3. +0.8660254j   3.5-0.j
 -3. -0.8660254j  -1. -2.59807621j]
inverse FFT =  [1. +0.j 0.5+0.j 2.5+0.j 0.5+0.j 3.5-0.j 2.5+0.j]

Python-Code: Rekonstruktion (Siehe auch Steinkamp: Der Python-Kurs für Ingenieure und Naturwissenschaftler; Rheinwerk, 2021, Seite 328ff oder Woyand: Python für Ingenieure und Naturwissenschaftler. 4. Aufl., Hanser, 2021, Seite 294ff)

import numpy as np
import matplotlib.pyplot as plt
from scipy.fftpack import fft, ifft, fftfreq

f = 50              # Frequenz
fgrenz = 1.5 * f    # Grenzfrequenz
n = 1000            # Anzahl Abtastungen
t = np.linspace(0, 1/f, n)
ut = np.sin(np.pi*f*t) + 3*np.random.randn(t.size)

u = fft(ut)
fk = fftfreq(ut.size, 1/(f*n))
Fg = u *(np.abs(fk) < fgrenz)
v = ifft(Fg)
z = np.abs(u[0:n])

# Grafikausgabe
fig, ax = plt.subplots(3,1)
ax[0].set_xlabel("Zeit")
ax[0].set_ylabel("u(t)")
ax[0].set_title("Messwerte")
ax[0].plot(t, ut, lw=1)
ax[1].set_xlabel("Zeit")
ax[1].set_ylabel("u(t)")
ax[1].set_title("Rekonstruktion")
ax[1].plot(t, v.real, lw=2)
ax[2].set_xlabel("Frequenz")
ax[2].set_ylabel("|z(t)|")
ax[2].set_title("Frequenzspektrum")
ax[2].plot(t, z, lw=1)
fig.tight_layout()
plt.show()

Ausgabe:

Siehe auch  Schnelle Fourier-Transformation

Short-time-Fourier-Transformation, STFT

[Bearbeiten]

Kontinuierliche STFT:

Typische Fensterfunktionen:  Hamming-Fenster,  von-Hann-Fenster,  Gauß-Fenster.

Siehe auch  Fensterfunktion,  Kurzzeit-Fourier-Transformation.

Z-Transformation

[Bearbeiten]

Z-Transformation: ;

Inverse Z-Transformation:

Siehe auch  Z-Transformation

Wavelets

[Bearbeiten]

Wavelet ... kleine Welle

Haar-Wavelet

[Bearbeiten]

Python-Code:

import numpy as np
import matplotlib.pyplot as plt

def psi(x):
    u = np.zeros(len(x))
    k = 0
    
    for i in x:
        if 0<=i<=1/2:
            u[k] = 1
        elif 1/2<=i<=1:
            u[k] = -1
        else:
            u[k] = 0
        k += 1
    return u

x = np.arange(-0.5, 1.5, 0.001)
y = psi(x)

plt.plot(x,y)
plt.grid()
plt.show()

Mexikanischer Hut

[Bearbeiten]

Python-Code:

import numpy as np
import matplotlib.pyplot as plt

def psi(x):
    p = (1-x**2) * np.exp(-x**2 / 2)
    return p

x = np.arange(-np.pi, np.pi, 0.01)
y = psi(x)

plt.plot(x,y)
plt.grid()
plt.show()

Morlet-Wavelet

[Bearbeiten]

Daubechies-Wavelet

[Bearbeiten]

Wavelet-Transformation

[Bearbeiten]

  • : zu transformierende Funktion
  • : Wavelet-Funktion
  • : Translationsparameter
  • : Skalierungsparameter


Siehe auch  Wavelet,  Wavelet-Transformation,  Haar-Wavelet, PyWavelets

Gedruckte Bücher (auszugsweise)

[Bearbeiten]
  • Burg, Haf, Wille, Meister: Höhere Mathematik für Ingenieure, Band I: Analysis. 9. Auflage, Vieweg+Teubner, 2011, ISBN 978-3-8348-1218-6
  • Burg, Haf, Wille, Meister: Höhere Mathematik für Ingenieure, Band III: Gewöhnliche Differentialgleichungen, Distributionen, Integraltransformationen. 5. Auflage, Vieweg+Teubner, 2009, ISBN 978-3-8348-0565-2
  • Hanke-Bourgeois: Grundlagen der Numerischen Mathematik und des Wissenschaftlichen Rechnens. 3. Aufl., Vieweg+Teubner, 2009, ISBN 978-3-8348-0708-3
  • Preuß: Funktionaltransformationen. 2. Aufl., Hanser, 2014, ISBN 978-3-446-41787-8
  • Thuselt, Gennrich: Praktische Mathematik mit MATLAB, Scilab und Octave. Springer, 2013, ISBN 978-3-642-25824-4