EVM/code/heartrate.py
2024-01-03 14:37:33 +00:00

60 lines
2.1 KiB
Python

"""
Abhängigkeiten:
- scipy.signal (find_peaks)
Autor: Ihr Name
Datum: Erstellungs- oder Änderungsdatum
Version: Modulversion
"""
from scipy import signal
def find_heart_rate(fft, freqs, freq_min, freq_max):
"""
Berechnet die Herzfrequenz aus den FFT-Spitzen.
Diese Funktion nimmt FFT-Daten, Frequenzen, sowie minimale und maximale Frequenzgrenzen entgegen. Sie identifiziert die
Spitzen im FFT-Spektrum, findet die Spitze mit der höchsten Amplitude in einem bestimmten Frequenzband und berechnet
die Herzfrequenz basierend auf dieser Spitze.
Args:
fft (ndarray): Die FFT-Daten des Videos.
freqs (ndarray): Die Frequenzen, die den FFT-Daten zugeordnet sind.
freq_min (float): Die untere Grenzfrequenz des zu berücksichtigenden Frequenzbands.
freq_max (float): Die obere Grenzfrequenz des zu berücksichtigenden Frequenzbands.
Returns:
float: Die berechnete Herzfrequenz in Schlägen pro Minute (bpm).
"""
fft_maximums = []
# Bestimme die Amplitude an jedem Frequenzpunkt
for i in range(fft.shape[0]):
if freq_min <= freqs[i] <= freq_max:
fftMap = abs(fft[i])
fft_maximums.append(fftMap.max())
else:
fft_maximums.append(0)
print("fft_maximums: "+str(len(fft_maximums)))
peaks, properties = signal.find_peaks(fft_maximums)
print("peaks: "+str(len(peaks)))
# Liste zur Speicherung der Top-10-Peak-Frequenzen
top_peak_freqs = []
# Sortiere die Peaks nach ihrer Amplitude
sorted_peaks = sorted(peaks, key=lambda x: fft_maximums[x], reverse=True)
print("sorted_peaks: "+str(len(sorted_peaks)))
# Wähle die Top-10-Peaks aus
for peak in sorted_peaks[:100]:
top_peak_freqs.append(freqs[peak])
# Berechne den Durchschnitt der Frequenzen der Top-10-Peaks
if top_peak_freqs:
average_freq = sum(top_peak_freqs) / len(top_peak_freqs)
return average_freq * 60# Umrechnung von Hz in BPM
else:
return None
# Beispielaufruf der Funktion
# heart_rate = find_heart_rate(fft_data, frequency_data, freq_min, freq_max)