This commit is contained in:
François Boulogne 2025-09-01 12:04:32 +02:00
parent 5c21ab1ca9
commit 0ee877b2fa
2 changed files with 48 additions and 2 deletions

View file

@ -1 +1 @@
__version__ = '0.1.7' __version__ = '0.1.8'

View file

@ -3,6 +3,9 @@ import numpy as np
import pandas as pd import pandas as pd
import pywt import pywt
import matplotlib.pyplot as plt
from scipy.fft import fft, fftfreq from scipy.fft import fft, fftfreq
from scipy.signal import find_peaks, hilbert, butter, filtfilt, correlate, sosfiltfilt from scipy.signal import find_peaks, hilbert, butter, filtfilt, correlate, sosfiltfilt
from scipy.stats import linregress from scipy.stats import linregress
@ -104,6 +107,30 @@ def filter_signal_by_modes(time, signal, num_modes=1, bandwidth_factor=0.1, requ
return filtered_signals, dominant_freqs, time_filtered return filtered_signals, dominant_freqs, time_filtered
def plot_filtered_modes(t, e, e_filtered, e_frequencies, e_time, n_modes):
fig, ax = plt.subplots(nrows=n_modes+1, ncols=2, figsize=(12, 4 * n_modes), gridspec_kw={'width_ratios': [3, 1]})
ax[0, 0].plot(t, e)
ax[0, 0].set_title('Signal original')
ax[0, 0].set_xlabel('Temps (s)')
ax[0, 0].set_ylabel('Amplitude')
for i in range(n_modes):
ax[i+1, 0].plot(e_time, e_filtered[i])
ax[i+1, 0].set_title(f'Mode #{i+1} filtré ({e_frequencies[i]:.2f} Hz)')
ax[i+1, 0].set_xlabel('Temps (s)')
ax[i+1, 0].set_ylabel('Amplitude')
ax[i+1, 1].plot(e_time, e_filtered[i])
ax[i+1, 1].set_xlim(left=0.5 * e_time.mean(), right=0.5*e_time.mean() + 10/e_frequencies[i])
plt.tight_layout()
plt.show()
def analyze_signal_Hilbert(time, e_signal, s_signal, freq_rtol=0.01): def analyze_signal_Hilbert(time, e_signal, s_signal, freq_rtol=0.01):
""" """
Analyzes the dominant frequencies, phase shift, time shift, and periods between two signals e_signal(t) and s_signal(t) from a DataFrame. Analyzes the dominant frequencies, phase shift, time shift, and periods between two signals e_signal(t) and s_signal(t) from a DataFrame.
@ -544,4 +571,23 @@ def analyze_signal_wavelet(time, e_signal, s_signal, freq_rtol=0.01):
'delay': time_shift} 'delay': time_shift}
return res return res
def plot_phases(e_time, e_filtered, s_filtered, n_modes, callback=analyze_signal_wavelet):
fig, ax = plt.subplots(nrows=n_modes, figsize=(12, 6))
for mod in range(n_modes):
res = callback(e_time, e_filtered[mod], s_filtered[mod], freq_rtol=0.3)
ax[mod].set_title(f'Freq: {e_frequencies[mod]:.3f}, Phase: {res['phase']:.3f}, Delay: {res['delay']:.3f}' )
ax[mod].plot(e_time, e_filtered[mod], label='e')
ax[mod].plot(e_time, s_filtered[mod], label='s')
ax[mod].set_xlim(left=20, right=230)
for a in ax:
a.legend()
plt.tight_layout();
plt.show();