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

Lazarus Pascal Discussion :

Traitement Audio - Fourier


Sujet :

Lazarus Pascal

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 20
    Points : 2
    Points
    2
    Par défaut Traitement Audio - Fourier
    Bonsoir à tous !

    dans le cadre de mon cours d'info, je dois réaliser un programme de traitement audio sous Lazarus.

    Pour ce faire, je récupère tout d'abord les amplitudes dans un fichier texte grâce à Matlab. Ensuite, afin de tracer le spectre en fréquences, je dois calculer les transformées de Fourier. Ne souhaitant pas utiliser FFT, je dois calculer chaque fréquence manuellement. J’ai trouvé ceci après quelques recherches : http://www.google.fr/url?sa=t&rct=j&...7RvOSW3qO_AZMg
    J'utilise alors les deux formules de la page 5.

    Cependant, j’ai quelques problèmes :
    - Pour les destructeurs, j’obtiens un « illegal qualifer » pour les free, je ne comprends pas pourquoi..
    - Après un certain temps de calcul, Lazarus me renvoie un message d'erreur "external SIGSEGV". Mais même en utilisant le debugger je ne vois pas où ça coince..

    Qu'en pensez-vous ?
    Je vous remercie d'avance pour votre aide, et bonnes soirée !
    Fichiers attachés Fichiers attachés

  2. #2
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Projet
    Options du projet...
    Options du compilateur
    Code
    Intervalle (-Cr)

    tu coches la case Intervalle ci-dessus et tu relances le projet
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 20
    Points : 2
    Points
    2
    Par défaut
    Merci de ta rapide réponse !

    Dur dur la doc Lazarus.. A quoi correspond cette option ?

    J'ai cocher cette case, j'ai maintenant une erreur "RunError(58336)" avant même de rentrer dans la boucle.. =/

  4. #4
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par mewiine Voir le message
    Merci de ta rapide réponse !

    Dur dur la doc Lazarus.. A quoi correspond cette option ?

    J'ai cocher cette case, j'ai maintenant une erreur "RunError(58336)" avant même de rentrer dans la boucle.. =/
    cette option ajoute du code à la compilation qui s'assure que tu n'utilises pas un index hors limite, exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    type
     TMonTableau = array[0..2] of Byte;
    var
      T: TMonTableau;
    begin
      T[12] := 1; // Big ! erreur
    end;
    Dans ton code tu fixes des dimensions arbitraires à tes tableaux, et les valeurs choisie sont TRES inférieures aux dimensions requises.

    Tu devrais utiliser des tableaux dynamiques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    var
      T: array of Byte;
    begin
      SetLength(T, 13); // donc de 0 à 12
      T[12] := 1; // pas de problème
    end;
    et pour avoir une aide digne de ce nom il faut taper dans Delphi 6 ou 7
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 20
    Points : 2
    Points
    2
    Par défaut
    Dac!

    J'ai corrigé les tableaux, ainsi qu'une petite erreur dans la boucle de somme. Si je n'ai dès lors plus de message d'erreur, j'ai maintenant un calcul interminable, l'appui sur le bouton tableau ne donnant rien.. D'où le problème peut-il venir ?

    Edit : Ah si, autant pour moi, après un certain temps j'obtiens un "range check error COL[1] ROW[100]".. pourquoi ici ?
    De plus, et oh miracle!, des valeurs sont présentes dans le tableau (en espérant qu'elles correspondent bien à celles voulues). D'ailleurs, pour ce qui est du côté mathématiques de la FFT, mon "adaptation" semble-t-elle correcte ?

    Merci !
    Fichiers attachés Fichiers attachés

  6. #6
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    pour le range check c'est que ton tableau est mal dimensionné.

    pour le temps de cacul, tu devrais sortir la création des Ccomplexe de la boucle car c'est très consommateur de temps, je n'ai plus ton code ne tête mais en gros

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    var
      C, Cn: Ccomplexe;
    begin
      C := Ccomplexe.create;
      Cn := Ccomplexe.Create;
      for ...
      begin
        c.init(...) // au lieu d'un constructor, une methode qui  initialise le composant
       ...
      end;
      C.Free;
      Cn.Free;
    end;
    quand à la validité mathématique ....
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 20
    Points : 2
    Points
    2
    Par défaut
    J'ai ajouté une méthode Init :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    procedure Ccomplexe.init;
    begin
      fRho:=0;
      fTheta:=0;
      SetCartesien(fRho,fTheta);
    end;
    et changé mon code comme suit :

    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
    constructor CTabSpectre.create(T:CTableau);
    var Theta:real; n,k:integer; C,Cn:Ccomplexe;
    begin
      SetLength(fFreq,T.fNe);
      SetLength(fAmp,T.fNe);
      C:=CComplexe.create_polaire(0,0);
      Cn:=CComplexe.create_polaire(0,0);
      for k:=0 to T.fNe-1 do
      begin
      fFreq[k]:=(k*(1/T.fTe))/T.fNe;
         for n:=0 to T.fNe-1 do
         begin
           Theta:=(-2*k*pi)/T.fNe;
           Cn.init;
           Cn.SetCartesien(T.fX[n],Theta*n);
           C.somme(Cn);
         end;
      fAmp[k]:=1/T.fNe*C.GetRho;
      end;
      Cn.destroy;
      C.destroy;
    end;
    Cependant, le temps de réponse est toujours aussi long.. Était-ce bien ce qu'il fallait faire ?

  8. #8
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    pas exactement...

    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
     
    constructor CTabSpectre.create(T:CTableau);
    var Theta:single; n,k:integer; C,Cn:Ccomplexe;
    begin
      SetLength(fFreq,T.fNe);
      SetLength(fAmp,T.fNe);
      C:=CComplexe.create;
      Cn:=CComplexe.create;
      for k:=1 to T.fNe do
      begin
      fFreq[k]:=(k*(1/T.fTe))/T.fNe;
       C.init_polaire(0,0);
         for n:=0 to T.fNe-1 do
         begin
           Theta:=(-2*k*pi)/T.fNe;
           Cn.init_polaire(T.fX[n],Theta*n);
           C.somme(Cn);
         end;
      fAmp[k]:=1/T.fNe*C.Rho;
      end;
      Cn.destroy;
      C.destroy;
    end;
    où la méthode init_polaire reprend le code du constructor.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure cComplexe.init_polaire (aRho,aTheta:real);
    begin
      fRho:=aRho;
      fTheta:=aTheta;
      SetCartesien(aRho,aTheta);
    end;
    ensuite il faudrait utiliser des Single ou Double au lieu de Real

    ceci dit avec 5345.656.996 itérations ça prend du temps
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 20
    Points : 2
    Points
    2
    Par défaut
    Okay! En fait je remplace mes constructeurs de Ccomplexe par les Init avec paramètres, c'est ça ? Du coup, si je ne redéfinit pas les Create ce seront ceux par défaut de TObject qui seront utilisés ?

    Tu remplaces les Real par des Single, c'est pour optimiser la mémoire ? Nous n'avons jamais utilisé que des real en cours, du coup c'est un peu flou..

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 20
    Points : 2
    Points
    2
    Par défaut
    Une autre question :

    Afin de tracer mon histogramme (Amplitudes en fonction des Fréquences), je pense devoir utiliser un TChart, mais je ne trouve pas comment.. J'ai bien trouvé la méthode AddSerie mais je ne vois pas quel TBasicChartSerie mettre en paramètre. Dois-je créer autant de série que de barres voulues ? (celles-ci devraient se trouver tous les k*fFe)

  11. #11
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    Citation Envoyé par mewiine Voir le message
    Okay! En fait je remplace mes constructeurs de Ccomplexe par les Init avec paramètres, c'est ça ? Du coup, si je ne redéfinit pas les Create ce seront ceux par défaut de TObject qui seront utilisés ?
    oui

    Citation Envoyé par mewiine Voir le message
    Tu remplaces les Real par des Single, c'est pour optimiser la mémoire ? Nous n'avons jamais utilisé que des real en cours, du coup c'est un peu flou..
    non c'est que Single et Double sont natif au processeur, pas Real

    Citation Envoyé par mewiine Voir le message
    Une autre question :

    Afin de tracer mon histogramme (Amplitudes en fonction des Fréquences), je pense devoir utiliser un TChart, mais je ne trouve pas comment.. J'ai bien trouvé la méthode AddSerie mais je ne vois pas quel TBasicChartSerie mettre en paramètre. Dois-je créer autant de série que de barres voulues ? (celles-ci devraient se trouver tous les k*fFe)
    pourquoi ne pas simplement dessiner un graphe 2D dans un Bitmap ? une simple règle de trois et tu pourras déterminer les positions x,y des points
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 20
    Points : 2
    Points
    2
    Par défaut
    Je peux tracer mon tableau, merci !

    Je m'occupe donc maintenant de mon histo. Le composant TChart n'est pas adapté à ton avis ? Je trouvais pourtant ça cool, à condition de savoir s'en servir ^^
    Concernant le Bitmap je ne vois pas trop comment procéder, avec cette histoire de règle de trois..

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 20
    Points : 2
    Points
    2
    Par défaut
    En cherchant un peu d'aide sur le composant TChart j'ai codé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.Button1Click(Sender: TObject);
    var T:CTableau; S:CtabSpectre; i:integer;
    begin
      T:=CTableau.create;
      S:=CTabSpectre.create(T);
      for i:=0 to T.fNe-1 do
          SpectreBarSeries1.AddXY(round(i*T.fNe),round(S.fAmp[i]*1000000000));
      T.destroy;
      S.destroy;
    end;
    en ayant crée auparavant un TBarSerie : SpectreBarSeries1

    Cependant, à l’exécution lorsque je clique sur le bouton rien ne se passe.. Que manque-t-il ?

  14. #14
    Expert éminent sénior
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    la dernière fois que j'ai utilisé ce composant c'était en 2002 pour l'écriture de "Delphi 7 Studio" aux éditions Eyrolles ^^

    je dirais (d'après la page 115 dudit ouvrage)...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    procedure TForm1.Button1Click(Sender: TObject);
    var T:CTableau; S:CtabSpectre; i:integer;
    begin
    T:=CTableau.create;
    S:=CTabSpectre.create(T);
    for i:=0 to T.fNe-1 do
    SpectreBarSeries1.Add({XY(round(i*T.fNe),round(}S.fAmp[i]{*1000000000)});
    T.destroy;
    S.destroy;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

Discussions similaires

  1. Traitement audio sous MATLAB
    Par Khan34 dans le forum Audio
    Réponses: 1
    Dernier message: 25/04/2007, 12h43
  2. [PIC] Quelle puce pour échantillonnage et traitement audio temps réel ?
    Par kromartien dans le forum Autres architectures
    Réponses: 3
    Dernier message: 15/03/2007, 21h45
  3. Quel est le langage de programmation le plus pertinent pour du traitement audio ?
    Par LeTouriste dans le forum Langages de programmation
    Réponses: 3
    Dernier message: 02/11/2006, 11h42
  4. traitement audio et video
    Par abaddon325 dans le forum C++
    Réponses: 9
    Dernier message: 25/02/2005, 17h19

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