Filtrage par FFT puis FFT inverse dans Matlab
Répondre à la discussion
Affichage des résultats 1 à 4 sur 4

Filtrage par FFT puis FFT inverse dans Matlab



  1. #1
    fiatlux

    Filtrage par FFT puis FFT inverse dans Matlab


    ------

    Bonjour,

    Admettons que j'ai un filtre à réponse impulsionnelle infinie (coefficients "b" et "a"). Je souhaiterais filtrer un signal réel comme le fait la fonction "filter" de Matlab mais en passant par la FFT et l'IFFT. J'ai donc fait ça:
    Code:
    NFFT = length(signal);
    TFsignal = fft(signal, NFFT);
    RepFreqFiltre = freqz(b,a,NFFT);
    TFsignalFiltre = TFsignal .* RepFreqFiltre;
    signalFiltre = ifft(TFsignalFiltre, NFFT);
    Et là le problème c'est que mon signal filtré "signalFiltre" est complexe, alors que j'aimerais un signal réel, comme mon signal de départ. La fonction "filter" me renvoie d'ailleurs un signal réel. Pourquoi ? Qu'est-ce que je fais de faux ?
    Merci d'avance pour toute aide !

    PS: Je trouve d'ailleurs "logique" que le signal soit complexe, puis la réponse fréquentielle de mon filtre "RepFreqFiltre" n'est pas symétrique par rapport à l'origine, donc je conçois bien qu'en multipliant la fft de mon signal "TFsignal" par "RepFreqFiltre" j'obtiens quelque chose de non-symétrique, et donc un signal filtré qui n'est pas réel. Mais du coup, comme se retrouver avec un signal réel quand la réponse fréq du filtre n'est pas symétrique?...
    PS2: en mettant l'option "symmetric" à la dernière ligne:

    Code:
    signalFiltre = ifft(TFsignalFiltre, NFFT, 'symmetric');
    j'obtiens du coup un signal réel, mais pas le même qu'avec "filter"... Et comme j'ai compris, l'option "symmetric" ignore la partie imaginaire, donc c'est pas la solution non plus....

    -----
    La pie niche-t-elle haut ? Oui, la pie niche haut.

  2. #2
    fiatlux

    Re : Filtrage par FFT puis FFT inverse dans Matlab

    Quelqu'un ?
    La pie niche-t-elle haut ? Oui, la pie niche haut.

  3. #3
    inviteb9f49292

    Re : Filtrage par FFT puis FFT inverse dans Matlab

    Je n'ais pas l'habitude de freqz, et plus vraiment au fait des relations espaces des z, fréquences, temps. Néanmoins, je sais que le spectre multiplicatif à utiliser pour filtrer est bien le spectre de la réponse impulsionnelle du filtre, voici un bout de code qui fait donc ce que tu veux à ma manière:
    Code:
    % le signal x est un chirp linéaire de 100Hz à 10kHz entouré de 500ms de blanc, échantillonné à 48kHz
    fs=48000;
    t = (0:fs-1)'/fs;
    s = chirp (t, 100, t(end), 10000);
    x = [zeros(fs/2, 1); s; zeros(fs/2, 1)];
    
    % filtre passe-bande 1kHz - 5kHz
    [b, a] = butter (4, [1000, 5000]/fs);
    
    % réponse impulsionnelle du filtre
    h = filter (b, a, [1; zeros(length(x)-1, 1)]);
    
    % comparaison
    y = filter(b, a, x);
    z = real (ifft (fft(x).*fft(h)));
    plot (y-z)
    Je pense que la tf inverse n'est pas réelle à cause des erreurs d'arrondis dans le calcul de la FFT qui fait que le spectre de la réponse impulsionnelle n'est plus symétrique/anti-symétrique ou quelque chose de ce goût là, en effet si tu fais ifft(fft(h)) tu tomberas déjà sur un signal complexe dont les parties imaginaires sont négligeables devant la partie réelle.

    Il ne faut pas perdre de vue que lorsque on parle de FFT ce n'est qu'une l'approximation de la transformée de fourier théorique (ne srait-ce qu'à cause de la précision limitée des calculs)...

  4. #4
    fiatlux

    Re : Filtrage par FFT puis FFT inverse dans Matlab

    Merci beaucoup
    Je n'avais pas pensé à calculer la réponse fréquentielle du filtre à partir de la réponse impulsionnelle comme tu l'as fait. Et ça change tout, car le coupable (oui c'est moi en fait mais bon) c'est freqz. Après moult bidouillage j'ai compris le problème qu'il y avait. Il "suffisait" (c'est toujours plus simple quand on sait ) de faire ça:
    Code:
    RepFreqFiltre = freqz(b,a,NFFT,'whole');
    au lieu de ça:
    Code:
    RepFreqFiltre = freqz(b,a,NFFT);
    En faisant "whole" on considère tout le cercle unité, alors que par défaut freqz ne considère que la moitié supérieure (fréquences de 0 à fs/2), d'où le spectre non-symétrique...
    Encore merci!
    La pie niche-t-elle haut ? Oui, la pie niche haut.

  5. A voir en vidéo sur Futura

Discussions similaires

  1. filtrage sous matlab
    Par invite9c7554e3 dans le forum Programmation et langages, Algorithmique
    Réponses: 5
    Dernier message: 11/05/2013, 11h31
  2. Filtrage des données sous matlab ??
    Par invitebe5b0d57 dans le forum Programmation et langages, Algorithmique
    Réponses: 0
    Dernier message: 23/05/2012, 14h31
  3. un peu de filtrage numérique avec matlab
    Par fouga dans le forum Électronique
    Réponses: 0
    Dernier message: 18/04/2011, 14h01
  4. reconstitution d'image par filtrage de wiener matlab
    Par invitea58b9c08 dans le forum Logiciel - Software - Open Source
    Réponses: 0
    Dernier message: 29/10/2009, 14h14
  5. Probleme de filtrage avec Matlab
    Par invite9c8819a7 dans le forum Électronique
    Réponses: 2
    Dernier message: 16/05/2009, 17h32