Visualisation des données pour l'analyse de modèle (indépendant du langage, mais R préféré)

11

Je veux tracer les octets d'une image disque afin de comprendre un modèle en eux. Il s'agit principalement d'une tâche académique, car je suis presque sûr que ce modèle a été créé par un programme de test de disque, mais j'aimerais quand même le rétroconcevoir.

Je sais déjà que le motif est aligné, avec une périodicité de 256 caractères.

Je peux imaginer deux façons de visualiser ces informations: soit un plan 16x16 vu dans le temps (3 dimensions), où la couleur de chaque pixel est le code ASCII du personnage, soit une ligne de 256 pixels pour chaque période (2 dimensions).

Ceci est un instantané du motif (vous pouvez en voir plusieurs), vu à travers xxd(32x16):

Modèle à analyser

Quoi qu'il en soit, j'essaie de trouver un moyen de visualiser ces informations. Ce n'est probablement pas difficile pour quiconque dans l'analyse du signal, mais je n'arrive pas à trouver un moyen d'utiliser un logiciel open source.

Je voudrais éviter Matlab ou Mathematica et je préférerais une réponse en R, puisque je l'ai apprise récemment, mais néanmoins, n'importe quelle langue est la bienvenue.


Mise à jour, 2014-07-25: étant donné la réponse d'Emre ci-dessous, voici à quoi ressemble le modèle, étant donné les 30 premiers Mo du modèle, alignés à 512 au lieu de 256 (cet alignement semble meilleur):

Motif graphique

Toute autre idée est la bienvenue!

Valmiky Arquissandas
la source
Un exemple / extrait des données (peut-être seulement quelques Mo) pourrait être intéressant.
Marco13
Si vous êtes intéressé par la nature périodique des données, jeter un œil à la DFT des données pourrait être révélateur.
mrmcgreg
@mrmcgreg: Je vais devoir réapprendre comment fonctionne la DFT. J'aurais dû faire plus attention aux cours de signaux et de systèmes :)
Valmiky Arquissandas

Réponses:

5

J'utiliserais une analyse visuelle. Comme vous savez qu'il y a une répétition tous les 256 octets, créez une image de 256 pixels de largeur par autant de profondeur et encodez les données en utilisant la luminosité. En (i) python, cela ressemblerait à ceci:

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

Voici à quoi ressemble un PDF:

Un fichier PDF visualisé

Un modèle périodique de 256 octets se serait manifesté sous forme de lignes verticales. À l'exception de l'en-tête et de la queue, il semble assez bruyant.

Emre
la source
Cela ressemble assez à ce que je recherche. J'étudie pour les finales maintenant et je ne peux pas prendre le temps d'y penser à nouveau, mais dès que je le pourrai je vous le ferai savoir. "Un modèle périodique de 256 octets se serait manifesté sous forme de lignes verticales." - exactement ce à quoi je pensais. Je peux également montrer une image où j'ai mis tous les 256 octets sur la même ligne, et c'est déjà évident dans le texte. Je suis assez curieux de savoir ce qui en sortira :)
Valmiky Arquissandas
Je n'arrive pas à exécuter cela sur Debian Linux. J'ai installé les packages python-scitoolset ipython. Le message d'erreur est ValueError: invalid literal for int() with base 10: '#'. Je vais voir si je peux le faire fonctionner de toute façon ...
Valmiky Arquissandas
Je réussissais (en exécutant le code directement à l' intérieur ipython, et en changeant map(int, line)de map(ord, line)et mis à jour la question avec la nouvelle image.
Valmiky Arquissandas
Cela m'a pris un an, mais j'ai décidé d'accepter cette réponse. Je ne sais toujours pas ce qu'est ce flux binaire, mais je ne le saurai probablement pas. Il a cependant un joli motif!
Valmiky Arquissandas
1

Je ne sais presque rien sur l' analyse du signal, mais la visualisation 2 dimensions pourrait être facilement fait en utilisant R. En particulier , vous aurez besoin reshape2et ggplot2paquets. En supposant que vos données sont larges (par exemple, la taille [n X 256]), vous devez d'abord les transformer en format long en utilisant la melt()fonction du reshape2package. Utilisez ensuite la geom_tilegéométrie de ggplot2. Voici une belle recette avec de l' essence .

sobach
la source
2
C'est plus de 4 Go de données. Je devrais le tracer en lisant dans stdin ou quelque chose de similaire. C'est une mauvaise idée de tout charger en RAM. Je vais jeter un œil à ce que vous avez dit dans quelques jours - et, espérons-le, à toute autre idée qui pourrait surgir - et je vous ferai savoir comment cela s'est passé, merci!
Valmiky Arquissandas
Ne le chargez pas et ne le traitez pas comme une trame de données, ce n'est pas une trame de données, c'est un flux d'octets.
Spacedman
1

Je regarderais le rasterpaquet pour cela, qui peut lire des données binaires brutes et le présenter comme des grilles NxM. Il peut même extraire des sous-ensembles de grandes grilles binaires sans avoir à lire l'intégralité du fichier (l'objet raster R lui-même n'est qu'un proxy des données, pas les données elles-mêmes).

Spacedman
la source