You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

eulerian.py 1.7KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. """
  2. Abhängigkeiten:
  3. - numpy
  4. - scipy.signal (butter, lfilter)
  5. - constants (für die Verwendung von 'alpha')
  6. Autor: Roberto Gelsinger
  7. Datum: 07.12.2023
  8. Version: Modulversion
  9. """
  10. import numpy as np
  11. from scipy.signal import butter, lfilter
  12. from constants import alpha
  13. def fft_filter(video, freq_min, freq_max, fps):
  14. """
  15. Diese Funktion nimmt Videodaten, eine Frequenzbandbreite und die Bildrate (FPS) des Videos entgegen.
  16. Sie filtert das Video, um nur Frequenzen im angegebenen Band zu verstärken. Das verstärkte Video, die FFT-Daten
  17. und die Frequenzen werden zurückgegeben.
  18. Args:
  19. video (ndarray): Die Videodaten als ndarray.
  20. freq_min (float): Die untere Grenzfrequenz des zu verstärkenden Frequenzbands.
  21. freq_max (float): Die obere Grenzfrequenz des zu verstärkenden Frequenzbands.
  22. fps (int): Die Bildrate (Frames pro Sekunde) des Videos.
  23. Returns:
  24. tuple: Ein Tupel, bestehend aus:
  25. - amplified_video (ndarray): Das verstärkte Videodaten als ndarray.
  26. - fft (ndarray): Die FFT-Daten des verstärkten Videos.
  27. - frequencies (ndarray): Die zugehörigen Frequenzen der FFT.
  28. """
  29. nyquist = 0.5 * fps
  30. low = freq_min / nyquist
  31. high = freq_max / nyquist
  32. # Min-Max-Frequenzen filtern
  33. b, a = butter(4, [low, high], btype='band')
  34. filtered_video = np.zeros_like(video)
  35. for i in range(video.shape[2]):
  36. filtered_video[:, :, i] = lfilter(b, a, video[:, :, i])
  37. # Verstärkung
  38. amplified_video = np.abs(filtered_video) * alpha
  39. fft = np.fft.fft(amplified_video, axis=0)
  40. frequencies = np.fft.fftfreq(amplified_video.shape[0], d=1.0 / fps)
  41. return amplified_video, fft, frequencies