IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

FFT d'un fichier .txt


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2017
    Messages : 11
    Par défaut FFT d'un fichier .txt
    Bonjour à tous !

    Je suis actuellement en pleine découverte du langage PHP et j'effectue un stage de deuxième année d'IUT Mesures Physiques au cours du quel je dois instrumenter une ruche d'abeilles (Le lien ci-contre renvoie vers le site web de présentation du projet) istruche.com !

    Je dois faire l'acquisition des données d'un accéléromètre, les traiter puis les afficher sur le site. Et c'est actuellement à la deuxième étape que je bloque !

    Venons-en au vif du sujet : je dois effectuer une FFT (Fast Fourier Transform) des données que j'ai enregistré. J'enregistre ces données sur une carte SD au format ".txt" tq les valeurs se suivent sur une seule colonne.

    J'ai donc une ligne de calcul à faire mais je n'y arrive pas. Etant novice je ne connais pas encore bien toute la syntaxe et le langage.
    J'ai commencé par créer un formulaire sur lequel on indique les différents paramètres à prendre en compte et sur lequel on sélectionne le fichier ".txt"
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    <form method="post" action="outils/FFT.php" enctype="multipart/form-data">
        <p>
            <label for="dureeMesure">Temps de la mesure</label>
            <input type="number" name="dureeMesure" id="dureeMesure" maxlength="9" required/>
     
            <label for="nbrMesures">Nombre d'échantillons</label>
            <input type="number" name="nbrMesures" id="nbrMesures" maxlength="9" required/>
     
            <label for="fmin">Fréquence min</label>
            <input type="number" name="fmin" id="fmin" maxlength="9" required/>
     
            <label for="fmax">Fréquence max</label>
            <input type="number" name="fmax" id="fmiax" maxlength="9" required/>
     
            <input type="file" name="file" required/>
     
            <input type="submit" value="Envoyer"/>
        </p>
    </form>

    Ce formulaire renvoie à la page "FFT.php"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    <?php
    move_uploaded_file($_FILES['ACCEL.TXT']['ACCEL.TXT'], 'uploads/'.basename($_FILES['ACCEL.TXT']['ACCEL.TXT']));
    $fichierTemporel = fopen('uploads\accel.txt', 'r');
    $fichierSpectral = fopen('downloads\spectre.txt', 'a+');
     
    $dureeMesure = $_POST['dureeMesure'];
     
    $nbrMesures = $_POST['nbrMesures'];
     
    $dt = $dureeMesure / $nbrMesures;                   // Duree de l'intervalle entre deux mesures
     
    $fmin = $_POST['fmin'];
    $fmax = $_POST['fmax'];
     
    for ($f=$fmin; $f<$fmax; $f++){                      // Boucle en fonction du choix d'échantillons
     
        $val = fgets($fichierTemporel);                         // Prend la valeur
     
        for($ti=$dt;$ti<$dureeMesure;$ti=$ti+$dt){      // Tant qu'une valeur existe, fait un calcul
            $sum=($val*exp(sqrt(-1)*(-2)*M_PI*$f*$ti));
            $somme=$sum+$somme;
        }
        $somme=$somme/$f;
        fputs($fichierSpectral, $somme);
        $somme=0;    
    }
     
    fclose($fichierTemporel);
    fclose($fichierSpectral);
     
    echo 'Finito';
    ?>
    Lorsque j'essaye le programme je tombe sur les messages d'erreurs suivants :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Notice: Undefined index: ACCEL.TXT in C:\wamp64\www\istruche\outils\FFT.php on line 2
     
    Notice: Undefined index: ACCEL.TXT in C:\wamp64\www\istruche\outils\FFT.php on line 2
     
    Notice: A non well formed numeric value encountered in C:\wamp64\www\istruche\outils\FFT.php on line 20
     
    Notice: Undefined variable: somme in C:\wamp64\www\istruche\outils\FFT.php on line 21
     
    Notice: A non well formed numeric value encountered in C:\wamp64\www\istruche\outils\FFT.php on line 20
    Cela vient-il de la formule mathématique?

    Je suis complètement perdu et hors de mes compétences. J'ai essayé de rechercher la sources de mes erreurs par moi-même mais je suis dans l'urgence!

    Merci beaucoup pour vos réponses!

    Cordialement,

    Hazbury

  2. #2
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    Il y a php au programme d'un Dut de Mesures Physiques maintenant ?

    Sinon c'est un peu gonflé de te faire faire cela lors d'un stage, car l'initiation à php pourrait prendre une bonne partie de ton temps disponible. Enfin bon le code de récupération du fichier de ton formulaire n'est pas bon.

    Regardes plutôt ce lien :
    formulaire :
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    <form enctype="multipart/form-data" action="_URL_" method="post">
      <!-- Le nom de l'élément input détermine le nom dans le tableau $_FILES -->
      Envoyez ce fichier : <input name="userfile" type="file" />
      <input type="submit" value="Envoyer le fichier" />
    </form>

    récupération php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php
    // construction de l'adresse de destination
    $uploaddir = '/var/www/uploads/';
    $uploadfile = $uploaddir . basename($_FILES['userfile']['name']); // destination du fichier
     
    echo '<pre>';
    if (move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
        echo "Le fichier est valide, et a été téléchargé
               avec succès. Voici plus d'informations :\n";
    } else {
        echo "Attaque potentielle par téléchargement de fichiers.
              Voici plus d'informations :\n";
    }
     
    echo 'Voici quelques informations de débogage :';
    print_r($_FILES);
     
    echo '</pre>';
     
    ?>
    Donc pour résumé si tu mets <input type="file" name="file" required/> dans ton formulaire, tu pourras récupérer $_FILES['file']['name'] et $_FILES['file']['tmp_name'].

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2017
    Messages : 11
    Par défaut
    Non en effet le PHP n'est pas au programme de Mesures Physiques ! (un peu de C en première année uniquement)
    Personnellement je suis content de faire un peu de programmation ça me permet de m'y initier et ça me plaît !

    J'ai résolu le problème de l'envoie/réception du fichier (merci beaucoup !). Cependant le programme me retourne encore deux erreurs :

    -Notice: A non well formed numeric value encountered in C:\wamp64\www\istruche\fonctionFFT.php on line 29

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sum=($val*exp(sqrt(-1)*(-2)*M_PI*$f*$ti));
    J'ai essayé plusieurs combinaisons mais je ne vois pas l'erreur, je pense avoir bien utilisé les opérateurs mathématique pourtant

    -Notice: Undefined variable: somme in C:\wamp64\www\istruche\fonctionFFT.php on line 30

    Je n'ai pas déclaré cette variable au préalable, est-ce la cause de l'erreur? Ou ne peut-on pas faire d'opération dans le genre? J'ai également pensé que l'erreur était retournée à cause de l'erreur juste au-dessus?

  4. #4
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sum=($val*exp(sqrt(-1)*(-2)*M_PI*$f*$ti));
    Dans un premier temps copies cette formule dans une page distincte et tente de la faire fonctionner en attribuant des valeurs à tes variables.

    Ensuite si ça ne fonctionne pas dans ton contexte c'est que les variables ne sont pas reçues ou peut-être pas dans le bon format. Utilises var_dump($variable) pour vérifier tes variables. A savoir que les valeurs reçues d'un formulaire sont toujours du texte et c'est peut-être cela qui pose problème. Tu peux utiliser des fonctions comme floatval(), intval() pour formater tes variables.


    Au passage, à réception d'un formulaire on vérifie les variables reçues et on leur attribue des valeurs par défaut, c'est plus sécure. On utilise souvent l'opérateur ternaire, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $variable = isset($_POST['variable']) && is_numeric($_POST['variable']) ?  : floatval($_POST['variable']) : 0;
    Ici j'ai vérifié avec "isset" l'existence de la variable et si elle est au format numérique. Si oui je la convertie en nombre à virgule flottante, et sinon j'attribue la valeur 0.


    Et tu ne peux pas utiliser une valeur qui n'est pas définie.

    Si tu veux incrémenter une variable tu peux faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $somme = 0;
    //...
    $somme += $sum; // à supposé que $sum soit définie

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2017
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2017
    Messages : 11
    Par défaut
    Merci beaucoup ! En effet les variables étaient au format "string". Je les ai donc convertis au format voulu à l'aide de floatval() ou intval().

    Je n'ai pas réussi à utiliser la fonction isset() tel que tu l'as exposé, j'ai donc utilisé une condition if pour la vérification :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if (isset($_POST['fmax']) && is_numeric($_POST['fmax'])){
         $fmax=intval($_POST['fmax']);
    }
    else{echo 'ERROR';}
    /!\ Il me reste néanmoins un problème majeur ... les nombres complexes ! Je ne trouve aucune documentation quand à l'utilisation de nombres complexes en PHP (je dois utiliser un nombre 'j' tel que 'j²' = '-1'). /!\

    Et un autre problème moins grave : je n'arrive pas à faire écrire ligne par ligne dans le fichier, j'ai essayé d'utiliser le "\n" pour le retour à la ligne mais ça ne fonctionne pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fputs($fichierSpectral, $result."\n");
    Je mettrai mon script complet ici une fois que j'aurai fini le programme !

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 420
    Par défaut
    Citation Envoyé par Hazbury Voir le message
    ]
    /!\ Il me reste néanmoins un problème majeur ... les nombres complexes ! Je ne trouve aucune documentation quand à l'utilisation de nombres complexes en PHP (je dois utiliser un nombre 'j' tel que 'j²' = '-1'). /!\
    Je n'ai jamais eu à le faire... ouvres un autre sujet avec un titre décrivant plus précisément ce problème, d'autres te répondront sans doute.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. FFT d'un fichier txt de données
    Par sofzigui dans le forum Scilab
    Réponses: 4
    Dernier message: 21/05/2012, 14h47
  2. [SQLServer]Script import fichier .txt
    Par Jenbi dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/08/2006, 16h49
  3. ouverture de fichier txt
    Par juguul dans le forum MFC
    Réponses: 11
    Dernier message: 18/12/2003, 09h44
  4. [langage] prob lecture fichier .txt
    Par martijan dans le forum Langage
    Réponses: 3
    Dernier message: 16/07/2003, 11h08
  5. communication fichier binaire fichier txt
    Par micdie dans le forum C
    Réponses: 3
    Dernier message: 05/12/2002, 00h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo