diff --git a/mysignal/__init__.py b/mysignal/__init__.py index b5fb6c4..cdf16bc 100644 --- a/mysignal/__init__.py +++ b/mysignal/__init__.py @@ -1 +1 @@ -__version__ = '0.1.23' +__version__ = '0.1.24' diff --git a/mysignal/phasefreq.py b/mysignal/phasefreq.py index 8d5a566..aed699a 100644 --- a/mysignal/phasefreq.py +++ b/mysignal/phasefreq.py @@ -12,7 +12,7 @@ from scipy.stats import linregress from scipy.optimize import curve_fit -def filter_signal_by_modes(time, signal, num_modes=1, bandwidth_factor=0.1, required_cycles=100): +def filter_signal_by_modes(time, signal, num_modes=1, bandwidth_factor=0.1, required_cycles=100, dominant_freqs=None): """ Filtre un signal pour extraire ses composantes fréquentielles dominantes. @@ -20,6 +20,7 @@ def filter_signal_by_modes(time, signal, num_modes=1, bandwidth_factor=0.1, requ time (array-like): Array contenant les données temporelles. signal (array-like): Array contenant les données du signal. num_modes (int): Nombre de modes fréquentiels à extraire. + dominant_freqs: les frequences des modes, if None, computed internally Returns: tuple: (filtered_signals, frequencies, time_filtered) @@ -38,25 +39,26 @@ def filter_signal_by_modes(time, signal, num_modes=1, bandwidth_factor=0.1, requ # Supprimer la composante DC signal_clean = signal - np.mean(signal) - # Calculer la FFT - n = len(time) - fft_signal = fft(signal_clean) - freqs = fftfreq(n, dt) + if dominant_freqs is None: + # Calculer la FFT + n = len(time) + fft_signal = fft(signal_clean) + freqs = fftfreq(n, dt) - # Prendre seulement les fréquences positives - positive_mask = freqs > 0 - freqs_pos = freqs[positive_mask] - fft_pos = fft_signal[positive_mask] + # Prendre seulement les fréquences positives + positive_mask = freqs > 0 + freqs_pos = freqs[positive_mask] + fft_pos = fft_signal[positive_mask] - # Trouver les pics dans le spectre - magnitude = np.abs(fft_pos) - peaks, _ = find_peaks(magnitude, height=0.1*np.max(magnitude)) - peak_freqs = freqs_pos[peaks] - peak_mags = magnitude[peaks] + # Trouver les pics dans le spectre + magnitude = np.abs(fft_pos) + peaks, _ = find_peaks(magnitude, height=0.1*np.max(magnitude)) + peak_freqs = freqs_pos[peaks] + peak_mags = magnitude[peaks] - # Trier les pics par magnitude et sélectionner les num_modes plus importants - idx = np.argsort(peak_mags)[-num_modes:] - dominant_freqs = peak_freqs[idx] + # Trier les pics par magnitude et sélectionner les num_modes plus importants + idx = np.argsort(peak_mags)[-num_modes:] + dominant_freqs = peak_freqs[idx] # Trier les fréquences par ordre croissant dominant_freqs.sort()