Esempio conversione files binari Red Pitaya

In questo quaderno viene fornito un semplice esempio per convertire in formato ASCII i files binari salvati dall'acquisizione. In particolare i files hanno suffisso _events.ade

Definisco i files di input e output. Chiaramente se si hanno più files da convertire si può automatizzare ciclando

Per leggere dati binari, utilizziamo una struttura. Un evento è infatti una struttura da 16 bytes formattata nel modo seguente:

64 bits - timestamp (format string: Q)
16 bits - qshort    (format string: H)
16 bits - qlong     (format string: H)
16 bits - baseline  (format string: H)
 8 bits - channel   (format string: B)
 8 bits - PUR flag  (format string: B)

In questo caso apro in scrittura "normale" w il file di output ed in lettura binaria rb il file di input. Dopo aver aggiunto un header (che può essere rimosso) vado a leggere un evento per volta (ovvero un subset di lunghezza pari alla mia struttura) e lo scrivo in un file di testo.

A noi interessa solamente qlong: uno volendo poterbbe salvarsi solo quello. Oppure anziché convertire in un file ASCII si può anche memorizzarli direttamente in un vettore. Questo è un esempio base

Utilizziamo numpy

L'esempio sopra può essere utile nella realizzazione di uno script che converta i files binari in files ASCII. Per i nostri scopi tale passaggio non è veramente necessario. A patto di spiegargli come sono codificati, numpy è perfettamente in grado di leggere files binari. Un esempio è riportato in questo esempio del prof. Mascagna.

Definiamo come prima cosa il nostro tipo di dato (u sta per intero senza segno, mentre il numero decimale indica il numero di bytes)

Per caricare i dati si utilizza il metodo np.fromfile che permette di leggere i dati a partire da un file aperto, in questo caso in lettura binaria "rb", specificando il tipo di dato appena costruito

Conclusioni

Il primo approccio è utile nel caso in cui si voglia creare un file ASCII per motivi ben precisi. Tuttavia per poter analizzare i dati con Python tale step non è assolutamente necessario, ed anzi personalmente trovo pure più naturale l'approccio con numpy.

Nonostante le due operazioni non siano proprio analoghe, volevo evidenziare come il primo caso risulti 200 volte più lento del secondo