From a17d8f414a3e5c96c12fd8e904e85ecbc7cd03bc Mon Sep 17 00:00:00 2001 From: MigAP Date: Sat, 28 Nov 2020 11:26:23 +0100 Subject: [PATCH] better filtering for periodic phenomena --- module3/exo3/exercice_python_fr.org | 74 ++++++++++++++++++++++++----- 1 file changed, 62 insertions(+), 12 deletions(-) diff --git a/module3/exo3/exercice_python_fr.org b/module3/exo3/exercice_python_fr.org index 9847c91..4c09a1a 100644 --- a/module3/exo3/exercice_python_fr.org +++ b/module3/exo3/exercice_python_fr.org @@ -120,7 +120,7 @@ les oscillations rapides observés précédément. #+begin_src python :results file :session :var matplot_lib_filename="zoomRawData.png" :exports both # Window's size where we want to zoom. - windowSize = 150; + windowSize = 450; plotDatesZoom = pltDates.date2num(dates[:windowSize]) plt.figure(figsize=(10,5)) @@ -138,7 +138,6 @@ Sur cette figure on met plus en évidence les oscillations rapides sur le niveau de concentration de CO2. D'après la figure, dans un premier temps supposer que les oscillations ont une période de un ans. * Analyse fréquentielle de la variation de la concentration de CO2. -On possède des données toutes les semaines. #+begin_src python :results file :session :var matplot_lib_filename="dataFFT.png" :exports both import numpy as np @@ -147,9 +146,9 @@ On possède des données toutes les semaines. co2 = np.array(concentration) #Remove mean value - co2 = co2 - np.mean(co2) + co2NoMean = co2 - np.mean(co2) # Concentration FFT - concentrationFFT = np.fft.fft(co2) + concentrationFFT = np.fft.fft(co2NoMean) # We take the norm of the FFT concentrationFFTNorm = np.absolute(concentrationFFT) concentrationFFTAngle = np.angle(concentrationFFT) @@ -194,16 +193,23 @@ caractériser les différérentes fréquences d'oscillations du signal. #+RESULTS: [[file:fftZoom.png]] -On remarque que les "petites" oscillations ont une amplitude -d'environ 1400. On tentera de filtrer donc le signal au dessus de ce -seuil. -** Filtrage des grandes oscillations +On remarque sur le spectre du signal que le phénomène périodique +possède deux pics d'amplitudes d'environ 1400 et 4000. On suppose que +le premier pic avec une plus grande amlitude correspond au phénomène +périodique que l'on a mis en évidence dans le graphique temporel des +données. En effet on a supposé précédemment que les oscillations +avaient une période de un an, notre unité de temps étant une semaine, +on peut déduire la fréquence des oscillation en supposant que une +année a 52 semaine : \( f = \frac{1}{52} \approx 0.019 \) ce qui reste +cohérent avec notre analyse fréquentielle. +** Filtrage de la contribution lente -On élimine toutes les valeurs au dessus du seuil établit précédemment. +On élimine toutes les valeurs au dessus des seuis établis +précédemment. #+begin_src python :results file :session :var matplot_lib_filename="smallOsillations.png" :exports both # Extraction of the small oscillations - smallAmplitude = 1400 + smallAmplitude = 4000 smallNorm = np.copy(concentrationFFTNorm) smallNorm[smallNorm > smallAmplitude] = 0 @@ -237,13 +243,29 @@ On élimine toutes les valeurs au dessus du seuil établit précédemment. #+RESULTS: [[file:smallOsillationsTime.png]] -** Filtrage des petites oscillations + + +#+begin_src python :results file :session :var matplot_lib_filename="smallOsillationsTimeZoom.png" :exports both + plt.figure(figsize=(10,5)) + plt.plot(t,smallSignal) + plt.ylim(-10,10) + plt.tight_layout() + + plt.savefig(matplot_lib_filename) + matplot_lib_filename +#+end_src + +#+RESULTS: +[[file:smallOsillationsTimeZoom.png]] + +On peut déduire que le phénomère périodique a une amplitude de cinq d'après le graphique. +** Filtrage du phénomène périodique On élimine toutes les valeurs au dessus du seuil établit précédemment. #+begin_src python :results file :session :var matplot_lib_filename="bigOsillations.png" :exports both # Extraction of the big oscillations - bigAmplitude = 1400 + bigAmplitude = 4000 bigNorm = np.copy(concentrationFFTNorm) bigNorm[bigNorm < bigAmplitude] = 0 @@ -276,3 +298,31 @@ On élimine toutes les valeurs au dessus du seuil établit précédemment. #+RESULTS: [[file:bigOsillationsTime.png]] +** Comparaison des signaux bruts et filtrés + +#+begin_src python :results file :session :var matplot_lib_filename="bigOsillationsComparisons.png" :exports both + plt.figure(figsize=(10,5)) + plt.plot(t,co2,label="measures") + plt.plot(t,bigSignal+np.mean(co2),label="filtered") + plt.legend() + plt.tight_layout() + + plt.savefig(matplot_lib_filename) + matplot_lib_filename +#+end_src + +#+RESULTS: +[[file:bigOsillationsComparisons.png]] +* Modélisation des phénomènes et extrapolations +** Oscillations périodiques +L'analyse fréquentielle nous a permis caractériser le phénomène +périodique par un signal de fréquence \( f = 0.02 \) par unité de +temps (par semaine), et avec une amplitude de 5. Ainsi, soit \(s_p(t)\) le +signal périodique avec \(t\) en semaine on a : + +\begin{equation} +s_p(t) = 5 \cos (0.02 t) +\end{equation} + + + -- 2.18.1