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 :

Appliquer un filtre passe-bande à un son .wav


Sujet :

Signal

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 26
    Points : 21
    Points
    21
    Par défaut Appliquer un filtre passe-bande à un son .wav
    Bonjour,

    Je souhaite réaliser un filtre passe-bande sur son .wav, écouter la musique avant et après filtrage pour voir la différence tout en agrémentant le programme de courbes de réponses fréquentielle et autres...

    J'ai du mal à réaliser le filtre proprement dit. J'ai essayé avec filter, puis fir1 mais je ne sais pas trop comment faire au final.

    Voila ou en est rendu mon code pour l'instant :
    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
    clear
    clc
    [x,Fe,Nbits]=wavread('Light_My_Fire.wav');  %On importe le fichier audio
    Fe      %Fréquence d'échantillonnage 
    Nbits   %Nombre de bits
    g = x(:,1); %voie gauche = toutes les lignes, colonne 1
    d = x(:,2); %voie droite = toutes les lignes, colonne 2
    col=['r','g','b'];
    subplot(3,1,1)
    plot(g), hold on %On affiche l'enveloppe du signal audio de la voie gauche
    title('Signal audio voie gauche','FontSize',16);
    grid on;
    subplot(3,1,2)
    plot(d), hold on %On affiche l'enveloppe du signal audio de la voie gauche
    title('Signal audio voie droite','FontSize',16);
    grid on;
    subplot(3,1,3)
    plot(x), hold on %On affiche l'enveloppe du signal audio de la voie gauche
    title('Signal audio en entier','FontSize',16);
    grid on;
     
     
     
    %sound(g,Fe) %restituer le son de la voie gauche
    %sound(d,Fe) %restituer le son de la voie droite
    %sound(x,Fe) %restituer tout le son
     
    figure
    z=fft(x);
    title('Transformé de Fourier du signal','FontSize',16);
    grid on;
     
     
    %Appliquons lui maintenant un filtre passe-bande
     
    wn=2*2*[1e3 2e3]/Fe
    y=fir1(2,wn);   %Filtre d'ordre 2
    figure
    freqz(y,1);
    title('Réponse fréquentielle du signal filtré','FontSize',16);
    grid on;
    figure
    impz(1,y);
    title('Réponse impulsionnelle du signal filtré','FontSize',16);
    grid on;
    Avez-vous des remarques, est-ce que mon filtre est bon?

  2. #2
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonjour.
    Je te propose ces modifications :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    figure(2)
    z=fft(x);
    title('Transformé de Fourier du signal','FontSize',16);
    plot(abs(z(1:length(z)/2)))
    grid on;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    y=fir1(48,wn);   %Filtre d'ordre 2
    Les filtres à réponse impulsionnelle finie nécessitent un ordre élevé.
    Après si tu veux filtrer le signal par un passe-bande tu fais (avec n pair) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [num,den]=butter(n,[f1 f2]/(Fe/2))
    x_filt=filter(num,den,x)

  3. #3
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    Super!

    ça marche très bien avec le filtre butterworth.
    Par contre avec fir1 ça ne fonctionne pas, en même temps c'est logique parce que mon signal d'entrée x n'intervient pas du tout dans la fonction fir1

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    wn=2*2*[1e3 2e3]/Fe;
    y=fir1(48,wn);   %Filtre d'ordre 48
    sound(y,Fe)
    Comment faire?

    Merci

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    Bonjour.
    Par contre avec fir1 ça ne fonctionne pas
    La primitive "fir1" ne filtre pas mais permet la synthèse du filtre RIF (ou RII).
    Exemple (en fréquences normalisées):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    clear
    num=fir1(48,[0.3 0.7]);
    freqz(num,1,512);
    C'est-à-dire calcule Gain et Phase du filtre (mais pas la fonction de transfert.
    C'est pourquoi je t'ai conseillé Butterworth.
    Tu peux aussi utiliser "filter":

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    D'accord je comprend mieux. Merci

    Je m'éloigne un peu du sujet maintenant mais comme l'amplitude et la phase donne des courbes assez moches (à cause du fait que l'ordre fir1 soit à 48), j'essaye d'ajouter une courbe de tendance avec le Basic fitting mais j'ai vraiment du mal et l'aide Mathwork ne m'avance pas trop.

    Encore un coup de main?

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Points : 2 841
    Points
    2 841
    Par défaut
    une courbe de tendance
    Qu' as-tu programmé ?

  7. #7
    Membre à l'essai
    Inscrit en
    Décembre 2008
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 26
    Points : 21
    Points
    21
    Par défaut
    ben c'est sur la courbe de la réponse fréquentielle c'est pas joli c'est la dessus que je veux mettre une courbe de tendance mais je vois pas comment fonctionne le Basic Fitting (quel paramètre sélectionner(cubic,4éme ordre...) par exemple)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. calcul du temps de réponse d'un filtre passe bande
    Par Asturias1 dans le forum Signal
    Réponses: 8
    Dernier message: 13/07/2009, 11h37
  2. Filtre passe bande
    Par vanhelsing69 dans le forum Signal
    Réponses: 8
    Dernier message: 17/12/2008, 18h01
  3. Chargement de fichiers et filtre passe bande
    Par Caroline_1 dans le forum Signal
    Réponses: 12
    Dernier message: 13/12/2008, 22h29
  4. Filtre passe bande
    Par zinzaf dans le forum LabVIEW
    Réponses: 2
    Dernier message: 15/06/2008, 09h55
  5. Filtre passe Bande
    Par Mau dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 28/06/2002, 17h03

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