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

C++ Discussion :

Filtre passe bas second ordre


Sujet :

C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Filtre passe bas second ordre
    Bonjour,

    Je travail sur un FPGA Actel Fusion et je dois filtré un signal. Je dois donc programmer une équation à récurrence :

    VFiltre(t+2) = [(a + 2b)*VFiltre(t+1)-b*VFiltre(t)+(VNon-Filtre(t+2)]/(1+a+b)

    où ===> b=1/(w0²) ; a=(2*z)/w0) ; w0=0.05*2*Pi ; z=0.1

    Je programme ( j'essaye ) avec SoftConsole. La compilation me donne un fichier .hex qui est mon complément de fichier en VHDL pour la suite du projet.

    Je débute en langage C ( j'ai quelques notions ). J'ai plusieurs difficultés liées à cette équation. Tout d'abord je dois m'adapter à un programme qui à été conçu par une autre personne. Le signal non filtré est appelé Freq et est généré en lisant des valeurs dans une NVM de 32bits

    freq=get_data_nvm(n1-premier_n1) + offsetN2

    Ce signal envoie un mot 32bits à un DDS du type1 415 829 758 tous les 1KHz.
    Ce signal est déclaré en static int dans le programme.

    Pour obtenir dans un sprintf du Freq(t);Freq(t-1);(Freq(t-2) j'ai trouvé cette solution :

    Freq(t-1) = tabtm1[0];

    for (i=0; i<2 ;i++)
    val= freq;
    tabtm1[tm1_n1++] = val;

    if(tm1_n1 == 1)
    tm1_n1 = 0;

    Freq(t-2) = tabtm2[0];

    for (j=0; j<2 ;j++)
    val2= Freq(t-1);

    tabtm2[tm2_n1++] = val2;

    if(tm2_n1 == 1)
    tm2_n1 = 0;

    C'est un peu moche mais par RS232 j'arrive à mettre en évidence du t;t-1;t-2 avec un signal lut sur un gpio.

    Je post en pièce joint le fichier.c avec mon équation de récurrence et les déclarations de variables.

    En réalisant je me suis aperçu que je manipulais des nombres à virgule et je pense que le résultat de l'équation doit être déclaré en unsigned long long car je multiplie une variable int qui est déja codé sur 31 bits.

    Merci de votre aide, ça fait près de 2 semaines qui j'essaye un peu tout.
    Fichiers attachés Fichiers attachés
    • Type de fichier : c isr.c (7,3 Ko, 83 affichages)

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Voici les premières lignes que j'obtiens avec ce programme.

    Freq-non-filtré (t);FreqFiltre(t-1);FreqFiltre(t-2);FreqFiltre(t)

    0;0;0;0
    1485252111;0;0;5185806
    1485252111;0;0;5185806
    1485252111;5185806;0;14944567
    1485252111;5185806;5185806;10353505
    1485252111;14944567;5185806;28717754
    1485252111;10353505;14944567;11438635
    1485251159;28717754;10353505;50061400
    1485251159;11438635;28717754;1287069
    1485252111;50061400;11438635;89265656
    1485253756;1287069;50061400;4258255128
    1485252814;89265656;1287069;172028384
    1485252814;18446744073672839448;89265656;18446744073709551615
    1485252111;172028384;18446744073672839448;9223372039002259456
    1485252814;18446744073709551615;172028384;18446744073709551615
    1485252814;18446744071562067968;18446744073709551615;18382336881577689088
    1485252111;18446744073709551615;18446744071562067968;18382336881577689088
    1485253756;0;18446744073709551615;9223372039002259456
    1485253756;0;0;5185812

    Si tout fonctionne je devrais obtenir un signal qui varie très peu autour de 1485252000

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bon j'ai réussit à me débrouiller, voici les astuces à respecter :

    (1) Déclarer mes variables avant le sous-programme où la fréquence non-filtré est mesuré:

    unsigned int freqfiltre;// fréquence filtrée
    unsigned long long freqfiltre2;// car je suis amené à calculé 587* 1.9millard ( plus de 32bits)
    unsigned int tm1; // tm1 = fréquence filtrée à l'instant t-1
    unsigned int tm2;// j'aurai pu déclarer en int mais bon...

    (2) Ensuite il faut calculer les coefficients a,b et tout ce que l'on peut calculer en manuel et directement les affectés de "ULL " pour que le calcul se fasse sur 64 bits sinon le résultat est erroné.

    freqfiltre2=587ULL*tm1-277ULL*tm2+freq;// freq = freq de départ non filtrée

    (3) Pour obtenir ce résultat filtré dans une variable int, je divise le unsigned long long par mon dernier coefficient qui correspond à ( 1 + a + b )

    freqfiltre=freqfiltre2/311;

    (4) pour le décalage pour obtenir tm1 et tm2 on m'a conseillé de faire comme cela ( tout simplement... ) :

    tm2=tm1;
    tm1=freqfiltre;

    Pour info j'ai prit z=1 et w0= 0.01*2*Pi dans la formule. J'ai diminué mon bruit par 2 sur mon produit.

    En espérant que cela aide quelqu'un un jour.
    JB

Discussions similaires

  1. filtre passe bas ordre 1
    Par Kiryuu dans le forum Calcul scientifique
    Réponses: 1
    Dernier message: 27/10/2011, 16h38
  2. Filtre passe bas
    Par vinzzzz dans le forum Traitement d'images
    Réponses: 8
    Dernier message: 26/02/2007, 14h51
  3. Filtre passe bas et filtre de peigne
    Par jena dans le forum Signal
    Réponses: 8
    Dernier message: 04/02/2007, 16h53
  4. Classe filtre passe-bas
    Par nostub dans le forum Multimédia
    Réponses: 1
    Dernier message: 24/12/2006, 18h20
  5. Lire un son WAVE + filtre passe BAS/HAUT
    Par selmak7 dans le forum C++Builder
    Réponses: 2
    Dernier message: 15/08/2006, 14h45

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