Datenvisualisierung für die Musteranalyse (sprachunabhängig, aber R bevorzugt)

11

Ich möchte die Bytes von einem Disk-Image zeichnen, um ein Muster in ihnen zu verstehen. Dies ist hauptsächlich eine akademische Aufgabe, da ich fast sicher bin, dass dieses Muster von einem Festplattentestprogramm erstellt wurde, aber ich würde es trotzdem gerne rückentwickeln.

Ich weiß bereits, dass das Muster mit einer Periodizität von 256 Zeichen ausgerichtet ist.

Ich kann mir zwei Möglichkeiten vorstellen, diese Informationen zu visualisieren: entweder eine 16x16-Ebene, die durch die Zeit betrachtet wird (3 Dimensionen), wobei die Farbe jedes Pixels der ASCII-Code für das Zeichen ist, oder eine 256-Pixel-Linie für jede Periode (2 Dimensionen).

Dies ist eine Momentaufnahme des Musters (Sie können mehr als eines sehen), xxddurchsichtig (32x16):

Zu analysierendes Muster

In beiden Fällen versuche ich, diese Informationen zu visualisieren. Dies ist wahrscheinlich für niemanden schwer in der Signalanalyse, aber ich kann anscheinend keinen Weg finden, Open-Source-Software zu verwenden.

Ich möchte Matlab oder Mathematica vermeiden und ich würde eine Antwort in R bevorzugen, da ich sie kürzlich gelernt habe, aber trotzdem ist jede Sprache willkommen.


Update, 25.07.2014: Angesichts der Antwort von Emre unten sieht das Muster so aus, wenn die ersten 30 MB des Musters bei 512 statt 256 ausgerichtet sind (diese Ausrichtung sieht besser aus):

Grafisches Muster

Weitere Ideen sind willkommen!

Valmiky Arquissandas
quelle
Ein Beispiel / Auszug der Daten (möglicherweise nur wenige MB) könnte interessant sein.
Marco13
Wenn Sie an der Periodizität der Daten interessiert sind, kann ein Blick auf die DFT der Daten aufschlussreich sein.
mrmcgreg
@mrmcgreg: Ich muss noch einmal lernen, wie die DFT funktioniert. Ich hätte mehr auf die
Signal- und Systemklassen achten sollen

Antworten:

5

Ich würde eine visuelle Analyse verwenden. Da Sie wissen, dass alle 256 Bytes eine Wiederholung erfolgt, erstellen Sie ein Bild mit einer Breite von 256 Pixel und einer beliebigen Tiefe und codieren Sie die Daten mit Helligkeit. In (i) Python würde es so aussehen:

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);

So sieht ein PDF aus:

Eine visualisierte PDF-Datei

Ein periodisches Muster von 256 Byte hätte sich als vertikale Linien manifestiert. Bis auf den Header und das Tail sieht es ziemlich laut aus.

Emre
quelle
Das sieht ganz nach dem aus, wonach ich suche. Ich studiere jetzt für das Finale und kann mir keine Zeit nehmen, noch einmal darüber nachzudenken, aber sobald ich kann, werde ich es dich wissen lassen. "Ein periodisches Muster von 256 Byte hätte sich als vertikale Linien manifestiert." - genau das, woran ich dachte. Ich kann auch ein Bild zeigen, in dem ich alle 256 Bytes in dieselbe Zeile setze, und das ist bereits im Text offensichtlich. Ich bin ziemlich gespannt, was dabei herauskommt :)
Valmiky Arquissandas
Ich kann das scheinbar nicht unter Debian Linux ausführen. Ich habe die Pakete installiert python-scitoolsund ipython. Die Fehlermeldung lautet ValueError: invalid literal for int() with base 10: '#'. Ich werde sehen, ob ich es trotzdem schaffen kann ...
Valmiky Arquissandas
Es gelang mir (indem ich den Code direkt im Inneren ipythonmap(int, line)map(ord, line)
ausführte
Ich habe ein Jahr gebraucht, aber ich habe beschlossen, diese Antwort zu akzeptieren. Ich weiß immer noch nicht, was dieser Bitstream ist, aber ich werde es wahrscheinlich nicht herausfinden. Es hat aber ein schönes Muster!
Valmiky Arquissandas
1

Ich weiß fast nichts über Signalanalyse, aber die zweidimensionale Visualisierung könnte leicht mit R durchgeführt werden. Insbesondere benötigen Sie reshape2und ggplot2Pakete. Angenommen, Ihre Daten sind breit (z. B. [n x 256]), müssen Sie sie zuerst mithilfe der Funktion aus dem Paket in ein Langformat umwandeln . Verwenden Sie dann Geometrie von . Hier ist ein schönes Rezept mit Kern .melt()reshape2geom_tileggplot2

Sobach
quelle
2
Es sind über 4 GB Daten. Ich sollte es durch Lesen von stdin oder ähnlichem planen. Es ist eine schlechte Idee, alles in den Arbeitsspeicher zu laden. Ich werde mir ansehen, was Sie in ein paar Tagen gesagt haben - und hoffentlich auch andere Ideen, die auftauchen könnten - und Sie wissen lassen, wie es gelaufen ist, danke!
Valmiky Arquissandas
Laden Sie es nicht ein und behandeln Sie es wie einen Datenrahmen, es ist kein Datenrahmen, es ist ein Strom von Bytes.
Spacedman
1

Ich würde mir das rasterPaket dafür ansehen , das binäre Rohdaten einlesen und als NxM-Gitter darstellen kann. Es kann sogar Teilmengen großer Binärgitter extrahieren, ohne die gesamte Datei einlesen zu müssen (das R-Raster-Objekt selbst ist nur ein Proxy für die Daten, nicht für die Daten selbst).

Spacedman
quelle