Partage
  • Partager sur Facebook
  • Partager sur Twitter

exploitation fichier wave

    22 mai 2019 à 20:14:58

    bonjour;

    en effet j'ai un projet pour l'analyse de la qualité de l'énergie électrique, je souhaite analyser la tension et le courant d'un circuit magnétique à l'aide de la carte son.

    donc l'étape où je suis bloqué c'est que j'ai fait un fichier wave sous audacity, j'ai crée un programme pour récupérer les signaux(gauche et droite : gauche pour courant et droite pour tension dans la partie data qui est écrit en little Endian) mais j'y arrive pas , j'arrive pas à detecter l'erreur   je vous fait un screen de mon code svp et merci beaucoup .

    #include <stdio.h>

    #include <stdlib.h>

    #include <unistd.h>

    #include <string.h>

    #include <math.h>

    /*#include "kiss_fft.h"*/

    #define FIXED_POINT 1024

    #include <errno.h>

    /*  Ci-dessus, ce sont des directives de préprocesseur.Ces lignes permettent d'ajouter des fichiers au projet,

    fichiers que l'on appelle bibliothèques.Grâce à ces bibliothèques, on disposera de fonctions toutes prêtes pour afficher

    par exemple un message à l'écran*/


            /*........................définition de la structure du fichier wave..........................*/

    struct wavfile  /* on définit une structure qui comporte nos variable de notre fichier wav à l'aide de la fonction struct  qui disponible dansla bibliothéque du systéme d'exploitation,ce type s'appelle le prototypage*/

    {

        char        id[4];/* on crée un tableu qui contient les lettre RIFF comme c'est défini dans le format wave */

        int         totallength; /* il contient la taille totale du fichier 8 octetcs*/

        char        wavefmt[8]; /*un tableau de 8 cases contigues pour le wavefmt   */

        int         format; /* il contient 16 bits pour le format PCM*/

        short       pcm;/* cela signifie un entier court ((2 octects) qui contient contient une plage de valeurs allant de -32 768 à 32 767 pour la format PCM */

        short       channels;/* ceci contient le nombre de channel un octects par channels, 2 channels*/

        int         frequency;/*la fréquence d'échatillonage qui est de ......Hz*/

        int         bytes_per_second;/*le nombre d'octects par seconde pour l'échatillonage */

        short       bytes_by_capture;/* Nombre d'octets à lire par échantillon*/

        short       bits_per_sample; /* le nombre d'octect par échantillon*/

        char        data[4];/* il va contenir le data,il comporte 4 octets donc 4 cases contigus :) */

        int         bytes_in_data;/* le nombre d'octet dans la partie data, il va contenir les valeurs des échantillons en little Endian (lecture de gauche à droite) "LL,RR,LL,RR...."*/

    };




        int sommeTableau(float tableau[], float tailleTableau);

        int main(int argc, char *argv[])      /* fonction obligatoire pour démarrer le système(compilation)*/



          /*.................selection du fichier audio et définition des variables...................*/


    {


             int nbech=0;/* nombre d'échantillon extrait dans un fichier wave */

             int i=0,  taille=0,  n=0,fr=0;/* ..initialisation des variables ..*/

             FILE *wav;/*FILE est une structure définit dans stdio.h, il contient des données qui permettent à la communication avec notre fichier wave, on manipule FILE via un pointeur (wav) */

             float value=0;/* intialisation  la variable  value qui contiendera les nombres flottantes*/

             char fichieraudio[100]="/home/linuxmoha/Bureau/tableau/hem.wav";/* chaine de caractére ....*/

             char fichierdat[100];/* on l'aura besion dans le remplissage du tableau juste pour la cgaîne des caractères*/

             printf ("nom du fichier : %s   \n", fichieraudio);/* affichage le nom du fichier à traiter :) */


          /*--------------fin de selection du fichier audio et définition des variables---------------------*/




          /*...........................ouverture du fichier wav..........................................*/



            wav = fopen(fichieraudio,"rb"); /* ouverture du fichier wave,fopen nous envoie un pointeur sur le fichier dont on va ouvrir le fichier à lire en binaire et le rb siginifie le mode de lecture en binaire,car le mode binaire permet de stocker des informations octet par octet*/


            struct wavfile header; /* création de l'entête du wave */



            if ( wav == NULL )/* on fait cette condition pour voir si le programme a réussi l'ouvrir , */

                  {

                    printf("\n   impossible d'ouvrir le fichier demandé, vérification du nom \n");

                    printf("   attention à l'extention   .wav  :) \n");

                    exit(1);

                   }

          /*-------------------------------fin d'ouverture du fichier wave----------------------------*/




          /*.....................lecture dans l'entête du fichier.....................................*/

           /*on initialise l'en-tête pour le fichier wave, ainsi la véification si le fichier posséde une entête compatible afin qu'il ne beugue pas*/


             fread(&header,sizeof(header),1,wav);/*fread permet de lire un certain nombre d'octets,L'ensemble des octets lu

             seront stockés dans le fichier wave ,il faut donc être certain que les DATAs  est bien de taille suffisante,

              Pour spécifier le nombre d'octets à lire, il faut jouer sur deux paramètres : le nombre de bloc d'octets à

             lire ainsi que la taille de chacun des blocs,La taille totale du wave à allouer sera donc le produit de ces

              deux tailles précédentes.  */

                   {


             if (    header.id[0] != 'R'|| header.id[1] != 'I'|| header.id[2] != 'F'|| header.id[3] != 'F' )

                      {

                        printf("\n  erreur le fichier n'est pas un format wave valide\n");

                         exit(1);

                       }

             if (header.channels!=2)/* si mono on tape 1 si stéréo on tape 2 , on peu tutiliser audacity pour avoir des fichiers mono*/

                     {

                      printf("\n  erreur : le fichier n'est pas stéréo \n");/**/

                      exit(1);

                     }


              taille = (header.format);/* taille de fichier */

              printf("le format du fichier est de taille %d bits\n",taille);/* affichage taille de fichier*/

              printf("le nombre d'octects à lire par échantillon est  %d   \n",header.bytes_by_capture);/* affichage du nombre d'octets à lire par échantillon*/

              printf("le nombre d'octetcs dans la partie data est  %d      \n",header.bytes_in_data);/* affichahe le nombre d'octet dans la partie data*/

              fr=(header.frequency); /* calcul de la fréquence d'échantillonnage */

              printf("la fréquence déchantillonage est  %d Hz\n",fr);

             /*---------------------------------fin de lecture dans l'entête du fichier------------------------*/


             /*.....................détermination la taille du tableau.........................................*/


              nbech=(header.bytes_in_data/header.bytes_by_capture); /* calcul du nombre d'échantillonnage de notre signal, on voit

              combien on a dans la partie data et on dévise sur le nombre d'octets à lire par échantillon  */

              printf("le nombre d'echantillons vaut    %d   \n",nbech);


             /*----------------------fin de détermination de la taille du tableau-----------------------------*/


                   }


            /*.......................creation des tableaux dynamiques........................................*/


            float *data = NULL; /* on fait un tableau pour l'onde tomporelle car ce sont des nombre flottants,

            avec NULL si le tableau existe on va louer une place dans la mémoire pour la suite du traitement pour exploiter

            les resultats */

            data =(float*) malloc((nbech)*sizeof(float));/* malloc ou calloc va louer un place correspond à la taille des tableau

            pour les nombre flottants,on demande au système d'exploitation la permission d'utiliser de la mémoire*/

            if (data == NULL) /* on mets cette condition dans le cas si l'allocation a échouée.*/

                     {

                        exit(0); /* si l'allocation  a échoué, on arrête immédiatement le programme*/

                     }


            /*----------------------fin de création des tableaux dynamiques----------------------------------*/




            /*.......................initialisation des tableaux dynamiques...................................*/


              for(i=0; i<nbech; i++)

                {

                   data[i]=0;

                   //printf(" intialisé à %lf  ! \n", *data);/*ça n'a pas d'inérêt seulement pour voir si les valeurs sont initialisés dans le tableau*/

                }/* on peut faire data[i] ou *data ...*/


            /*----------------------fin d'initialisation des tableaux dynamiques-------------------------------*/



            /*...........................remplissage du tableau avec les échantillons.........................*/


            //int a = 32767;/* on mets a=32767 pour déviser les valeurs du data*/


            i=0;

            //short value = 0;

            //FILE *dat=fopen(fichierdat,"w");/* seulement pour écrire dans le fichier, mais pas lire son contenu,si le fichier n'existe pas, il sera créé.*/


             while( fread(&value,(header.bits_per_sample)/8,1,wav))


                    {

                        data[i]= value;/*on va lire les échantillons et enregistrer leurs valeurs dans les tableaux*/

                        i++;

                    }


                       printf("\n le nombre d'échantillons lus : %d  !\n",i);

                       printf(" le nombre de valeurs sauvegardées %d ! \n",i);

        /*--------------------------fin de remplissage du tableau avec les echantillons-----------------------*/




        /*.................................récupération des deux signaux( gauche et droite)...................*/


    /* void afficherTableau(char **grille, int Nbech);*/



          /*{


            float data_val_tension=0;

            float data_val_courant=1;


                  for (data_val_tension=0; data_val_tension<1 ; data_val_tension+2)

                           {

                               for (data_val_courant=1; data_val_courant<1 ; data_val_courant+2)

                                   {

                                     printf(" la valeur du signal droite est %lf \n ",data_val_tension);

                                   }

                                printf(" la valeur du signal gauche est %lf    \n",data_val_courant);

                           }

          }*/


          /*--------------------fin  de récupération des deux signaux-----------------------------------*/





          /*.................... calcul de la puissance instantannée....................................*/


              /*float puissance_Instant = 0;

              puissance_Instant = data_val_tension*data_val_courant;


                  for (puissance_Instant = 0;puissance_Instant < nbech ;puissance_Instant++)

                            {


                              printf("  la puissance instantannée  est %lf \n", puissance_Instant);


                            }*/

           /* ----------------------fin de calcul de la puissance instantannée------------------------*/




           /*...............................calcul de la puissance total...............................*/



             /*float puissance_total=0;

                  int temps = 0;

                  int temps[44100] =data[i];


                   sommeTableau(temps[],44100);

                               {

                                    printf("  %lf", puissance_total);

                               }


                 int sommeTableau(float tableau[], float tailleTableau)


                float puissance_total=0;

                int k=0;

                     for (k=0; k<tailleTableau; k++)

                                 {

                                       puissance_total=tableau[k]+puissance_total;

                                       printf("la puissance total du fichier est %f \n",puissance_total)

                                  }*/



                /*------------------fin de calcul de la puissance total-----------------------------*/


       /*....... calcul fft...................*/    




          int N = nbech;

          int nfft = N;

          int is_inverse_fft = 0;

      //  float tabint[] = {0,0.707,1,0.707,0,-0.707,-1,-0.707,0,0.707,1,0.707,0,-0.707,-1,-0.707,0,0.707,1,0.707,0,-0.707,-1,-0.707,0,0.707,1,0.707,0,-0.707,-1,-0.707};

             kiss_fft_cpx cx_in[nfft], cx_out[nfft];

             kiss_fft_cfg cfg = kiss_fft_alloc( nfft ,is_inverse_fft ,NULL, NULL );


            for ( i = 0; i < N; i++)

            {

                cx_in[i].r = data[i]/x;

                cx_in[i].i = 0;

            }

                  for (int i = N; i <nfft; i++)

                  {

                  cx_in[i].r = 0;

                  cx_in[i].i = 0;

                  }

                 kiss_fft( cfg , cx_in , cx_out );


                       printf("x\t\tinR:\t\tinI\t\tReal:\t\tImaginary:\n");

                 //  for (i = 0; i < 65; i++) {

                //    printf("%d\t%f\t%f\t%f\t%f\n",i,cx_in[i].r,cx_in[i].i,cx_out[i].r, cx_out[i].i);



        float a=0,v=0;

        for (i=0; i<nfft; i++)

        {

            a=v+a;

            v=sqrt(((cx_out[i].r)*(cx_out[i].r)) + ((cx_out[i].i)*(cx_out[i].i)));

        }

        float fr=0;

        for (i=0;i<nbech/2;i++)

        {

        if (abs(cx_out[i].i)>=fr)

            fr=i;

        }

        printf("fr=%f\n",fr);

        printf("A= %f\n",a);

    */

    /*--------------fin calcul fft---------------*/



    /*..............................liberation de la memoire................................*/

    // on doit libérer la mémoire pour d'autres utilisations


             {

                  //free(cfg);


                  free(data);


                  data = NULL;


                 free(wav);

             }


    /*---------------------fin de liberation de la memoire-----------------------------------*/


    return 0 ;


    }

    -
    Edité par MohaChéBouamama 23 mai 2019 à 21:25:53

    • Partager sur Facebook
    • Partager sur Twitter
      22 mai 2019 à 22:44:05

      Bonsoir.

      Commences par placer le code dans la balise correspondante (</>)

      Sinon, tu sembles t'être trompé de forum, ce n'est pas du code PHP que tu nous montre.

      • Partager sur Facebook
      • Partager sur Twitter

      Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

        23 mai 2019 à 21:27:43

        bonsoir;

        oui je me suis trompé de forum ,

        je vous remercie pour la réponse

        • Partager sur Facebook
        • Partager sur Twitter
          23 mai 2019 à 21:42:02

          Commences donc par corriger le format du contenu de ton sujet.

          Ensuite signales ton sujet en indiquant que tu t'es trompé de forum et en indiquant dans lequel il devrait être pour qu'un membre du staff te le déplace.

          • Partager sur Facebook
          • Partager sur Twitter

          Face a quelqu'un pour qui l'on n'éprouve que de l'aversion et du mépris, les yeux d'un homme deviennent extrêmement froids et cruels.

            24 mai 2019 à 11:37:08

            Bonjour,

            Mauvais forum

            Le sujet est déplacé de la section PHP vers la section Langage C++

            Merci d'utiliser la balise code Image

            Les forums d'Openclassrooms disposent d'une fonctionnalité permettant de colorer et mettre en forme les codes source afin de les rendre plus lisibles et faciles à manipuler par les intervenants. Pour cela, il faut utiliser le bouton Image de l'éditeur, choisir un des langages proposés et coller votre code dans la zone prévue. Si vous utilisez l'éditeur de messages en mode Markdown, il faut utiliser les balises <pre class="brush: php;">Votre code ici</pre>.

            • Partager sur Facebook
            • Partager sur Twitter
            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

            exploitation fichier wave

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown