12.2.4.1 : Le Format de données



Comme nous voulons un format de données rapide et efficace, nous allons naturellement choisir HDF5. Le format HDF5 est organisé en tableau. Chaque tableau a des colonnes nommées. Et chaque colonne peut contenir des données multi-dimensionnelles (vecteurs, matrices, tenseurs, etc).

En lisant la documentation, on constate qu'il n'y a pas de type complex. On pourrait se dire que c'est un scandale, car c'est simple de gérer les nombres complexes, puisqu'il y en a dans la bibliothèque standard.

Nous allons quand même prendre deux minutes pour comprendre pourquoi les développeurs de HDF5 ont fait ce choix :
  • Dans la bibliothèque de standard les complex sont composés d'une partie réelle contigüe à une partie imaginaire.
  • Suivant les calculs que l'on veut faire, on pourrait vouloir un vecteur des parties réelles et un vecteur de parties imaginaires.
  • Il faut aussi prendre en compte le nombre de méthodes de stockage possible pour les nombres (float32 (float), float64 (double), float16, float128 (long double), BF16, float8 (E5M2 et E4M3). Et on pourrait ajouter les types entiers qui pourraient très bien être utilisés en fonction de la précision désirer, où si il est important que les données se compressent efficacement. On peut donc ajouter char, short, int, long et unsigned char, unsigned short, unsigned int, unsigned long. Il va de soit que le nombre de combinaisons possible rendrait une telle implémentation bien trop compliquée à maintenir sur le long terme.


Tout ça pour dire qu'il n'y a pas de type complex dans HDF5 et que c'est bien normal.

Pour résoudre notre problème, il nous faudra juste utiliser une matrice à deux colonnes. La première sera la partie réelle et la seconde sera la partie imaginaire.

À partir de maintenant, vous pouvez implémenter vous même le format de données, mais nous allons utiliser un générateur de code qui fera ça pour nous.

Voici la configuration RawHdf5.ph5 que nous allons utiliser :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
///@brief Raw data to be used to perform FFT on it
RawHdf5[raw]{
	///Signal in some unit with a phase (can be seen as complex number)
	Tensor(float, 2) signal;
}


TableSource{
	
	int startTimeSecond;
	
	int startTimeNanoSecond;
	
	Tensor(float, nbPoint) source;
}


Si on appelle phoenix_hdf5 :
phoenix_hdf5 -i RawHdf5.ph5


Cette commande va nous créer les fichiers :