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

Signal Discussion :

Filtrage d'un signal non périodique


Sujet :

Signal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Janvier 2015
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : Transports

    Informations forums :
    Inscription : Janvier 2015
    Messages : 1
    Par défaut Filtrage d'un signal non périodique
    Bonjour,
    Je suis un novice de MatLab et j'aimerai avoir un coup de pouce concernant un programme de traitement de signal que j'essaie de réaliser.

    En fait, je dois implémenter un programme qui permet de récupérer des valeurs de pressions échantillonnées à 1kHz à partir d'un fichier .txt et les filtrer pour éliminer le bruit qui vient se superposer sur le signal d'origine. Ensuite je dois les ploter en fonction du temps et de la fréquence.

    Pour l'importation du fichier tout va bien j'ai réussi à importer toutes les valeurs et à les indexer
    J'ai aussi créé une base temporelle de 0.001*30099, avec N=30099 le nombre d'échantillons de mon signal. et une base fréquentielle. Après je fais une fft de mon signal et c'est à partir de là ou commence mon problème car une fois je fais la fft je me retrouve avec des pics répétés et je vois pas comment je pourrais procéder pour éliminer ceux qui représentent les harmoniques.

    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
    48
    49
    Pression=smooth(Rampe(:,3));
     
    Fs=1000;                                    %Fréquence de sampling
    N=30099;                                    %Nombre d'échantillons
    ind=0.001;                                  %Pas temporel de 0.001s
     
     
    t(:,1)=0:(1/Fs):(N-1)/Fs;                   %Base temporelle
    f(:,1)=(0:N-1)*Fs/N;                        %Changement de la base fréquentielle
     
    X=fft(Pression,30099);                      %Serie de Fourier discrete
     
     
     
    ty=abs(X);
     
     
     
    %Changement des indices temporelles - incrémentation de 0.001 à chaque pas
    for i=1:1:N
     
            Rampe(i,1)=ind;                     %Introduction du Pas temporel
            ind=ind+0.001;                      %Incrémentation
     
            if(i==N)                            %Sortir de la boucle lorsqu'on atteint le pas temporel maximal 
                break; 
            end;
    end;
     
     
     
    figure(1)
    plot(t,Pression);
    title('P2 - Temporelle');
     
    figure(2)
    semilogx(f(1:length(f)/2),ty(1:length(f)/2));
    title('FFT de P2 sans filtrage - Frequentielle');
     
     
    %Elimination du bruit et des harmoniques
     for i=1:1:30099
         if(ty(i)<6.765e5)          
              ty(i)=0;
         end;
     end;
     
     %Recomposition du signal temporel à partir du spectre du sgnal
     Ry=ifft(ty);
    Je vous remercie d'avance.
    Cdlt.

  2. #2
    Membre averti
    Inscrit en
    Juillet 2007
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 14
    Par défaut
    Salut,

    j'aurais plusieurs remarques à faire sur ton code :

    *MATLAB te propose un outils assez puissant, la manipulation de matrices. La plupart du temps, tu n'as pas besoin de boucles et les oppérations se font dans des matrices. Je ne saurais trop dire si tu gagnes en temps de calcul (je crois), mais en tout cas tu gagne en lisibilité et ça fait plus classe (paie l'argumentation). Peut importe, ça dit, j'avoue utiliser des boucles quand je ne sais pas comment faire d'autre.
    Par exemple toute ta boucle peut être remplacée par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    pas = 0.001;
    ind = 0:pas:(N-1)*pas %le tableau "pas" contient N élements linéairement répartis de 0 à (N-1)*pas, équivalent à linespace(,,).
    %ou
    ind = pas:pas:N*pas %pour ne pas commencer à 0;
    *la fft, pour des raisons obscure (faut regarder comment est codée la fft) te fera gagner en vitesse si tu la fait sur une puissance de 2. Par exemple, pour toi, ça sera mieux sur 32768 (=2^15) points que sur 30099 points. Du coup, j'entend par là qu'il faut rajouter des points à ton signal... or tu ne peux pas en inventer d'autres. Mais tu peux rajouter des 0 (c'est du "zero-padding"). En fait c'est même bien de le faire :
    -si deux signaux ont des fréquences proches, tu risque de ne pas bien les différencier si le nombre d'échantillons est faible (ici deux sinus de fréquences 1000 et 1100Hz avec 50 échantillons
    Nom : 2_freq_loin.jpg
Affichages : 1044
Taille : 35,0 Ko
    (http://fr.mathworks.com/help/signal/...o-padding.html)

    -si deux signaux ont des fréquences éloignés, tu peux avoir une fausse impression sur leur amplitudes (ici deux sinus d'amplitude '1' )
    Nom : 2_freq_proches.jpg
Affichages : 1237
Taille : 41,2 Ko



    pour faire du zero-padding, (avec une fréquence de 2) tu peux entrer le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    n_pad = nextpow2(length(Pression))+2; %tu utilise la puissance de 2 suivante (nextpow2) + 2 par exemple pour un encore plus important zero-padding.
    %tu peux mettre juste nextpow2(...) ou rajouter +1, +3... à toi de voir
    X=fft(Pression,2^n_pad); %cela va completer Pression avec plein de '0', pour avoir un signal de longueur 2^n_pad
    *un autre point à voir est le fenêtrage. Comme il est tard, je laisse wikipedia expliquer : https://fr.wikipedia.org/wiki/Fen%C3%AAtrage . Si tu as une question, un truc pas compris : demande
    à noter que le fenêtrage se fait donc avant la fft. De plus tu peux essayer deux fenêtre "blackman" et "hanning", matlab a deux fonctions du même nom pour les créer.

    Une fois tout ça fait tu devrais pouvoir mieux observer ton signal.

    Si tu peux envoyer ton fichier txt sur le forum, on pourra mieux y regarder

    bien à toi,

Discussions similaires

  1. Estimation période signal pseudo-périodique
    Par StitchP dans le forum Traitement du signal
    Réponses: 21
    Dernier message: 25/06/2008, 12h10
  2. Filtrage d'un signal bruité
    Par zinzaf dans le forum LabVIEW
    Réponses: 1
    Dernier message: 23/06/2008, 18h10
  3. FFT signal non périodique, dérivation
    Par Heimdall dans le forum Traitement du signal
    Réponses: 4
    Dernier message: 23/02/2008, 22h44
  4. Création et filtrage d'un signal rectangulaire
    Par jena dans le forum Signal
    Réponses: 3
    Dernier message: 06/09/2007, 15h49
  5. Réponses: 4
    Dernier message: 31/05/2007, 18h34

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