add option dominant freqs

This commit is contained in:
François Boulogne 2026-01-06 11:03:58 +01:00
parent d007702712
commit 6f449512d1
2 changed files with 20 additions and 18 deletions

View file

@ -1 +1 @@
__version__ = '0.1.23' __version__ = '0.1.24'

View file

@ -12,7 +12,7 @@ from scipy.stats import linregress
from scipy.optimize import curve_fit 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. 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. time (array-like): Array contenant les données temporelles.
signal (array-like): Array contenant les données du signal. signal (array-like): Array contenant les données du signal.
num_modes (int): Nombre de modes fréquentiels à extraire. num_modes (int): Nombre de modes fréquentiels à extraire.
dominant_freqs: les frequences des modes, if None, computed internally
Returns: Returns:
tuple: (filtered_signals, frequencies, time_filtered) 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 # Supprimer la composante DC
signal_clean = signal - np.mean(signal) signal_clean = signal - np.mean(signal)
# Calculer la FFT if dominant_freqs is None:
n = len(time) # Calculer la FFT
fft_signal = fft(signal_clean) n = len(time)
freqs = fftfreq(n, dt) fft_signal = fft(signal_clean)
freqs = fftfreq(n, dt)
# Prendre seulement les fréquences positives # Prendre seulement les fréquences positives
positive_mask = freqs > 0 positive_mask = freqs > 0
freqs_pos = freqs[positive_mask] freqs_pos = freqs[positive_mask]
fft_pos = fft_signal[positive_mask] fft_pos = fft_signal[positive_mask]
# Trouver les pics dans le spectre # Trouver les pics dans le spectre
magnitude = np.abs(fft_pos) magnitude = np.abs(fft_pos)
peaks, _ = find_peaks(magnitude, height=0.1*np.max(magnitude)) peaks, _ = find_peaks(magnitude, height=0.1*np.max(magnitude))
peak_freqs = freqs_pos[peaks] peak_freqs = freqs_pos[peaks]
peak_mags = magnitude[peaks] peak_mags = magnitude[peaks]
# Trier les pics par magnitude et sélectionner les num_modes plus importants # Trier les pics par magnitude et sélectionner les num_modes plus importants
idx = np.argsort(peak_mags)[-num_modes:] idx = np.argsort(peak_mags)[-num_modes:]
dominant_freqs = peak_freqs[idx] dominant_freqs = peak_freqs[idx]
# Trier les fréquences par ordre croissant # Trier les fréquences par ordre croissant
dominant_freqs.sort() dominant_freqs.sort()