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 pywt
import matplotlib.pyplot as plt
from scipy.fft import fft, fftfreq
from scipy.signal import find_peaks, hilbert, butter, filtfilt, correlate, sosfiltfilt
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
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):
"""
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}
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();