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

C++ Discussion :

Traitement de fichier audio .wav


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 51
    Points : 29
    Points
    29
    Par défaut Traitement de fichier audio .wav
    Salut à tous.

    Je dois réaliser un programme en C++ qui devra effectuer un traitement sur les FFT de signaux audio au format .wav

    J'ai trouvé une classe sur le net.

    Mon problème c'est que j'ai du mal à l'utiliser.
    Mon objectif premier serait d'arriver à charger un fichier .wav et de le lire pour déja arriver à faire marcher la classe dans son utilisation la plus basique.

    Je charge les fichiers d'entêtes ainsi que les fichiers .cpp correspondants.

    Pour faire simple j'ai tenté d'implémenter ma classe de la façon suivante dans mon fichier main.cpp :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "Sound.h"
    #include <iostream>
    using namespace std;
     
    int main(){
        Csound monson1;
        monson1.PlayFile(musique1.wav);
    return 0;}
    Le rapport de plantage me donne :

    Compilation en cours...
    Main2.cpp
    main2.cpp(8) : error C2065: 'Csound' : identificateur non déclaré
    main2.cpp(8) : error C2146: erreur de syntaxe : absence de ';' avant l'identificateur 'monson1'
    main2.cpp(8) : error C2065: 'monson1' : identificateur non déclaré
    main2.cpp(9) : error C2065: 'monson1' : identificateur non déclaré
    main2.cpp(9) : error C2228: la partie gauche de '.PlayFile' doit avoir un class/struct/union
    le type est ''unknown-type''
    main2.cpp(9) : error C2065: 'musique1' : identificateur non déclaré
    main2.cpp(9) : error C2228: la partie gauche de '.wav' doit avoir un class/struct/union
    le type est ''unknown-type''
    Sound.cpp
    sound.cpp(513) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    c:\program files\microsoft visual studio 9.0\vc\include\string.h(74) : voir la déclaration de 'strcpy'
    sound.cpp(515) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    c:\program files\microsoft visual studio 9.0\vc\include\string.h(74) : voir la déclaration de 'strcpy'
    sound.cpp(516) : warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    c:\program files\microsoft visual studio 9.0\vc\include\string.h(74) : voir la déclaration de 'strcpy'
    sound.cpp(526) : error C2664: 'CreateFileW' : impossible de convertir le paramètre 1 de 'const CStr' en 'LPCWSTR'
    Aucun opérateur de conversion définie par l'utilisateur disponible qui puisse effectuer cette conversion, ou l'opérateur ne peut pas être appelé
    sound.cpp(574) : error C2664: 'CreateFileW' : impossible de convertir le paramètre 1 de 'const CStr' en 'LPCWSTR'
    Aucun opérateur de conversion définie par l'utilisateur disponible qui puisse effectuer cette conversion, ou l'opérateur ne peut pas être appelé
    sound.cpp(686) : error C2664: 'sndPlaySoundW' : impossible de convertir le paramètre 1 de 'const CStr' en 'LPCWSTR'
    Aucun opérateur de conversion définie par l'utilisateur disponible qui puisse effectuer cette conversion, ou l'opérateur ne peut pas être appelé
    Génération de code en cours...
    Voila

    Est-ce que quelqu'un peut m'aider ?

    Merci

    Florian

  2. #2
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Salut,
    première chose, pour la lisibilité, pense à utiliser les balises code pour le code et citation pour les rapports d'erreur.

    Ensuite la classe que tu tentes d'utiliser se nomme CSound avec un grand S et non pas Csound. Le C++ est sensible à la casse !

    Enfin, dans les propriétés de ton projet, section générale, utilise un "multi-byte" character set et non pas un "Unicode".

    Optionnellement, tu peux définir _CRT_SECURE_NO_WARNINGS (toujours dans les propriétés dans C++/Préprocessor) pour ne plus que Visual t'ennuie avec les warnings de sécurité sur les fonctions de chaines de la lib C.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    Grand merci.

    Pour le nom de la classe je suis un bon boulet.

    Par contre l'histoire de l'unicode j'aurais pu rester bloquer pendant très longtemps ...

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    Merci encore, ça a résolu mon premier problème.
    Ca m'a permis d'avancer un peu.

    Maintenant je veux faire une FFT sur ce son. J'implémente donc comme indiqué dans la page où j'ai téléchargé la classe.
    Et là miracle : ça plante ...

    Je ne comprends pas ce qu'il me dit étant donné que CSoundProcessing est bien une classe


    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
     
    #include "Sound.h"
    #include <iostream>
     
    using namespace std;
     
    int main()
    {
    		//Création du process
    	CSoundProcessing process1;
     
    	// Création de l'objet
    	CSound fichierson1;		
     
    	// Ouverture du fichier
    	fichierson1.OpenFile("musique1.wav");
     
     
    	// Initialisation du process sur fichierson1
    	process1.SetSound(&fichierson1);
     
     
    	//obtenir la FFT du signal
    	/*
    	Note :
    	mono : tabFFT[0] et tabFFT[1] sont identiques
    	stéréo : tabFFT[0] contient le canal gauche et tabFFT[1] le canal droit
    	*/
    CTab<double> tabFFT[2];
    if(process1.GetFFT(tabFFT))
    {
       int indexFreqMax = 0;
       double max = 0.0;
     
       //trouver la fréquence dominante (en amplitude)
       for(int i=0;i<tabFFT[0].Size();i++)
       {
          if(tabFFT[0] > max)
          {
             max = tabFFT[0];
             indexFreqMax = i;
          }
       }
     
     
    return 0;
    }
    Le rapport d'erreurs :
    Main2.cpp
    main2.cpp(9) : error C2079: 'process1' utilise une class de 'CSoundProcessing' non défini
    main2.cpp(19) : error C2228: la partie gauche de '.SetSound' doit avoir un class/struct/union
    le type est 'int'
    main2.cpp(29) : error C2228: la partie gauche de '.GetFFT' doit avoir un class/struct/union
    le type est 'int'
    main2.cpp(37) : error C2679: '>' binaire*: aucun opérateur trouvé qui accepte un opérande de partie droite de type 'double' (ou il n'existe pas de conversion acceptable)
    est peut-être 'built-in C++ operator>(const double *, const double *)'
    lors de la tentative de mise en correspondance de la liste des arguments '(CTab<TYPE>, double)'
    with
    [
    TYPE=double
    ]
    main2.cpp(39) : error C2440: '='*: impossible de convertir de 'CTab<TYPE>' en 'double'
    with
    [
    TYPE=double
    ]
    Aucun opérateur de conversion définie par l'utilisateur disponible qui puisse effectuer cette conversion, ou l'opérateur ne peut pas être appelé
    main2.cpp(48) : fatal error C1075: fin de fichier rencontrée avant que l'élément accolade '{' gauche de 'main2.cpp(7)' soit équilibré

  5. #5
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Il te faut peut-être inclure les fichier d'en-tête (.h) dans lesquels sont définies les classes CSoundProcessing et CTab ?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    Effectivement, concernant la déclaration des fichiers d'entête.
    Par contre j'ai toujours le problème concernant les doubles

  7. #7
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Ce sont ces deux lignes là, j'imagine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(tabFFT[0] > max)
          {
             max = tabFFT[0];
    je ne connais pas CTab mais je pense que tu doives écrire tabFFT[0][i]

    tabFFT semble être un tableau contenant deux autres tableaux (pour le canal gauche et droit je pense) qui contiennent chacun N éléments (sûrement 1024 ou une autre puissance de deux pour faire la FFT.

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    Citation Envoyé par NiamorH Voir le message
    Ce sont ces deux lignes là, j'imagine :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if(tabFFT[0] > max)
          {
             max = tabFFT[0];
    je ne connais pas CTab mais je pense que tu doives écrire tabFFT[0][i]

    tabFFT semble être un tableau contenant deux autres tableaux (pour le canal gauche et droit je pense) qui contiennent chacun N éléments (sûrement 1024 ou une autre puissance de deux pour faire la FFT.
    Encore bravo et merci. Tu m'as encore sauvé la mise

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    J'ai maintenant traité mon signal pour récupérer dans un 3eme tableau, pour chaque fréquence l'mplitude la plus faible du signal.

    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
    CTab<double> tabFFT[3];
    if(process1.GetFFT(tabFFT))
    {
       int indexFreqMax = 0;
       double max = 0.0;
     
       // On traite tout le tableau
       for(int i=0;i<tabFFT[0].Size();i++)
       {
    	   //trouver la fréquence dominante (en amplitude) entre les 2 canaux et la mettre dans le tableau 2
    	   // Si valeur de tableau 0 > valeur de tableau 1, on copie la valeur de tableau 1 dans tableau 2 sinon on fait l'inverse
     
    	   if(tabFFT[0][i] > tabFFT[1][i])
          {
    			tabFFT[2][i] = tabFFT[1][i];
    			indexFreqMax = i;
          }
    	  else
    	  {
    			tabFFT[2][i] = tabFFT[0][i];
    	  }
      }
    }
    Je pense obtenir les données que je cherche dans mon tableau2 mais je ne suis pas sur. Comment la tableau arrive t'il a gérer 3 infos (partie réelle (amplitude signal), partie imaginaire(phase) et encore les données temporelles) ?

    Mon objectif est maintenant de faire une FFT inverse pour ressortir un fichier wave contenant les valeurs du tableau 2 mais en temporel.

    J'ai tenté plusieurs types d'écriture mais rien ne marche...
    J'ai tenté ça mais ça ne marche pas ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       CSound fichierson2=tabFFT[2].GetFFT(2048, TRUE, double* pfReIn, double* pfImIn, double* pfReOut, double* pfImOut);
    Comment puis-je faire ?
    Merci

  10. #10
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Pour ta première question, les données temporelles (signal L & R) sont visiblement gérées par la classe CSound. Les données fréquentielles (amp et phase) te sont retournées lorsque tu appelles GetFFT.

    Pour faire une FFT inverse, tu dois probablement utiliser cette méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        static BOOL FFT(UINT uTaille, BOOL bInverse, double* pfReIn, double* pfImIn, double* pfReOut, double* pfImOut);
    Le soucis est qu'elle prend en paramètre des pointeurs vers les premiers éléments des tableaux de taille uTaille et que tu ne dispose que de données dans des CTab. Il faut que tu te documentes sur CTab pour en obtenir un pointeur vers son premier élément.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    51
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 51
    Points : 29
    Points
    29
    Par défaut
    En fait avant de faire une iFFT, lors du traitement de mon signal, je veux effectuer des opérations sur les parties réelles et imaginaires de mes 2 signaux droite gauche.
    Je me suis aperçu que mon code modifie l'amplitude du signal et non les parties réelles et imaginaires.

    Comment arriver à faire des manipulations sur les parties entières et imaginaires dans mon programme principal

    Merci

Discussions similaires

  1. Réponses: 4
    Dernier message: 15/05/2015, 10h22
  2. Prétraitement du son (fichier audio d'extension .wav)
    Par asma_tata dans le forum MATLAB
    Réponses: 0
    Dernier message: 22/02/2014, 20h21
  3. dessiner la forme d'onde d'un fichier audio
    Par cgodefrw dans le forum DirectX
    Réponses: 7
    Dernier message: 26/06/2005, 08h40
  4. obtenir la durée d'un fichier audio
    Par cgodefrw dans le forum DirectX
    Réponses: 2
    Dernier message: 07/10/2004, 16h49
  5. Récupérer les infos sur un fichier audio
    Par Halleck dans le forum Windows
    Réponses: 13
    Dernier message: 17/04/2004, 18h39

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