This commit is contained in:
François Boulogne 2025-08-29 16:50:19 +02:00
parent 3e15c2ebf5
commit 78157bcc7b

View file

@ -91,7 +91,7 @@ def filter_signal_by_modes(time, signal, num_modes=1, bandwidth_factor=0.1, nyqu
return filtered_signals, dominant_freqs, time_filtered
def analyze_signal_Hilbert(time, e_signal, s_signal):
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.
Uses Hilbert transform method for phase shift calculation (single mode only).
@ -143,8 +143,8 @@ def analyze_signal_Hilbert(time, e_signal, s_signal):
freq_s = s_peak_freqs[s_idx]
# Check if frequencies match within 1%
if np.abs(freq_e - freq_s) / ((freq_e + freq_s)/2) > 0.01:
raise ValueError("Frequency difference exceeds 1%. Phase shift cannot be determined.")
if np.abs(freq_e - freq_s) / ((freq_e + freq_s)/2) > freq_rtol:
raise ValueError(f"Frequency difference exceeds {freq_rtol*100}%. Phase shift cannot be determined.")
# Calculate mean frequency for phase shift calculation
mean_freq = (freq_e + freq_s) / 2
@ -200,7 +200,7 @@ def analyze_signal_Hilbert(time, e_signal, s_signal):
return (period_e, period_s, freq_e, freq_s,
mean_phase_diff, phase_diff_deg, time_shift)
def analyze_signal_sinfit(time, e_signal, s_signal):
def analyze_signal_sinfit(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.
Uses curve fitting method for phase shift calculation (single mode only).
@ -252,8 +252,8 @@ def analyze_signal_sinfit(time, e_signal, s_signal):
freq_s = s_peak_freqs[s_idx]
# Check if frequencies match within 1%
if np.abs(freq_e - freq_s) / ((freq_e + freq_s)/2) > 0.01:
raise ValueError("Frequency difference exceeds 1%. Phase shift cannot be determined.")
if np.abs(freq_e - freq_s) / ((freq_e + freq_s)/2) > freq_rtol:
raise ValueError(f"Frequency difference exceeds {freq_rtol*100}%. Phase shift cannot be determined.")
# Calculate mean frequency for phase shift calculation
mean_freq = (freq_e + freq_s) / 2
@ -300,7 +300,7 @@ def analyze_signal_sinfit(time, e_signal, s_signal):
def analyze_signal_cross_correlation(time, e_signal, s_signal):
def analyze_signal_cross_correlation(time, e_signal, s_signal, freq_rtol=0.01):
"""
Analyzes signals using cross-correlation method for phase shift calculation (single mode only).
"""
@ -351,8 +351,8 @@ def analyze_signal_cross_correlation(time, e_signal, s_signal):
freq_s = s_peak_freqs[s_idx]
# Check if frequencies match within 1%
if np.abs(freq_e - freq_s) / ((freq_e + freq_s)/2) > 0.01:
raise ValueError("Frequency difference exceeds 1%. Phase shift cannot be determined.")
if np.abs(freq_e - freq_s) / ((freq_e + freq_s)/2) > freq_rtol:
raise ValueError(f"Frequency difference exceeds {freq_rtol*100}%. Phase shift cannot be determined.")
# Calculate mean frequency for phase shift calculation
mean_freq = (freq_e + freq_s) / 2
@ -401,7 +401,7 @@ def analyze_signal_cross_correlation(time, e_signal, s_signal):
phase_diff, phase_diff_deg, time_shift)
def analyze_signal_wavelet(time, e_signal, s_signal):
def analyze_signal_wavelet(time, e_signal, s_signal, freq_rtol=0.01):
"""
Analyzes signals using wavelet transform for phase shift calculation (single mode only).
"""
@ -452,8 +452,8 @@ def analyze_signal_wavelet(time, e_signal, s_signal):
freq_s = s_peak_freqs[s_idx]
# Check if frequencies match within 1%
if np.abs(freq_e - freq_s) / ((freq_e + freq_s)/2) > 0.01:
raise ValueError("Frequency difference exceeds 1%. Phase shift cannot be determined.")
if np.abs(freq_e - freq_s) / ((freq_e + freq_s)/2) > freq_rtol:
raise ValueError(f"Frequency difference exceeds {freq_rtol*100}%. Phase shift cannot be determined.")
# Calculate mean frequency for phase shift calculation
mean_freq = (freq_e + freq_s) / 2