Code source de xphs1903.analyse

from logging import getLogger

from numpy import array, mean, zeros
from numpy.fft import rfft, rfftfreq
from pandas import DataFrame, Series
from scipy.signal import get_window

logging = getLogger(__name__)

# ==================================
# = Fonctions d'analyse de données =
# ==================================


[docs] def fft( res: DataFrame, N_max: int = 1700, nom_cadre: str = 'hann' ) -> tuple[array, ...]: """Retourne la transformée de Fourier des données contenues dans :py:data:`res`. C'est une bonne idée de personnaliser cette fonction selon vos besoins. Pour bien comprendre ce que fait la fonction, vous devriez consulter :py:func:`scipy.signal.get_window`, :py:func:`numpy.fft.rfft` et :py:func:`numpy.fft.rfftfreq`. Pour les mathématiques derrière, consultez dans un premier lieu votre chargé de groupe. Parameters ------------ nom_cadre res Liste des mesures, au format ``[t, pd1, pd2, ...]`` N_max Nombre de mesures à utiliser Returns ------------- fs Fréquences associées à la transformée ys Transformées. """ N: int = min(res.index.size, N_max) # Nombre de valeurs à considérer # Estimation de l'espacement, basé sur les mesures ts: Series = res.t.to_numpy() # noinspection PyTypeChecker d: float = mean(ts[1:] - ts[:-1]) ys = [] cadre = get_window(nom_cadre, N) signal = zeros(N) for sigcol in res.columns[1:]: sig = res[sigcol].to_numpy() if len(sig) < N: logging.error('Données mal acquises...:\n\tsig = %r', sig) else: signal = sig[-N:] * cadre ys.append(abs(rfft(signal))) fs = rfftfreq(signal.size, d=d) # Équivalent à # return fs, ys[0], ys[1], ... return fs, *ys