diff --git a/mysignal/__init__.py b/mysignal/__init__.py index 124e462..c3bb296 100644 --- a/mysignal/__init__.py +++ b/mysignal/__init__.py @@ -1 +1 @@ -__version__ = '0.1.7' +__version__ = '0.1.8' diff --git a/mysignal/phasefreq.py b/mysignal/phasefreq.py index cb8e4ce..4099d2f 100644 --- a/mysignal/phasefreq.py +++ b/mysignal/phasefreq.py @@ -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(); \ No newline at end of file