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

MATLAB Discussion :

[fft] fonction faite maison vs. fonction MATLAB


Sujet :

MATLAB

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 168
    Points : 85
    Points
    85
    Par défaut [fft] fonction faite maison vs. fonction MATLAB
    Bonjour à tous,

    j'ai un problème de temps d'exécution avec matlab. En effet, j'ai réécrit une fonction FFT mais celle-ci est beaucoup plus lente que celle implémenté dans matlab. Y a-t-il un moyen d'accélérer tout ça ?

    Au cas où il y aurai un problème dans mon code, je vous donne le code de ma FFT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    N = length(signal);
    spectrum = zeros(N, 1);
     
    for k=0:ceil((N+1)/2)
    	for n=0:N-1
    		spectrum(k+1) = spectrum(k+1) + signal(n+1)*exp(-2*pi*j*k*n/N);
    	end
    	if k>0
    		spectrum(N-k+1) = conj(spectrum(k+1));
    	end
    end

  2. #2
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 884
    Points
    52 884
    Par défaut
    La FFT sous MATLAB est implémentée grâce à la bibliothèque FFTW écrite en C. Je doute qu'une implémentation en MATLAB puisse rivaliser...
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 168
    Points : 85
    Points
    85
    Par défaut
    L'utilisation d'un mex-file pourrait-il grandement arrangé mon problème ? (j'imagine que oui mais c'est juste pour confirmation vu que j'ai encore jamais utilisé un tel fichier)

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Oui... en théorie.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    168
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2005
    Messages : 168
    Points : 85
    Points
    85
    Par défaut
    okai, vais voir ça. Merci pour cette prompte réponse

  6. #6
    Membre éprouvé
    Inscrit en
    Août 2010
    Messages
    1 124
    Détails du profil
    Informations forums :
    Inscription : Août 2010
    Messages : 1 124
    Points : 1 277
    Points
    1 277
    Par défaut
    Tu peux au moins vectoriser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for n=0:N-1
    		spectrum(k+1) = spectrum(k+1) + signal(n+1)*exp(-2*pi*j*k*n/N);
    	end
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    spectrum(k+1)= sum(signal.*exp(-2*pi*j*k*(0:N-1)/N);
    et essayer de voir si tu peux vectoriser la seconde boucle (ca m'a l'air tout à fait faisable)

    Ca sera surement mieux, mais dans tous les cas, tu n'atteindra pas la vitesse C

  7. #7
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 884
    Points
    52 884
    Par défaut
    Il est possible de pousser un peu plus loin l'optimisation en remplaçant la fonction SUM par une simple multiplication matricielle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    N = length(signal);
    spectrum = zeros(N, 1);
     
    spectrum(1)= sum(signal);
    for k=1:ceil((N+1)/2)
        spectrum(k+1)= signal*exp(-2*pi*1i*k*(0:N-1)/N)';
        spectrum(N-k+1) = conj(spectrum(k+1));
    end
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    N = length(signal);
    spectrum = zeros(N, 1);
     
    spectrum(1)= sum(signal);
    for k=1:ceil((N+1)/2)
        spectrum(k+1)= exp(-2*pi*1i*k*(0:N-1)/N)*signal(:);
        spectrum(N-k+1) = conj(spectrum(k+1));
    end

    Attention, SPECTRUM est le nom d'une fonction de la Signal Processing Toolbox. Il serait préférable de modifier le nom de cette variable.
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

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

Discussions similaires

  1. une fonction intermédiaire entre c++ et matlab
    Par tapouni dans le forum C++Builder
    Réponses: 0
    Dernier message: 13/05/2008, 11h34
  2. Equivalent des fonctions BUTTER et FILTFILT de MATLAB
    Par ghizlane40 dans le forum Scilab
    Réponses: 1
    Dernier message: 17/04/2008, 11h05
  3. Réponses: 6
    Dernier message: 24/04/2007, 17h17
  4. Réponses: 8
    Dernier message: 14/12/2006, 23h37
  5. comment tester si une fonction fait bien son travail
    Par access dans le forum Requêtes
    Réponses: 1
    Dernier message: 24/11/2003, 15h46

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