|
|
|
|
|
|
|
|
""" |
|
|
|
|
|
Abhängigkeiten: |
|
|
|
|
|
- numpy |
|
|
|
|
|
- scipy.signal (butter, lfilter) |
|
|
|
|
|
- constants (für die Verwendung von 'alpha') |
|
|
|
|
|
|
|
|
|
|
|
Autor: Roberto Gelsinger |
|
|
|
|
|
Datum: 07.12.2023 |
|
|
|
|
|
Version: Modulversion |
|
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
import numpy as np |
|
|
|
|
|
from scipy.signal import butter, lfilter |
|
|
|
|
|
from constants import alpha |
|
|
|
|
|
|
|
|
|
|
|
def fft_filter(video, freq_min, freq_max, fps): |
|
|
|
|
|
""" |
|
|
|
|
|
|
|
|
|
|
|
Diese Funktion nimmt Videodaten, eine Frequenzbandbreite und die Bildrate (FPS) des Videos entgegen. |
|
|
|
|
|
Sie filtert das Video, um nur Frequenzen im angegebenen Band zu verstärken. Das verstärkte Video, die FFT-Daten |
|
|
|
|
|
und die Frequenzen werden zurückgegeben. |
|
|
|
|
|
|
|
|
|
|
|
Args: |
|
|
|
|
|
video (ndarray): Die Videodaten als ndarray. |
|
|
|
|
|
freq_min (float): Die untere Grenzfrequenz des zu verstärkenden Frequenzbands. |
|
|
|
|
|
freq_max (float): Die obere Grenzfrequenz des zu verstärkenden Frequenzbands. |
|
|
|
|
|
fps (int): Die Bildrate (Frames pro Sekunde) des Videos. |
|
|
|
|
|
|
|
|
|
|
|
Returns: |
|
|
|
|
|
tuple: Ein Tupel, bestehend aus: |
|
|
|
|
|
- amplified_video (ndarray): Das verstärkte Videodaten als ndarray. |
|
|
|
|
|
- fft (ndarray): Die FFT-Daten des verstärkten Videos. |
|
|
|
|
|
- frequencies (ndarray): Die zugehörigen Frequenzen der FFT. |
|
|
|
|
|
""" |
|
|
|
|
|
nyquist = 0.5 * fps |
|
|
|
|
|
low = freq_min / nyquist |
|
|
|
|
|
high = freq_max / nyquist |
|
|
|
|
|
|
|
|
|
|
|
# Min-Max-Frequenzen filtern |
|
|
|
|
|
b, a = butter(4, [low, high], btype='band') |
|
|
|
|
|
|
|
|
|
|
|
filtered_video = np.zeros_like(video) |
|
|
|
|
|
for i in range(video.shape[2]): |
|
|
|
|
|
filtered_video[:, :, i] = lfilter(b, a, video[:, :, i]) |
|
|
|
|
|
|
|
|
|
|
|
# Verstärkung |
|
|
|
|
|
amplified_video = np.abs(filtered_video) * alpha |
|
|
|
|
|
|
|
|
|
|
|
fft = np.fft.fft(amplified_video, axis=0) |
|
|
|
|
|
frequencies = np.fft.fftfreq(amplified_video.shape[0], d=1.0 / fps) |
|
|
|
|
|
|
|
|
|
|
|
return amplified_video, fft, frequencies |
|
|
|