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.

heartrate.py 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. """
  2. Abhängigkeiten:
  3. - scipy.signal (find_peaks)
  4. Autor: Ihr Name
  5. Datum: Erstellungs- oder Änderungsdatum
  6. Version: Modulversion
  7. """
  8. from scipy import signal
  9. def find_heart_rate(fft, freqs, freq_min, freq_max):
  10. """
  11. Berechnet die Herzfrequenz aus den FFT-Spitzen.
  12. Diese Funktion nimmt FFT-Daten, Frequenzen, sowie minimale und maximale Frequenzgrenzen entgegen. Sie identifiziert die
  13. Spitzen im FFT-Spektrum, findet die Spitze mit der höchsten Amplitude in einem bestimmten Frequenzband und berechnet
  14. die Herzfrequenz basierend auf dieser Spitze.
  15. Args:
  16. fft (ndarray): Die FFT-Daten des Videos.
  17. freqs (ndarray): Die Frequenzen, die den FFT-Daten zugeordnet sind.
  18. freq_min (float): Die untere Grenzfrequenz des zu berücksichtigenden Frequenzbands.
  19. freq_max (float): Die obere Grenzfrequenz des zu berücksichtigenden Frequenzbands.
  20. Returns:
  21. float: Die berechnete Herzfrequenz in Schlägen pro Minute (bpm).
  22. """
  23. fft_maximums = []
  24. # Bestimme die Amplitude an jedem Frequenzpunkt
  25. for i in range(fft.shape[0]):
  26. if freq_min <= freqs[i] <= freq_max:
  27. fftMap = abs(fft[i])
  28. fft_maximums.append(fftMap.max())
  29. else:
  30. fft_maximums.append(0)
  31. print("fft_maximums: "+str(len(fft_maximums)))
  32. peaks, properties = signal.find_peaks(fft_maximums)
  33. print("peaks: "+str(len(peaks)))
  34. # Liste zur Speicherung der Top-10-Peak-Frequenzen
  35. top_peak_freqs = []
  36. # Sortiere die Peaks nach ihrer Amplitude
  37. sorted_peaks = sorted(peaks, key=lambda x: fft_maximums[x], reverse=True)
  38. print("sorted_peaks: "+str(len(sorted_peaks)))
  39. # Wähle die Top-10-Peaks aus
  40. for peak in sorted_peaks[:100]:
  41. top_peak_freqs.append(freqs[peak])
  42. # Berechne den Durchschnitt der Frequenzen der Top-10-Peaks
  43. if top_peak_freqs:
  44. average_freq = sum(top_peak_freqs) / len(top_peak_freqs)
  45. return average_freq * 60# Umrechnung von Hz in BPM
  46. else:
  47. return None
  48. # Beispielaufruf der Funktion
  49. # heart_rate = find_heart_rate(fft_data, frequency_data, freq_min, freq_max)