[Users-fr] Filtrer des données

classic Classic list List threaded Threaded
4 messages Options
binoyte binoyte
Reply | Threaded
Open this post in threaded view
|

[Users-fr] Filtrer des données

Bonjour,

Je fais face aujourd'hui à une problématique de traitement du signal, ce qui n'est pas du tout ma spécialité. J'ai fait l'acquisition d'un signal qui est assez propre mais quand je le dérive, ça devient inexploitable tant le bruit est important.

Je décide donc de filtrer le signal avant la dérivée en appliquant un filtre passe-bas de type Butterworth ayant une fréquence de coupure de 1/3 F échantillonnage.

Je défini d'abord l'objet filtre `oFiltre` :

    [pols , gain] = zpbutt(ordre, omega_c);
    oFiltre = gain / real(poly(pols,'s'));
    oFiltre.dt='c';


J'applique ensuite ce filtre à mes données :

    num = coeff( numer(oFiltre) );
    den = coeff( denom(oFiltre) );
    filtrees = filter(num, den, donnees);


Les résultats ne sont pas du tout satisfaisants. En comparant avec ce que j'obtiens avec d'autres logiciels, comme Labview par exemple, je constate que les réponses en fréquence des filtres Scilab et Labview sont identiques, mais que les données filtrées sont différentes.

Je pense qu'il y a une erreur dans mon script Scilab, car un détail me dérange. Nul part n’apparaît la fréquence d'échantillonnage. La variable `donnees` n'est qu'un vecteur et la fonction `filter()` n'a aucun moyen pour deviner le pas de temps. Je pense qu'il doit me manquer une mise à l'échelle, à l'instar de la fonction `diff()`

    diff(y,deg) * fs;

Si quelqu'un à des pistes je suis preneur !

Merci d'avance,

Benoît



_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr
babigeon babigeon
Reply | Threaded
Open this post in threaded view
|

Re: Filtrer des données

Bonjour,

Si les réponses en fréquence sont identiques, c'est peut-être en repassant en temps que cela ne va pas.
C'est donc la fft qu'il faut surveiller.
J'ai eu ce problème de fft que j'ai résolu en appliquant les règles standard sur la fréquence d'échantillonnage.
Il est utile de tester la fft sur un créneau par exemple, en vérifiant sa validité par fft inverse
(tu dois obtenir le sinc par fft, et tu dois retrouver le créneau par fft-1)
De plus, si tu affiche les données par plot2d par exemple , la mise à l'échelle doit être gérée aussi.
Cdt
JLuc


Le 10/12/2013 08:24, Binoyte a écrit :
Bonjour,

Je fais face aujourd'hui à une problématique de traitement du signal, ce qui n'est pas du tout ma spécialité. J'ai fait l'acquisition d'un signal qui est assez propre mais quand je le dérive, ça devient inexploitable tant le bruit est important.

Je décide donc de filtrer le signal avant la dérivée en appliquant un filtre passe-bas de type Butterworth ayant une fréquence de coupure de 1/3 F échantillonnage.

Je défini d'abord l'objet filtre `oFiltre` :

    [pols , gain] = zpbutt(ordre, omega_c);
    oFiltre = gain / real(poly(pols,'s'));
    oFiltre.dt='c';


J'applique ensuite ce filtre à mes données :

    num = coeff( numer(oFiltre) );
    den = coeff( denom(oFiltre) );
    filtrees = filter(num, den, donnees);


Les résultats ne sont pas du tout satisfaisants. En comparant avec ce que j'obtiens avec d'autres logiciels, comme Labview par exemple, je constate que les réponses en fréquence des filtres Scilab et Labview sont identiques, mais que les données filtrées sont différentes.

Je pense qu'il y a une erreur dans mon script Scilab, car un détail me dérange. Nul part n’apparaît la fréquence d'échantillonnage. La variable `donnees` n'est qu'un vecteur et la fonction `filter()` n'a aucun moyen pour deviner le pas de temps. Je pense qu'il doit me manquer une mise à l'échelle, à l'instar de la fonction `diff()`

    diff(y,deg) * fs;

Si quelqu'un à des pistes je suis preneur !

Merci d'avance,

Benoît




_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr

--
repons



Jean-Luc BABIGEON
CNRS/Lal/Dacc
Laboratoire de L'accélérateur Linéaire
Centre scientifique d'Orsay - Bat 200 - BP 34
91898 - Orsay Cedex
tel 0164468247 ou 8427 -[hidden email]



_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr
Serge Steer-2 Serge Steer-2
Reply | Threaded
Open this post in threaded view
|

Re: Filtrer des données

In reply to this post by binoyte
Le 10/12/2013 08:24, Binoyte a écrit :
Bonjour,

Je fais face aujourd'hui à une problématique de traitement du signal, ce qui n'est pas du tout ma spécialité. J'ai fait l'acquisition d'un signal qui est assez propre mais quand je le dérive, ça devient inexploitable tant le bruit est important.

Je décide donc de filtrer le signal avant la dérivée en appliquant un filtre passe-bas de type Butterworth ayant une fréquence de coupure de 1/3 F échantillonnage.

Je défini d'abord l'objet filtre `oFiltre` :

    [pols , gain] = zpbutt(ordre, omega_c);
    oFiltre = gain / real(poly(pols,'s'));
    oFiltre.dt='c';


zpbutt produit un filtre analogique (temps continu) et votre signal est discret (echantillonné) il vous faut donc convertir votre filtre en son "équivalent " discret
oFiltred=dscr(oFiltre,1/F)
vous pouvez ensuite appliquer le filtre avec
filtree=flts(donnees,oFiltred);

Pourquoi n'utilisez vous pas directement un filtre discret (voir iir ou eqiir)

Serge Steer
INRIA
J'applique ensuite ce filtre à mes données :

    num = coeff( numer(oFiltre) );
    den = coeff( denom(oFiltre) );
    filtrees = filter(num, den, donnees);


Les résultats ne sont pas du tout satisfaisants. En comparant avec ce que j'obtiens avec d'autres logiciels, comme Labview par exemple, je constate que les réponses en fréquence des filtres Scilab et Labview sont identiques, mais que les données filtrées sont différentes.

Je pense qu'il y a une erreur dans mon script Scilab, car un détail me dérange. Nul part n’apparaît la fréquence d'échantillonnage. La variable `donnees` n'est qu'un vecteur et la fonction `filter()` n'a aucun moyen pour deviner le pas de temps. Je pense qu'il doit me manquer une mise à l'échelle, à l'instar de la fonction `diff()`

    diff(y,deg) * fs;

Si quelqu'un à des pistes je suis preneur !

Merci d'avance,

Benoît




_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr


_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr
binoyte binoyte
Reply | Threaded
Open this post in threaded view
|

Re: Filtrer des données

Le 10 décembre 2013 09:17, Serge Steer <[hidden email]> a écrit :
Le 10/12/2013 08:24, Binoyte a écrit :
Bonjour,


Je fais face aujourd'hui à une problématique de traitement du signal, ce qui n'est pas du tout ma spécialité. J'ai fait l'acquisition d'un signal qui est assez propre mais quand je le dérive, ça devient inexploitable tant le bruit est important.

Je décide donc de filtrer le signal avant la dérivée en appliquant un filtre passe-bas de type Butterworth ayant une fréquence de coupure de 1/3 F échantillonnage.

Je défini d'abord l'objet filtre `oFiltre` :

    [pols , gain] = zpbutt(ordre, omega_c);
    oFiltre = gain / real(poly(pols,'s'));
    oFiltre.dt='c';


zpbutt produit un filtre analogique (temps continu) et votre signal est discret (echantillonné) il vous faut donc convertir votre filtre en son "équivalent " discret
oFiltred=dscr(oFiltre,1/F)
vous pouvez ensuite appliquer le filtre avec
filtree=flts(donnees,oFiltred);

Pourquoi n'utilisez vous pas directement un filtre discret (voir iir ou eqiir)

Parce que là ça dépasse déjà mes compétences. A part les filtres analogiques avec ampli op en TP de prépa, je ne connais pas grand chose d'autre. Je suis plutôt mécanicien de formation. Mais je vais regarder quand même, si ça m'évite quelques lignes dans le script.

Merci pour votre aide et votre réactivité. J'ai réussi à obtenir ce que je souhaitais.

Benoît
 

Serge Steer
INRIA
J'applique ensuite ce filtre à mes données :

    num = coeff( numer(oFiltre) );
    den = coeff( denom(oFiltre) );
    filtrees = filter(num, den, donnees);


Les résultats ne sont pas du tout satisfaisants. En comparant avec ce que j'obtiens avec d'autres logiciels, comme Labview par exemple, je constate que les réponses en fréquence des filtres Scilab et Labview sont identiques, mais que les données filtrées sont différentes.

Je pense qu'il y a une erreur dans mon script Scilab, car un détail me dérange. Nul part n’apparaît la fréquence d'échantillonnage. La variable `donnees` n'est qu'un vecteur et la fonction `filter()` n'a aucun moyen pour deviner le pas de temps. Je pense qu'il doit me manquer une mise à l'échelle, à l'instar de la fonction `diff()`

    diff(y,deg) * fs;

Si quelqu'un à des pistes je suis preneur !

Merci d'avance,

Benoît




_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr


_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr



_______________________________________________
users-fr mailing list
[hidden email]
http://lists.scilab.org/mailman/listinfo/users-fr