Open sofian opened 4 years ago
Ça pourrait être intéressant en fait de simplement encoder nos informations dans un format déjà établi. Il existe deux candidats:
Par rapport à OpenSignals voir: https://pypi.org/project/opensignalsreader/
Pour EDF pas besoin de réinventer la roue, sur Arduino on pourrait utiliser une des librairies suivantes: https://github.com/pkhorsand/EDFlib https://github.com/idotta/edfio/
Il y en a peut-être d'autres.
Un autre: https://github.com/macawm/edflib
Example du header implémenter:
timestamp,heart,gsr1,gsr2,resp
À la suite de ça les données sont enregistrer comme un CSV.
C'est bien, l'information est là. L'encodage en CSV a l'avantage d'être lisible mais n'est pas le plus compact. Peut-être que ce n'est pas grave mais à 1000Hz ça peut quand même se remplir assez vite. Tu peux faire le calcul pour comparer avec un encodage de chaque channel sur 16 bits (2 bytes) comme c'est fait en EDF. Par comparaison en CSV chaque channel prend 1 byte (pour la virgule) + autant de bytes qu'il y a de caractères nécessaires pour exprimer le chiffre encoder (eg. si les données vont de 0 à 1024 le max est donc de 4 caractères soit 4 bytes; donc 5 bytes par channel vs 2 bytes par channel pour le EDF -- c'est 2.5x plus).
C'est peut-être pas un gros problème mais... disons pour une heure d'enregistrement on aura 1000Hz x 60 secondes x 60 minutes x 4 channels = 14,400,000 données. En format CSV le fichier prendra 720,000,000 bytes (~72 M) vs 28,800,000 (~28.8M) en EDF.
Pour écrire des données binaires au lieu de ASCII avec l'objet SD tu peux (je pense) utiliser la méthode write(buf,len). Eg.
int16_t value = sensor.getRaw();
file.write((unsigned char*)&value, sizeof(int16_t));
Ici on convertis la variable "value" en un array de unsigned char (ie. des bytes) donc un array de 2 bytes; sizeof(int16_t) va retourner la valeur "2" donc on va écrire 2 bytes sur la carte.
C'est bien, l'information est là. L'encodage en CSV a l'avantage d'être lisible mais n'est pas le plus compact. Peut-être que ce n'est pas grave mais à 1000Hz ça peut quand même se remplir assez vite. Tu peux faire le calcul pour comparer avec un encodage de chaque channel sur 16 bits (2 bytes) comme c'est fait en EDF. Par comparaison en CSV chaque channel prend 1 byte (pour la virgule) + autant de bytes qu'il y a de caractères nécessaires pour exprimer le chiffre encoder (eg. si les données vont de 0 à 1024 le max est donc de 4 caractères soit 4 bytes; donc 5 bytes par channel vs 2 bytes par channel pour le EDF -- c'est 2.5x plus).
C'est peut-être pas un gros problème mais... disons pour une heure d'enregistrement on aura 1000Hz x 60 secondes x 60 minutes x 4 channels = 14,400,000 données. En format CSV le fichier prendra 720,000,000 bytes (~72 M) vs 28,800,000 (~28.8M) en EDF.
C'est à ces résultats la que je suis arrivé lundi lorsque j'ai calculé la différence de taille des fichiers. Je me suis dit que même si le fichier serait plus gros il ne serait pas trop gros et permettrait quand même plusieurs heures d'enregistrement sur une carte sd de 4gig.
Pour écrire des données binaires au lieu de ASCII avec l'objet SD tu peux (je pense) utiliser la méthode write(buf,len). Eg.
int16_t value = sensor.getRaw(); file.write((unsigned char*)&value, sizeof(int16_t));
Ici on convertis la variable "value" en un array de unsigned char (ie. des bytes) donc un array de 2 bytes; sizeof(int16_t) va retourner la valeur "2" donc on va écrire 2 bytes sur la carte.
C'est possible oui, j'avais de la misère lundi avec la méthode write() par contre. En écrivrant les données ascii directement en utilisant la méthode File.print() on arrive quand même à la vitesse désirer ( 1000hz) et ça me semblait plus flexible que d'utiliser write(). On peut surment adapter la code pour utiliser .write() si c'est ce que l'on souhaite
Pour chaque session d'enregistrement à mon avis il faut enregistrer à la fois (1) des "méta données" relatives à chaque session (par exemple, la date et l'heure de la séance, la durée totale, le lieu, le nom de la personne enregistrée, etc.); (2) un "log" de toutes les données enregistrées avec des timestamps.
Ce qui est névralgique est de tester qu'on est bien capable d'enregistrer un certain nombre de signaux (je dirais, disons, 4-5 channels de données, probablement en float 32 bits chaque) en temps réel à 1000 Hz.