Recalculer une valeur RMS à partir de la FFT d'un signal.
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

Recalculer une valeur RMS à partir de la FFT d'un signal.



  1. #1
    invite1586ca7f

    Recalculer une valeur RMS à partir de la FFT d'un signal.


    ------

    Bonjour à tous,

    Je mesure à l'aide d'un scope un signal carré d'amplitude 2.5Vpk-pk et de fréquence 1kHz.
    Grâce a cet oscilloscope, je dispose de la forme d'onde temporelle et FFT que je peux exploiter sous Excel (échantillonne à 1Ms/s et je visualise la FFT jusque 20kHz, avec une résolution de 0.4Hz). La FFT est bien paramétrée et j'observe bien la décroissance des harmoniques en 1/x.
    J'essaye de recalculer la valeur RMS de 2 façons :

    1) La première en utilisant la forme d'onde temporelle, pas de problème en utilisant RMS = Sqr(Somme(xi²)/taille(i)) ou i est le nombre de points.
    Pas de problème, je retrouve bien sur la valeur attendue

    2) La deuxième en utilisant les données FFT
    Soit X(f) les valeurs de la FFT en Vrms
    D'après mes souvenirs (que j'ai pu retrouver sur wiki in english : http://en.wikipedia.org/wiki/Root_m...requency_domain) la formule est RMS= (Sqr(Somme(Xi²))/taille(i). Cela devrait donner un résultat approchant mais pas du tout je trouve 45mV au lieu de 1.25V. (j'ai vérifié plusieurs fois, en effet vu que j'ai 50000 points sur ma FFT, le taille(i) me diminue le résultat). D'ailleurs, intuitivement je pige pas la formule parce que sur un signal périodique plus on augment le nombre de points plus le résultat sera faible ????
    Pourtant, si je somme 'manuellement' les 11 premiers harmoniques de la façon suivante RMS = Sqr(Somme(Xharm²), je retrouve comme on peut s'y attendre quasiment 1.25V.

    Question : Comment retrouver la valeur RMS du signal en utilisant les données de la FFT ?

    Cet exemple est pour un signal carré, mais je veux pouvoir le faire sur d'autres types de signaux, le but étant de retrouver la valeur RMS d'un signal préalablement enregistré en configurant la bande de fréquence de l'analyse RMS sur excel.

    Merci d'avance de votre aide.

    -----

  2. #2
    phuphus

    Re : Recalculer une valeur RMS à partir de la FFT d'un signal.

    Bonjour bliblibloblo,

    le code Matlab suivant fonctionne :
    Code:
    % FFT et calcul de la valeur RMS
      clear all ; clc ;
     
    % ------------------------ Essai 1 : signal carré -------------------------
    % Définition des constantes
      Fech = 10000 ;
      DeltaT = 1/Fech ;
      Nyquist = Fech/2 ; % Fech paire
      Duree = 10 ;
      t = [0:Fech*Duree-1]/Fech ;
      N = size(t,2) ;
      freq = 100 ;
      
    % Synthèse du signal
      signal = 1.254*square(2*pi*freq*t) ;
      signal_fft = fft(signal)/N ;
      
    % Calcul des valeurs RMS
      RMS_temporel = sqrt((1/Duree)*sum(signal.^2)*DeltaT)
      RMS_frequentiel = sqrt(sum(abs(signal_fft).^2))
      
    % ---------------------- Essai 2 : signal aléatoire -----------------------
    % Définition des constantes
      Fech = 10000 ;
      DeltaT = 1/Fech ;
      Nyquist = Fech/2 ; % Fech paire
      Duree = 10 ;
      t = [0:Fech*Duree-1]/Fech ;
      N = size(t,2) ;
      
    % Synthèse du signal
      signal = 1.314*rand(N,1) ;
      signal_fft = fft(signal) / N ;
      
    % Calcul des valeurs RMS
      RMS_temporel = sqrt((1/Duree)*sum(signal.^2)*DeltaT)
      RMS_frequentiel = sqrt(sum(abs(signal_fft).^2))
    Si la FFT que tu utilises sous Excel te renvoie un spectre d'amplitude, alors la division par taille(i) est déjà faite au stade de la FFT, et tu n'as plus à la refaire. Par contre, attention à bien additionner les modules de tes coefs, sinon le résultat est faux. De même, bien prendre TOUS les coefs de la fft (même la partie symétrique) pour un calcul complet. Si jamais tu n'utilises que la moitié des coefs, alors il faut multiplier le résultat final par racine(2).

    As-tu vérifié si ton spectre était un spectre d'amplitude crête ou RMS ? Parce que retomber sur le résultat en additionnant juste les 11 premiers Xharm me fait dire que tu as un spectre d'amplitude RMS et non crête (et donc la multiplication par racine(2) dont je parle précédemment est inutile, puisque dans ce cas les deux parties symétriques du spectre ont déjà été additionnées et divisée par racine(2)...). As-tu comparé les amplitudes de tes harmoniques à la théorie ?

  3. #3
    invite6dffde4c

    Re : Recalculer une valeur RMS à partir de la FFT d'un signal.

    Bonjour Phuphus.
    Je ne suis pas d'accord pour ajouter le module des amplitudes. Je pense qu'il faut ajouter les puissances (c'est à dire le carré du module des amplitudes), puis faire la racine carrée de la somme.
    Cordialement,

  4. #4
    phuphus

    Re : Recalculer une valeur RMS à partir de la FFT d'un signal.

    Citation Envoyé par LPFR Voir le message
    Je pense qu'il faut ajouter les puissances (c'est à dire le carré du module des amplitudes), puis faire la racine carrée de la somme.
    En effet, et c'est bien ce qui est fait dans le code Matlab que je donne plus haut. Je me suis mal exprimé en prenant un petit raccourci dans le texte associé... Au temps pour moi !

  5. A voir en vidéo sur Futura
  6. #5
    invite1586ca7f

    Re : Recalculer une valeur RMS à partir de la FFT d'un signal.

    Merci beaucoup de votre aide.
    Effectivement je retrouve bien le bon résultat en utilisant votre code.
    Toutefois quand j'utilise le résultat de la FFT calculée par le scope (qui est effectivement un spectre RMS), les résultats ne sont pas bons.
    J'imagine que cela est du au fait que le scope utilise un fenêtrage pour la FFT. En effet si j'applique un fenêtrage de Hamming sous matlab, la valeur RMS est bien plus faible.

    Donc sachant le type de fenêtrage utilisé (en l'occurrence flat-top), comment recalculer la valeur RMS ? j'imagine qu'il faut utiliser la bande equivalente de bruit de la fenêtre utilisée, mais comment ?

  7. #6
    phuphus

    Re : Recalculer une valeur RMS à partir de la FFT d'un signal.

    Bonjour,

    dans les analyseurs de spectre professionnels, le fenêtrage est toujours compensé derrière pour retrouver le niveau perdu. Plusieurs choix sont possibles, mais je ne saurais te dire qui a choisi quoi dans les analyseurs existants à l'heure actuelle :

    - respecter au mieux l'amplitude des pics du spectre : bête compensation du niveau temporel global
    - partir du principe que le spectre doit conserver la valeur RMS d'un signal : là, la meilleure solution est de calculer le RMS sur le signal temporel original, calculer le RMS sur le signal temporel fenêtré, en déduire le coefficient de correction et l'appliquer sur le spectre

    Si ton scope, qui donne un spectre d'amplitude RMS, est bien fait, alors il doit de base conserver la valeur RMS globale du signal. Ainsi, tu n'as pas de question à te poser quant à la prise en compte de la fenêtre dans ton propre calcul.

    Maintenant, comme tu veux pouvoir calculer la valeur RMS de ton signal dans une bande de fréquences considérée, tu te dis légitimement que l'étalement des raies (phénomène de fuite d'énergie, je suppose, plutôt que de bande équivalente de bruit, non ?) va te gêner. Il faut faire avec... Dans l'analyse de signaux arbitraire, en effet rien ne te dira si un point en particulier est du à une réelle composante du signal à la fréquence considérée ou bien à une fuite d'énergie de la part des points adjacents, ou encore à de la modulation d'amplitude, etc. .

    Sinon, tu peux aussi te construire une batterie de filtres IIR dont la somme respecte la valeur RMS du signal. C'est ce qui est fait par exemple en analyse tiers d'octave, avec une banque de butterworth d'ordre 3 si ma mémoire est bonne. Pour avoir la valeur RMS sur une bande de fréquences restreinte, tu prends le résultat d'un seul filtre.

  8. #7
    invite1586ca7f

    Re : Recalculer une valeur RMS à partir de la FFT d'un signal.

    Je m'excuse par avance, car je ne suis pas utilisateur régulier de matlab.

    Soit 'scope', les points qui sortent de mon oscilloscope.

    t=linspace(0,50000,50000)
    Hamming=0.54-0.46*cos((2*pi*t)/49999)
    Hamming=transpose(Hamming)
    scopeHamm= scope .* Hamming
    scopeHammFFT=fft(scopeHamm) / 50000
    FFTscope=fft(scope)/50000

    RMSFFTHamm=sqrt(sum(abs(scopeH ammFFT).^2))
    RMSFFT=sqrt(sum(abs(FFTscope). ^2));

    On observe RMSFFT > RMSFFTHamm, si qui est finalement hyper logique vu que je multiplie mon signal par une fenêtre d'observation dont les valeurs sont comprises entre 0 et 1.

    De qui n'empêche pas d'ailleurs que les amplitudes de chaque harmoniques soit correctes (ou à peu près) car si je somme 'manuellement' les 11 premiers harmoniques de la façon suivante RMS = Sqr(Somme(Xharm²), je retrouve comme on peut s'y attendre quasiment 1.25V.

    Donc ceci me fait dire qu'il faut absolument prendre en compte dans le calcul de la valeur RMS en utilisant les données FFT, la caractéristique de la fenêtre utilisée, et ceci est inhérent au principe du fenêtrage, et pas la compensation utilisée par l'algorithme du scope.

    Ton idée de calculer le RMS sur le signal temporel original, calculer le RMS sur le signal temporel fenêtré, en déduire le coefficient de correction et l'appliquer sur le spectre (enfin par sur chaque raie individuelle mais sur le résultat final de RMSFFT) doit être correcte, mais est-ce certain ? cela doit revenir au même que la rapport des intégrales d'une fenêtre rectangulaire sur la fenêtre utilisée ?

    Merci d'avance.

  9. #8
    phuphus

    Re : Recalculer une valeur RMS à partir de la FFT d'un signal.

    Bonjour bliblibloblo,

    je pense que le mieux pour avancer sur cette question serait que tu nous fournisses les données sur lesquelles tu travailles :
    - signal temporel tel qu'enregistré par l'oscillo
    - spectre renvoyé par l'oscillo (si possible complet ! c'est à dire les coefficients complexes, ou bien si tu ne les as pas l'amplitude + la phase, je ne sais pas comment l'oscillo exporte ses données...)

    Sinon, pour répondre à tes questions, tout d'abord un ch'tit paragraphe sur Matlab. Je ne suis qu'utilisateur épisodique et pas vraiment un gros spécialiste, mais je peux déjà partager avec toi quelques connaissances.
    Citation Envoyé par bliblibloblo
    t=linspace(0,50000,50000)
    Tiens, encore une histoire de piquets et de distance. Tu crées ici un vecteur composé de 50000 valeurs régulièrement espacées entre 0 et 50000. Soit ton vecteur possède un point de trop, soit il faut créer 50000 espaces entre 50001 piquets... Pour ma part, je préfère construire le vecteur avec la valeur de début, la valeur de fin, et le pas (plutôt que le nombre de pas...) :

    t = [0:1:50000] ;

    Citation Envoyé par bliblibloblo
    Hamming=0.54-0.46*cos((2*pi*t)/49999)
    Ici, construire à la paluche une fenêtre de Hamming est pédagogique, sinon la commande "hamming" existe dans Matlab, par exemple :

    scopeHamm = scope .* hamming(N)' ;

    avec N le nombre de points de la fenêtre de Hamming, et le ' servant à faire la transposition à la volée. Par contre, il me semble que les valeurs de début et de fin de la fenêtre sont égale, donc tu dois commencer par 0 et finir par 2*pi, c'est à dire diviser par 50000 et non 49999. Sauf si tu as corrigé t pour qu'il finisse par 49999.

    Citation Envoyé par bliblibloblo
    De qui n'empêche pas d'ailleurs que les amplitudes de chaque harmoniques soit correctes (ou à peu près) car si je somme 'manuellement' les 11 premiers harmoniques de la façon suivante RMS = Sqr(Somme(Xharm²), je retrouve comme on peut s'y attendre quasiment 1.25V.
    Et si tu sommes tous les coefs renvoyés par le scope ? Que trouves-tu ?

    Citation Envoyé par bliblibloblo
    Donc ceci me fait dire qu'il faut absolument prendre en compte dans le calcul de la valeur RMS en utilisant les données FFT, la caractéristique de la fenêtre utilisée, et ceci est inhérent au principe du fenêtrage, et pas la compensation utilisée par l'algorithme du scope.

    Ton idée de calculer le RMS sur le signal temporel original, calculer le RMS sur le signal temporel fenêtré, en déduire le coefficient de correction et l'appliquer sur le spectre (enfin par sur chaque raie individuelle mais sur le résultat final de RMSFFT) doit être correcte, mais est-ce certain ? cela doit revenir au même que la rapport des intégrales d'une fenêtre rectangulaire sur la fenêtre utilisée ?
    Tout dépend de la nature de ton signal. Si l'énergie de ton signal est régulièrement répartie sur toute la période d'analyse, alors je suis d'accord pour dire que la valeur RMS du signal fenêtré est égale à la valeur RMS du signal non fenêtré multipliée par la valeur RMS de ta fenêtre (une fenêtre rectangulaire ayant un RMS de 1, pas la peine de faire le ratio). Donc pour un signal rectangulaire, ça va fonctionner sans problème.
    Par contre, imagine le cas suivant. Tu as une période d'analyse de 1s avec Fech = 50000. Le signal est un Dirac planté à l'origine de ta période, donc le premier échantillon est non nul et tous les autres le sont. Tu en fais le spectre.
    Maintenant, ton Dirac est décalé à l'échantillon n° 25000. Tu en refais le spectre, tu trouves un spectre d'amplitude exactement égal au cas précédent.
    Refais les deux cas précédents avec une fenêtre de Hamming, et tu verras que l'impact sur les amplitudes, et donc sur le calcul de la valeur RMS via la FFT, n'est pas du tout le même. En effet, dans le premier cas le Dirac est multiplié par 0.08. Dans le deuxième cas il est multiplié par 1. Impossible dans ce cas de retomber sur un RMS correct en multipliant juste par le RMS de la fenêtre !
    Sur un bruit blanc par exemple, la différence est minime. Si tu sais dès maintenant que l'énergie de ton signal est régulièremenet répartie, OK pour ta méthode. Sinon, fondamentalement, seule celle que je t'ai expliquée précédemment est valable.

    Une fois le coefficient de correction déterminé, quelle que soit la méthode, l'appliquer sur toutes les raies du spectre ou bien sur le calcul final du RMS revient au même.

    Sais-tu quelle fenêtre est utilisée par ton scope ?

Discussions similaires

  1. Calcul du RMS d'une signal avec une fréquence variable
    Par invite5533d885 dans le forum Électronique
    Réponses: 1
    Dernier message: 30/07/2010, 23h07
  2. obtention d'un signal continu a partir d'un signal sinusoidal
    Par invitef9ed8fd4 dans le forum Électronique
    Réponses: 8
    Dernier message: 17/03/2010, 19h56
  3. Afficher sur une dalle LCD a partir d'un signal DVI VGA RCA
    Par invitee9312224 dans le forum Électronique
    Réponses: 1
    Dernier message: 15/11/2009, 18h47
  4. RMS d'un signal triangulaire avec offset
    Par invitee2f44b4d dans le forum Électronique
    Réponses: 4
    Dernier message: 16/03/2008, 13h21
  5. FFT et fréquence exacte d'un signal
    Par acx01b dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 09/10/2007, 03h03