add option dominant freqs
This commit is contained in:
parent
d007702712
commit
6f449512d1
2 changed files with 20 additions and 18 deletions
|
|
@ -1 +1 @@
|
||||||
__version__ = '0.1.23'
|
__version__ = '0.1.24'
|
||||||
|
|
|
||||||
|
|
@ -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()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue