60 lines
2.1 KiB
Python
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) |