Visualizzazione dei dati per l'analisi del modello (indipendente dalla lingua, ma preferita da R)


11

Voglio tracciare i byte da un'immagine del disco per capire un modello in essi. Questo è principalmente un compito accademico, poiché sono quasi sicuro che questo modello sia stato creato da un programma di test del disco, ma mi piacerebbe comunque decodificarlo.

So già che il modello è allineato, con una periodicità di 256 caratteri.

Posso immaginare due modi per visualizzare queste informazioni: un piano 16x16 visto nel tempo (3 dimensioni), in cui il colore di ciascun pixel è il codice ASCII per il personaggio, oppure una linea di 256 pixel per ogni periodo (2 dimensioni).

Questa è un'istantanea del pattern (puoi vedere più di uno), visto attraverso xxd(32x16):

Pattern da analizzare

Ad ogni modo, sto cercando di trovare un modo per visualizzare queste informazioni. Questo probabilmente non è difficile per nessuno nell'analisi del segnale, ma non riesco a trovare un modo usando il software open source.

Vorrei evitare Matlab o Mathematica e preferirei una risposta in R, dal momento che l'ho imparata di recente, ma comunque, qualsiasi lingua è la benvenuta.


Aggiornamento, 25/07/2014: data la risposta di Emre di seguito, ecco come appare il modello, dati i primi 30 MB del modello, allineati a 512 anziché 256 (questo allineamento sembra migliore):

Modello grafico

Altre idee sono benvenute!


Un esempio / estratto dei dati (forse solo pochi MB) potrebbe essere interessante.
Marco13,

Se sei interessato alla natura periodica dei dati, dare un'occhiata al DFT dei dati potrebbe essere rivelatore.
mrmcgreg,

@mrmcgreg: dovrò imparare di nuovo come funziona il DFT. Avrei dovuto prestare maggiore attenzione alle classi dei segnali e dei sistemi :)
Valmiky Arquissandas,

Risposte:


5

Vorrei usare un'analisi visiva. Dato che sai che c'è una ripetizione ogni 256 byte, crea un'immagine larga 256 pixel per ogni profondità, e codifica i dati usando la luminosità. In (i) python sarebbe simile al seguente:

import os, numpy, matplotlib.pyplot as plt

%matplotlib inline

def read_in_chunks(infile, chunk_size=256):
    while True:
        chunk = infile.read(chunk_size)
        if chunk:
            yield chunk
        else:
            # The chunk was empty, which means we're at the end
            # of the file
            return

fname = 'enter something here'
srcfile = open(fname, 'rb')
height = 1 + os.path.getsize(fname)/256
data = numpy.zeros((height, 256), dtype=numpy.uint8)    

for i, line in enumerate(read_in_chunks(srcfile)):
    vals = list(map(int, line))
    data[i,:len(vals)] = vals

plt.imshow(data, aspect=1e-2);

Ecco come appare un PDF:

Un file PDF visualizzato

Un modello periodico a 256 byte si sarebbe manifestato come linee verticali. Tranne l'intestazione e la coda sembra piuttosto rumoroso.


Sembra proprio quello che sto cercando. Ora sto studiando per le finali e non riesco a prendermi del tempo per pensarci di nuovo, ma appena posso ti farò sapere. "Un modello periodico a 256 byte si sarebbe manifestato come linee verticali." - esattamente quello a cui stavo pensando. Posso anche mostrare un'immagine in cui ho inserito tutti i 256 byte nella stessa riga, e questo è già evidente nel testo. Sono abbastanza curioso di sapere cosa ne verrà fuori :)
Valmiky Arquissandas il

Non riesco a farlo funzionare su Debian Linux. Ho installato i pacchetti python-scitoolse ipython. Il messaggio di errore è ValueError: invalid literal for int() with base 10: '#'. Vedrò se riesco comunque a farlo funzionare ...
Valmiky Arquissandas,

Sono riuscito (eseguendo il codice direttamente all'interno ipython, e cambiando map(int, line)a map(ord, line), e aggiornato la questione con la nuova immagine.
Valmiky Arquissandas

Mi ci è voluto un anno, ma ho deciso di accettare questa risposta. Ancora non so cosa sia quel bitstream, ma probabilmente non lo scoprirò. Ha un bel modello, però!
Valmiky Arquissandas,

1

Non so quasi nulla dell'analisi del segnale, ma la visualizzazione bidimensionale potrebbe essere facilmente eseguita usando R. In particolare, avrai bisogno di pacchetti reshape2e ggplot2pacchetti. Supponendo che i tuoi dati siano ampi (ad es. Dimensione [n X 256]), devi prima trasformarli in un formato lungo usando la melt()funzione dal reshape2pacchetto. Quindi utilizzare la geom_tilegeometria da ggplot2. Ecco una bella ricetta con sostanza .


2
Sono oltre 4 GB di dati. Dovrei tracciarlo leggendo da stdin o qualcosa di simile. È una cattiva idea caricare tutto nella RAM. Daremo un'occhiata a quello che hai detto tra un paio di giorni - e, si spera, qualsiasi altra idea che possa sorgere - e ti farò sapere come è andata, grazie!
Valmiky Arquissandas,

Non caricarlo e trattarlo come un frame di dati, non è un frame di dati, è un flusso di byte.
Spacedman,

1

Vorrei esaminare il rasterpacchetto per questo, che può leggere in dati binari non elaborati e presentarlo come griglie NxM. Può persino estrarre sottogruppi di griglie binarie di grandi dimensioni senza dover leggere l'intero file (l'oggetto R raster stesso è solo un proxy per i dati, non per i dati stessi).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.