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 :

Filtre et fusion de pulses


Sujet :

Signal

  1. #1
    Membre régulier Avatar de Alex3434
    Homme Profil pro
    Docteur / Ingénieur R&D
    Inscrit en
    Juillet 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Docteur / Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 66
    Points : 76
    Points
    76
    Par défaut Filtre et fusion de pulses
    Bonjour à toute la communauté,

    Je viens vers vous car je suis actuellement face à un petit problème de filtrage. Pour vous exposer mon problème, je vous propose de m'appuyer sur l'image en pièce jointe.

    Je possède un signal comme représenté dans la figure a). Ce signal correspond à une succession de pulses (de largeur égale à 1ps) qui sont répétés tous les 10 ns. Je souhaiterai (à l'aide d'un filtre de type RC ou autre) convertir deux pulses successifs en un seul créneau de largeur égale à 10ns + 1ps comme représenté sur la figure b).

    Je sais qu'il serait possible de réaliser cette transformation à l'aide d'un algorithme détectant les pulses, mais je souhaite savoir s'il est possible de réaliser cette transformation à partir d'un filtre que je placerai à la sortie de mon générateur de pulses.

    Voici un bout de code que j'ai réalisé pour appliquer un filtrage à mon signal de départ, malheureusement je ne vois pas de modification sur l'allure du signal après filtrage :

    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
    clc
    clear all
    close all
     
    %% Générations de deux pulses 
    fs = 10^12;
    t = 0:1/fs:11*10^-9;
    t_pulse = 0.2*10^-9 + [0 10*10^-9];
     
    signal = zeros(1,length(t));
    signal_out = zeros(1,length(t));
    t_pulse_algo = t_pulse;
    ok = 0;
    for ii = 1:length(t)
     
        if ~isempty(t_pulse_algo) && (abs(t(ii) - t_pulse_algo(1)) < 10^-20)
            signal(1,ii:ii+1) = 1;
            t_pulse_algo(1) = [];
            ok = 1;
        end
     
        if isempty(t_pulse_algo)
            ok = 0;
        end
     
        if ok 
           signal_out(1,ii) = 1; 
        end
     
    end
     
    %% Filtrage
     
    fc = 100*10^6; % Fréquence de coupure du filtre
    Wn = (2/fs)*fc;
     
    b = fir1(4,Wn,'low');
     
    fvtool(b,1,'Fs',fs)
     
    y = filter(b,1,signal);
     
    plot(t,signal,'b',t,y,'r*')
    xlabel('temps (s)')
    legend('signal','signal filtré')
    Nom : pulses.png
Affichages : 283
Taille : 4,9 Ko

    Merci d'avance

  2. #2
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2019
    Messages : 90
    Points : 254
    Points
    254
    Par défaut
    Bonjour,

    La demande n'est pas claire : s'agit-il de faire une traitement hard (tu parles de filtre RC, de générateur de signal), ou logiciel, sur Matlab ?
    Quel générateur physique est capable de délivrer des impulsions de 1 ps (soit une bande passante de près de 1 THz) à 100 MHz ?

    Quoi qu'il en soit, je ne vois pas comment répondre à la problématique avec un simple filtre.

    En Matlab, cela pourrait donner qqch comme :
    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
     
    % *** init ***
    clear
     
    fs = 1e13 ; % sampling frequency
    t0 = [1e-9, 10e-9] ; % list of the times att which the first pulse starts
    deltaT = 1000e-12 ; % pulse duration
    expected_pulse_length = 2000e-12 ; % expected pulse duration. This must be longer than the actual pulse but shorter than deltaT
     
    Vhigh = 1 ; % On-state value of the signal 
     
    threshold_value = Vhigh/2 ;
     
    % *** time vector ***
    t = 0:1/fs:12e-9 ; % time vector
     
    % *** build input signal ***
    signal_in = 0*t ; % init output signal
    for k=1:length(t0) % for each pulse
        index_high = t>t0(k) & t<=t0(k)+deltaT ; % indexes of the samples corresponding to the k^th pulse
        signal_in(index_high) = Vhigh ; % form the first pulse
    end
     
    % *** build output signal ***
    index_start = find(signal_in > threshold_value, 1) ; % index of the first element of signal_out with value greater than threshold_value
    mask_signal = t > t(index_start) + expected_pulse_length ; % this is equal to 1 
    maskedSignal = signal_in.*mask_signal ; % input signal with the first pusle set to zero
    index_stop = find(maskedSignal > threshold_value, 1) ; % index of the first element of signal_out with value greater than threshold_value, after the first pulse
     
    signal_out = 0*t ; % init output vector ;
    signal_out(index_start:index_stop) = 1 ; % the output signal should be "high" between the two indices
     
    % *** plot ***
    figure ; 
    subplot(411) ; 
    plot(t, signal_in) ; title('Input signal')
    subplot(412) ; 
    plot(t, mask_signal) ; title('Mask')
    subplot(413) ; 
    plot(t, maskedSignal) ; title('Masked input signal = [input signal]\cdot [mask]')
    subplot(414) ; 
    plot(t, signal_out) ; title('Output signal')
    J'ai allongé la durée des pulses pour rendre le résultat plus lisible :
    Nom : mat1.jpg
Affichages : 257
Taille : 22,3 Ko
    Il serait possible de réaliser un second masquage pour ajouter la durée du second pulse au signal de sortie.

  3. #3
    Membre régulier Avatar de Alex3434
    Homme Profil pro
    Docteur / Ingénieur R&D
    Inscrit en
    Juillet 2014
    Messages
    66
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Docteur / Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2014
    Messages : 66
    Points : 76
    Points
    76
    Par défaut
    Bonjour Antoane,

    Tout d'abord merci beaucoup pour votre réponse.

    En effet il s'agit bien d'une solution hard dont je suis à la recherche. La forme de la réponse impulsionnelle d'un filtre RC me laissait penser qu'il était possible "d'élargir" les pulses de telle sorte à obtenir une porte englobant les deux pulses. Malheureusement, en essayant plusieurs fréquences de coupures, je n'ai pas réussi à modifier le signal d'entrée.

    Une petite question pour vérifier que j'utilise correctement la fonction "fir1" : Le calcul de Wn s'écrit il ainsi ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fc = 100*10^6; % Fréquence de coupure du filtre
    Wn = (2/fs)*fc;
    Car j'ai aussi vu cette écriture :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    fc = 100*10^6; % Fréquence de coupure du filtre
    Wn = fc/(2/fs);

  4. #4
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2019
    Messages
    90
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2019
    Messages : 90
    Points : 254
    Points
    254
    Par défaut
    Bonjour,

    Je doute que ce forum soit le plus adapté pour répondre à une question hardware. Je ne sais pas s'il existe une autre section du forum qui conviendrait, ni ne connais la politique de dvp.net vis à vis de la pub pour les forums concurrents (éventuellement par MP) :p

    Quels sont les durées et fréquences effectivement en jeu ? je demeure sceptique quant aux pulses de 1 ps. A ces fréquences, il n'est pas envisageable d'utiliser des filtres RC discrets, les éléments parasites étant dominants. Je ne suis pas spécialiste de ce qui se passe au delà de quelques dizaines de MHz. Néanmoins, en électronique au delà de ~100 MHz, on utilise des composants distribués, éventuellement/généralement réalisés en technologie PCB (stub, etc.). Je doute cependant qu'on puisse aller au delà d'une centaine de GHz avec ces technologies.

    Dans fir1(n, Wn) :
    Wn: Frequency constraints, specified as a scalar, a two-element vector, or a multi-element vector. All elements of Wn must be strictly greater than 0 and strictly smaller than 1, where 1 corresponds to the Nyquist frequency: 0 < Wn < 1. The Nyquist frequency is half the sample rate or π rad/sample.
    Il s'agit donc de la fréquence de coupure du filtre fc normalisée (i.e. divisée) par la fréquence de Niquist, i.e. par la moitiée de la fréquence d'échantillonnage :
    Wn = fc / (fs/2) = 2*fc/fs = (2/fs)*fc = fc*2/fs
    Wn est adimensionné alors que Wn = fc/(2/fs) à la dimension du carré d'une fréquence.

    Pour tester une fonction inconnue, il peut être intéressant de se placer dans un cas cannonique, par exemple avec un signal carré en entrée du filtre :
    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
     
    f = 1e3 ;
    fs = 1e5 ;
    % *** time vector *** 
    t = 0:1/fs:10/f ; % time-vector : 10periods
    t(end) = [] ; % remove last point for periodisation
     
    % *** input signal ***
    x = sin(2*pi*f*t) ; % input signal : sinewave
    y = (x>0) + 0.5 ; % input signal : sqauer wave
    fgh(t,x)
     
    % *** filter design ***
    fc = 2e3 ; % Fréquence de coupure du filtre
    Wn = (2/fs)*fc;
     
    b = fir1(64,Wn,'low');
     
    fvtool(b,1,'Fs',fs)
     
    z = filter(b,1,y);
     
    figure, 
    plot(t,[y;z])

Discussions similaires

  1. Réplication de fusion/web/filtre dynamique
    Par umlrookie dans le forum Réplications
    Réponses: 0
    Dernier message: 20/10/2009, 20h09
  2. recherche filtre flou gaussien
    Par gimlithedwarf dans le forum Langage
    Réponses: 4
    Dernier message: 01/08/2002, 22h32
  3. TADOTable et filtre
    Par GaL dans le forum C++Builder
    Réponses: 16
    Dernier message: 02/07/2002, 16h52
  4. Filtre passe Bande
    Par Mau dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 28/06/2002, 17h03
  5. Probleme de filtre dans bdd
    Par scorpiwolf dans le forum C++Builder
    Réponses: 2
    Dernier message: 04/06/2002, 10h43

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