TDFA qui es tu?

Rédigé par BeHuman Aucun commentaire
Classé dans : Python Mots clés : audio, wav, onde, transfert, python

Salut à tous,

Pour commencer, je tiens tout d'abord à vous souhaiter une bonne année 2014....youpie !!!
 
Maintenant que les politesses sont faite, je vais vous parler d'une idée assez rigolote qu'un pote a eu pour transférer des données numérique à distance sans pouvoir utiliser internet. Dans un premier temps nous avons parlé du transfert par ondeS courtes, cependant cette méthode peut nécessiter certaines autorisation des autorités. Malgré cette contrainte l'idée semble bonne et réalisable, facilement à mettre en oeuvre à petite échelle.
 
 
 
 
 
 

Mon 1er problème

Ok, l'idée est sur le papier, maintenant il manque quoi?...le matos bien entendu.

Une 1ère solution

N'ayant pas le matos directement à disposition et n'ayant aucune autorisation, je décide de commencer à réfléchir à une autre alternative, liée à la première. Si travailler sur des ondes directement peu nécessiter certaines autorisations, on peut toujours se rediriger vers des solution plus simples est moins contraignantes... Et donc je pars du principe qu'avec une simple paire de Tasko avec entré/sortie audio cela ne nécessitera aucune autorisation car avec, je ne vais pas traficoter les ondes, mais simplement diffuser un SON avec l'un, et recevoir ce SON avec l'autre.

Un principe vraiment simple à première vu

Le but serait de pouvoir enregistrer des données numérique dans une fichier audio, ensuite on diffuse le fichier audio via un des Tasko puis, via le second Tasko, on récupére et enregistre le SON afin de transcoder les fréquences audio en valeurs binaires.
 

Encore plus simple

fichier texte = chaine de caractères  -> chaine de caractères = valeur numérique  -> valeur umérique = fréquence audio

fréquence audio = valeur umérique -> valeur numérique = chaine de caractères  -> chaine de caractères = fichier texte

Un nom qui claque pas deux fesses

TDFA pour Transfert de Donnée par Fréquence Audible 

oui, je ne me suis pas foulé, mais le principal etait de savoir qui se cachait derrière TDFA, non? 

Pour finir le commencement

voilà donc un petit script python permettant de créer un fichier audio via un fichier binaire (*.txt, .tar.bz2, png...etc), il permet aussi de faire l'opération inverse

un simple "tdfa.py -h" dans le terminal, vous permettra de comprendre la commande.

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import wave, struct, math, optparse, zlib, base64
def set_wav(infname, fname, data_size):
    fichier = open(infname, "rb")
    string=""
    print "Récupération des données en cours..."
    while 1:
        byte = fichier.read(1)
        if byte:
            if byte.encode('hex')=="00":string+='[x00]'
            elif byte.encode('hex')=="20":string+='[x20]'
            elif byte.encode('hex')=="30":string+='[x30]'
            else:string+=byte
        else:
            break
    fichier.close()
    
    print "Transcodage des données en cours..."
    string='[TDFA]'+string
    freq = 440.0
    fech = 44100
    frate = 11025.0  # framerate as a float
    amp = 127.5    # multiplier for amplitude
    sine_list_x = []
    for s in string:
        for x in range(data_size):
            if int('0x'+s.encode('hex'),0)>0:
                sine_list_x.append(int('0x'+s.encode('hex'),0))

    w = wave.open(fname, "wb")

    nchannels = 1
    sampwidth = 1
    framerate = int(frate)
    nframes = data_size
    comptype = "NONE"
    compname = "not compressed"

    w.setparams((nchannels, sampwidth, framerate, nframes, comptype, compname))
    for s in sine_list_x:
        # write the audio frames to file
        w.writeframes(struct.pack('<h', int(s)))
    w.close()
    print fname+" créé avec succès"
    
def get_wav(fname, outfname, data_size):
    w = wave.open(fname, "rb")
    binary_data = w.readframes(w.getnframes())
    w.close()
    number_pass=0
    oldByte=-1
    newFileBytes = []
    binary_data2=""
    fichier = open(outfname, "wb")
    print "Récupération des données en cours..."
    binary_data=binary_data.replace('\x00','')
    for s in binary_data:
            if (int('0x'+s.encode('hex'),0)<>oldByte) or (int('0x'+s.encode('hex'),0)==oldByte and number_pass==0):
                binary_data2+=s
                oldByte=int('0x'+s.encode('hex'),0)
                number_pass=1
            elif number_pass >= data_size:
                number_pass=0
            else: number_pass+=1
    print "Décodage des données en cours..."
    binary_data=binary_data2.replace('[x00]','\00').replace('[x20]',' ').replace('[x30]','0').replace('[TDFA]','')
    for s in binary_data:
        newFileBytes.append(int('0x'+s.encode('hex'),0))
    
    newFileByteArray = bytearray(newFileBytes)
    
    fichier.write(newFileByteArray)
    fichier.close()
    print outfname+" créé avec succès"


if __name__ == '__main__':
    #Options
    usage = "%prog [options] arg\n\nTDFA (Transfert de Donnee par Frequence Audible) by David Lhoumaud\nGNU/GPL for g00d fun ;-)"
    parser = optparse.OptionParser(usage)
    parser.add_option("-a", "--action",
                  default="set", dest="action", metavar="ACT",
                  help="action: set, get [default: %default] "
                        "Examples:           tdfa.py -a set -i file.tar.bz2 -o out.wav"
                        "                    OR                                  "
                        "                    tdfa.py -a get -i out.wav -o file.tar.bz2")
    parser.add_option("-i", "--in", dest="inf",
                  metavar="FILE", help="input file")
    parser.add_option("-o", "--out", dest="out",
                  metavar="FILE", help="output file")
    parser.add_option("-p", "--pass", dest="passs", metavar="NUM",
                  default="1", help="pass by byte [default: %default]")
    (options, args) = parser.parse_args()
    
    if options.action:
        if options.action=="set":
            set_wav(options.inf,options.out,int(options.passs))
        elif  options.action=="get":
            get_wav(options.inf,options.out, int(options.passs))
 ouais, ce script est encore tout frais, il ne prend pas encore en compte le nettoyage et le retranscodage des interférences liées à la qualité de l'onde receptionnée mais aussi de votre carte son. Même si celles de la carte son seront facile à calibrer car proportionnelles, celles provenant de l'onde en elle même s'annonce plus ardue à gérer 
 
voilà donc pour mon premier article et premier script de l'année 2014
++

Écrire un commentaire

Quelle est la dernière lettre du mot i6up3 ?

Fil RSS des commentaires de cet article