Traitement de signal avec Maltab
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Traitement de signal avec Maltab



  1. #1
    cubitus_54

    Traitement de signal avec Maltab


    ------

    Bonjour,

    Je suis en train d'essayer de faire un programme sous Matlab et il y a un truc qui ne va pas.

    J'ai récupéré sur mon oscilloscope le fichier de la trace en .CSV

    J'importe ce fichier sous Matlab

    L’affichage du signal est nickel par contre le FFT ne donne rien.

    Est-ce que quelqu’un peut me dire pourquoi ?

    Merci

    Ci-joint le programme, le fichier CSV, et une photo d'écran.

    Code:
    %% Importation d'un fichier CSV de l'oscilloscope        
    inc=str2num (cell2mat (Increment)); % passage cellule-> ASCII -> entier
    debut=str2num (cell2mat (Start));
    time = (X * inc) + debut; % adaptation à l'échelle réelle.
    CH1(1)=CH1(2);  % complement des cellules NA
    X(1)=0;  
    %% affichage
    subplot(211);
    plot(time,CH1)
    title('Oscillogramme')
    xlabel('t(s)');
    ylabel('Signal');
    %% 
    subplot(212);
    SigFFT = fft(CH1);
    plot(abs(SigFFT))
    title('Analyse FFT')
    xlabel('f(Hz)');
    ylabel('Signal');

    untitled.png

    -----
    Fichiers attachés Fichiers attachés

  2. #2
    Antoane
    Responsable technique

    Re : Traitement de signal avec Maltab

    Bonsoir,

    De mémoire :

    Tu n'as pas normalisé tes axes x (les raies ne sont pas espacées de 1Hz) et y (il faut diviser SigFFT par length(SigFFT )).
    Par ailleurs, il ne faut garder que la moitié du spectre. Toute la partie située à droite étant l'équivalent des fréquences négatives, elle contient de l'information déjà stockée dans la partie droite ; elle est donc redondante. Elle contient en revanche de l'énergie, qu'il faut comptabiliser : il faut multiplier SigFFT par 2. A un détail près : la composante continue n'est présente qu'une fois, il ne faut donc pas la re-multiplier par 2.
    Code:
    % In fine, la normalisation en y donne :
    SigFFT = 2*SigFFT/length(SigFFT) ;
    SigFFT(1) = SigFFT(1)/2;
    
    % Et le plot :
    plot(abs(SigFFT(1:floor(length(SigFFT )/2))))
    Tu peux t'inspirer des exemples : http://se.mathworks.com/help/matlab/ref/fft.html (la ligne "NFFT = 2^nextpow2(L); % Next power of 2 from length of y" n'est pas indispensable mais simplifie/accélère le calcul, l'algo FFT étant optimal pour des matrices de tailles de puissances de 2).

    Tu peux vérifier que ton script de FFT donne le bon résultat en lui donnant à manger un signal de spectre connu (e.g. 4 + 5*sin(w*t) + 3*sin(5*w*t))
    Dernière modification par Antoane ; 09/04/2015 à 18h46. Motif: Détails + Ortho.
    Deux pattes c'est une diode, trois pattes c'est un transistor, quatre pattes c'est une vache.

  3. #3
    cubitus_54

    Re : Traitement de signal avec Maltab

    Salut Antoane,

    Pour info (si tu as reconnu le signal, l'ajout d'un condensateur sur le secteur à multiplié par 3 l'intensité du signal précédent....)

    La syntaxe que tu m'as donné change juste l'échelle mais toujours pas l'ombre d'une vraie FFT


    J'avais vu sur ce site un exemple ca semble si simple...

    http://www.facstaff.bucknell.edu/mas...labExample.htm

  4. #4
    Antoane
    Responsable technique

    Re : Traitement de signal avec Maltab

    Bonsoir,

    Un autre problème : il faut avoir un nombre entier de période dans le signal que tu envoies à la fonction fft de matlab, sans quoi il y a des effets dus au fenêtrage qui déforment complètement la FFT.




    Voici une fonction toute faite, qui :
    - ne garde qu'un nombre entier de périodes du signal initial (à condition que tu lui précise la fréquence f0 du fondamental) ;
    - trace le signal dans le domaine temporel et la FFT.

    Code:
    function []=plotMyFFT( CH1, Ts, f0, nharm )
    % plot the FFT of signal "CH1"
    %   Ts is the sampling time, 
    %   f0 is the frequency of the fundamental of CH1 (if f0 is unknown, it may be omitted.)
    %   nharm is the number of harmonics to be displayed (may be omitted)
    %   let us assume Ts in constant   
    
    if nargin < 4 nharm=-1 ; end % mandatory to allow nharm to be omitted
    if nargin < 3 f0=-1 ; end % mandatory to allow f0 to be omitted
    
    
    
    % keep only an integer number of periods for FFT
    if f0 > 0 % only if f0 is known
        samppper=1/(f0*Ts); % number of sample per periode
        nperiodes=floor(length(CH1)/samppper); % number of periodes kept for FFT computation
        CH1=CH1(1:round(nperiodes*samppper)); % truncated signal
    end
    
    % compute time vector
    time=Ts*[0:length(CH1)-1];
    
    % plot signal
    subplot(211); plot(time,CH1); grid on
    title('Oscillogramme'); xlabel('t (s)'); ylabel('Signal (V)');
    
    % Compute and plot FFT
    FT=fft(CH1); % get FFT
    N=length(FT); % length of the FFT
    N2=round(N/2); % length of the ploted FFT
    FT=FT(1:N2);% keep only half the spectrum
    FT=2*FT/N; FT(1)=FT(1)/2; % normalise
    f=1/(Ts*N)*[0:N2-1]; % compute frequency vector
    subplot(212); 
    if f0 > 0 stem(f,abs(FT), '.r'); % beautyfull plot
    else plot(f,abs(FT)); % no so beautyfull plot
    end
    grid on
    title('Analyse FFT'); xlabel('f (Hz)'); ylabel('Signal (V)');
    
    if nharm > 0 xlim([0 min(nharm*f0, f(end))]); end % show only from 0 to 1kHz
    message=sprintf('Enable to plot as many harmonics as required; I ploted roughly %i', round(f(end)/f0));
    if nharm*f0 > f(end) warning(message); end
    
    end
    Note qu'il s'agit d'amplitudes, et non de valeurs RMS sur la FFT.

    Tu peux la tester avec ton signal avec le code suivant :
    Code:
    M=csvread('a_vide.csv',2,0); % import data
    Ts=2.0000001314e-005; % sampling time, extracted from the csv-file
    CH1=M(:,2); % signal
    f0=50; % frequency of the fundamental
    nharm=50; % number of harmonics we want to plot
    plotMyFFT( CH1, Ts, f0, nharm)
    Tu peux aussi la tester avec un signal qqcq connu pour vérifier que le résultat est le bon :
    Code:
    Ts=547e-6;  fs=1/Ts; % Random value
    t=Ts*[-1e3:1e4]; % time vectro, needed to generate the signal
    f0=50; % fundamental frequency
    CH1=4+3*sin(2*pi*f0*t)+5*sin(2*pi*5*f0*t); % signal 
    nharm=52;
    plotMyFFT( CH1, Ts, f0, nharm)
    Deux pattes c'est une diode, trois pattes c'est un transistor, quatre pattes c'est une vache.

  5. A voir en vidéo sur Futura
  6. #5
    Antoane
    Responsable technique

    Re : Traitement de signal avec Maltab

    Bonsoir,
    Citation Envoyé par Antoane Voir le message
    Un autre problème : il faut avoir un nombre entier de période dans le signal que tu envoies à la fonction fft de matlab, sans quoi il y a des effets dus au fenêtrage qui déforment complètement la FFT.
    Exemple : un signal est généré en utilisant :
    Code:
    Ts=54.7e-6;
    t=Ts*[0:1e3];
    f0=50;
    CH1=4+3*sin(2*pi*f0*t)+5*sin(2*pi*5*f0*t);
    En PJ un l'oscillogramme et sa FFT.
    Pour le signal bleu, on ne prend qu'un nombre entier (=2) de périodes alors que pour le signal rouge, on en prend un nombre qqcq (non-entier). Le résultat est clair, la réponse évidente : il faut choisir la bonne fenêtre. La fonction donnée dans le post précédent génère (évidement ) le spectre bleu.
    Nom : fs_plot_wind.png
Affichages : 100
Taille : 7,5 Ko
    Deux pattes c'est une diode, trois pattes c'est un transistor, quatre pattes c'est une vache.

  7. #6
    cubitus_54

    Re : Traitement de signal avec Maltab

    Bonjour Antoane,

    Merci pour le code c'est vraiment bien !

    Je n'arrive pas à bien utiliser la commande "csvread"
    est-ce possible d'extraire l'incrément

    Code:
    X,CH1,Start,Increment,
    Sequence,Volt,-1.4000000000e-003,2.0000000000e-008,
    0,-2.437500e+00,
    1,-2.437500e+00,
    2,-2.437500e+00,
    C'est quand même beaucoup plus précis qu'un oscillo

    Le générateur :
    Rigol3736.gif

    L'oscilloscope

    MSO4014_20150410-182715.png

    Matlab

    fft.png

  8. #7
    Antoane
    Responsable technique

    Re : Traitement de signal avec Maltab

    Bonsoir,
    Citation Envoyé par cubitus_54 Voir le message
    Je n'arrive pas à bien utiliser la commande "csvread"
    est-ce possible d'extraire l'incrément

    Code:
    X,CH1,Start,Increment,
    Sequence,Volt,-1.4000000000e-003,2.0000000000e-008,
    0,-2.437500e+00,
    1,-2.437500e+00,
    2,-2.437500e+00,
    Probablement

    Citation Envoyé par cubitus_54 Voir le message
    C'est quand même beaucoup plus précis qu'un oscillo
    Es-tu sûr que l'oscillo prend en compte un nombre entier de périodes ? Ca devrait être assez visible en mettant le trigger à 0V et en centrant l'image.
    As-tu essayé de "jouer" avec les différentes fenêtres offertes par l'oscillo (Hanning, Hamming, rectangulaire... : http://fr.wikipedia.org/wiki/Fen%C3%AAtrage)
    Tu peux aussi jouer sur le nombre de périodes affichées (utilisées pour le calcul de la FFT) :
    - plus il y en a moins le fait que leur nombre ne soit pas entier à d'influence (1/2 est grand comparé à 1 mais pas comparé à 100 )
    - il y a un compromis entre l'écartement des raies (en Hz) sur la FFT et l'étendue de la FFT. Plus tu vois de périodes à l'écran plsu tu étudies les basses fréquences (raies rapprochées, faible fréquence max).
    Sinon, l'algo de calcul de la FFT devrait être le même dans Matlab et dans l'oscillo (la puissance de calcul demandée, pas formidable, peut à mon avis tout à fait être offerte par ton gros oscillo).

    Avec ton oscillo de compétition, tu as peut-être moyen de modifier manuellement la fréquence d'échantillonage, il faut alors (évidement) la prendre aussi grande que possible.
    Dernière modification par Antoane ; 10/04/2015 à 18h26.
    Deux pattes c'est une diode, trois pattes c'est un transistor, quatre pattes c'est une vache.

  9. #8
    cubitus_54

    Re : Traitement de signal avec Maltab

    As-tu essayé de "jouer" avec les différentes fenêtres offertes par l'oscillo (Hanning, Hamming, rectangulaire.
    Oui le plus propre c'est Hanning, celui que j'ai utilisé.

    Tu peux aussi jouer sur le nombre de périodes affichées (utilisées pour le calcul de la FFT) :
    effectivement

    Nom : harmo.png
Affichages : 96
Taille : 34,7 Ko

    tu as peut-être moyen de modifier manuellement la fréquence d’échantillonnage
    Ben non et c'est dommage... je peux modifier le taux d’échantillonnage pour l'acquisition de la trace de de 14k à 140M mais la FFT ne se paramètre pas. Je pense que ce n'est pas le point fort de cet oscillo.
    Quand la FFT est activée je ne peux par modifier la base de temps
    C'est d'ailleurs un aspect qui m'avait fait réfléchir à l'achat d'un analyseur de spectre.

Discussions similaires

  1. Réponses: 9
    Dernier message: 11/08/2012, 08h57
  2. prnicipe d'Heinsenberg en traitement du signal sur signal discret
    Par Anthony39 dans le forum Mathématiques du supérieur
    Réponses: 2
    Dernier message: 18/05/2012, 07h11
  3. Récupération d'un signal et traitement du signal avec Matlab
    Par invite8a011b82 dans le forum Logiciel - Software - Open Source
    Réponses: 2
    Dernier message: 13/04/2011, 10h46
  4. que faire avec une licence en traitement et detection de signal physique
    Par physicien007 dans le forum Orientation après le BAC
    Réponses: 2
    Dernier message: 25/01/2009, 14h40
  5. probléme avec le traitement de mon signal
    Par schneiderj dans le forum Électronique
    Réponses: 8
    Dernier message: 02/01/2009, 18h58
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...