""" 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)