Project

General

Profile

Wiki » History » Version 12

Theo Stassen, 15/03/2023 05:11 PM

1 3 Laurent Mirioni
h1. En bref
2
3 5 Laurent Mirioni
4 6 Laurent Mirioni
5 1 Laurent Mirioni
h1. Infos en vrac (à réarranger)
6
7 2 Laurent Mirioni
h2. Site Web JUICE officiel
8
9
https://www.cosmos.esa.int/web/juice
10
11 1 Laurent Mirioni
h2. JUICE Livelink
12
13
Les présentations des différents SWT sont disponibles sur le livelink de JUCE : https://dms.cosmos.esa.int/cs/cs?func=ll&objId=3169397&objAction=browse&viewType=1 (demander les identifiants à Laurent si besoin)
14
15 6 Laurent Mirioni
h2. JUICE/RPWI Ground segment piipeline 
16 1 Laurent Mirioni
17 6 Laurent Mirioni
Le traitement des données SCM (spectres et formes d'ondes) sera intégré au pipeline du consortium RPWI (lead. Uppsala). 
18
19
Voir le plan de développement ici : https://hephaistos.lpp.polytechnique.fr/redmine/documents/182 (à mettre à jour -> demander à D. Andrews)
20 3 Laurent Mirioni
Gitlab: https://spis.irfu.se/rpwi/rpwi_pipeline/ (compte personnel avec adresse e-mail LPP)
21
Documentation: https://www.space.irfu.se/juice/rpwi_pipeline/index.html (demander les identifiants à Laurent si besoin)
22 7 Theo Stassen
23
Lien pour tutoriel pratique "Python Documentation Using Sphinx Autosummary" : https://medium.datadriveninvestor.com/python-documentation-using-sphinx-f6dc87e1286b
24 8 Theo Stassen
25 12 Theo Stassen
h2. Notes sur l'avancée du code
26
27
- actuellement, les tests de comparaison sont effectués pour un fs = 31.995 comme idl le fait de base, on obtient des résultats où la phase du kernel résultant vaut +/- 40, et on obtient pareil (à epsilon prêt) en python.
28
Si on force le code à utiliser fs = 32 à la place, les résultats changent, la phase dans le kernel IDL vaut +/- 1e-11 , et 0 en python (donc très proche)
29
30
31
h2. Documentation code
32 8 Theo Stassen
33
Le readme.md contenu dans le code uploadé sur le github possède une explication complète de la structure du fichier IDL deconvo_vec qui contient tout ce que l'on traduit en python actuellement, et la structure du fichier python deconvo_vec équivalent et de toutes les fonctions qui en découle (en cours de construction).
34 11 Theo Stassen
Je copie une version ici (visuellement plus agréable dans github:
35 1 Laurent Mirioni
36 10 Theo Stassen
**Documentation FR de l'avancé du portage IDL -> Python.**
37 9 Theo Stassen
38 10 Theo Stassen
Actuellement on se concentre sur le portage de la fonction _mms_scm_deconvo_vec_
39 1 Laurent Mirioni
40 10 Theo Stassen
Cette fonction prend en entrée une waveform et des metadatas.
41
L'object est d'effectuer la calibration continue de la waveform en convolvant 
42
le signal par un kernel que l'on construit au préalable.
43 1 Laurent Mirioni
44 10 Theo Stassen
Les différentes étapes de _mms_scm_deconvo_vec_ sont :
45 1 Laurent Mirioni
46 10 Theo Stassen
1. (on précentre la waveform d'entrée)
47
2. On souhaite créer un kernel de taille n_k, on commence donc par former un "complex spectrum" **s** de base
48
  (un array de complexes 1+0j, de taille n_k) 
49
3. On applique à **s** la fonction _mms_scm_corgain_ (même fichier)
50
   1. On crée un array de fréquence **f** linéairement croissant de pas df = f_e / n_k (f_e = fréquence d'échantillonnage), de longueur n_k
51
     auquel on soustrait f_e la seconde moitié, on a donc un array de fréquence allant de 0 -> fe/2 puis -fe/2 -> 0
52
       (le format nécessaire pour la fft)
53
   2. On calcule la réponse **c** renvoyée par _mms_corgain_
54
      1. La fonction récupère les données dans le fichier de référence des antennes (dont on a donné le path),
55
       qui contient, pour chaque antenne, un array de fréquence et pour chaque fréquence la réponse complexe référence 
56
       correspondante.
57
      2. Si **f** contient des fréquences en dehors du range du fichier de référence, 
58
       on considère que la réponse de l'antenne va être calculée pour la fréquence référence la plus proche
59
      3. On obtient la réponse de l'antenne, calculée pour chaque valeur de **f** par interpolation 
60
       des données de référence.
61
      4. On multiplie cette réponse par la valeur absolue de la réponse du filtre dfb,
62
       implémenté dans _mms_scm_dfb_dig_filter_resp_ (qui renvoie une réponse pour chaque fréquence de **f**)
63
      5. On multiplie cette réponse par la réponse du filtre bessel, implémenté dans _bessel_filter_resp_ 
64
       (qui renvoie une réponse pour chaque fréquence de **f**)
65
      6. On renvoie cette réponse
66
   3. Maintenant que l'on a **c**, on divise **s** par **c** (on applique la correction au spectre d'entrée en somme)
67
   4. La phase du terme de fréquence 0 de la réponse doit valoir 0 pour pouvoir appliquer la FFT,
68
     on set ce terme à la valeur absolue de sa valeur complexe
69
4. On a maintenant un **s** qui a subit la correction de l'antenne + dfb + bessel
70
5. On applique un filtre passe bande par _mms_scm_filtspe_ entre f_min et f_max donnés en entrée
71
6. On applique une transformée de fourier inverse, non encore normalisée, à **s**,
72
on obtient alors ce que le code appelle le kernel (qui n'est pas encore le kernel final)
73
7. Maintenant on prend seulement la partie réelle (sachant que l'imaginaire doit être négligeable si les calculs sont corrects)
74
8. On shift le kernel 
75
9. On lui applique la fenetre de convolution (Hanning, coscub, trapezoid, etc)
76
10. On normalise le kernel
77
11. On peut maintenant effectuer la convolution (_mms_scm_fastconvol_) pour la waveform d'entrée et le kernel calculé
78 9 Theo Stassen
79 10 Theo Stassen
Dans le code python, nous avons une fonction **_deconvo_vec_** correspondant à _mms_scm_deconvo_vec_ : 
80 9 Theo Stassen
81 10 Theo Stassen
1. (on précentre la waveform d'entrée)
82
2. On crée l'array de fréquence **f** en premier ( étape 3.i)
83
2. On crée le kernel non normalisé (-> étapes 2 à 6 sauf 3.i), en utilisant la fonction _**kernel_creation**_
84
   1. On crée le complex spectrum de base **spectrum** équivalent à **s** ( étape 2)
85
   2. On applique la fonction _**corr_gain_ant**_ à **spectrum** avec **f** comme argument (étape 3.ii:iv)
86
      1. On obtient **gain_array** (équivalent de **c**), initialement la réponse de l'antenne calculée par la fonction _**ant_resp**_ (3.ii.a:c) :
87
         1. La fonction récupère les données du fichier de référence (3.ii.a)
88
         2. Elle règle le problème de valeur hors range (3.ii.b)
89
         3. On effectue l'interpolation pour obtenir la réponse de l'antenne (3.ii.c) 
90
      2. On multiplie **gain_array** par la valeur absolue de la réponse du filter dfb, implémenté dans _**dfb_filter**_ (3.ii.d)
91
      3. On multiplie **gain_array** par la réponse du filter bessel, implémenté dans _**bessel_filter**_ (3.ii.e)
92
      4. On divise **spectrum** par **gain_array** (3.iii)
93
      5. On modifie le terme de fréquence 0 (3.iv)
94
   3. On applique une filtre passe bande à **spectrum** (_**bandpass_filter**_) (5)
95
   4. On applique la transformée de fourier inverse à **spectrum** (_**fft**_) et obtient **kernel** (6)
96
3. On vérifie que la partie réelle est bien négligeable et on prend uniquement la partie réelle. (7)
97
4. On shift le kernel (8))
98
5. On applique la fenêtre de convolution choisie à **kernel** en utilisant les fonction _**conv_windows**_ (9)
99
6. On normalise le kernel (10)