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

Scilab Discussion :

Eliminer des bandes d'un signal wav


Sujet :

Scilab

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 28
    Points
    28
    Par défaut Eliminer des bandes d'un signal wav
    bonjour,

    J'aurais des questions sur cette discussions : Eliminer des bandes d'un signal wav
    qu'est ce que ça veux dire des bandes critiques? (sur un signal .wav)
    Phryte, si je veux tester votre code sur scilab, est ce je change "ifft" par "fft" ou il y a d'autre changement à faire?
    merci pour ce forum.

  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.
    ifft marche très bien :
    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
    fe=200;t=(1:fe)/fe;
    [nr,nc]=size(t);
    x1 = 0.5*sin(2*%pi*t*5)+0.5*rand(1,nc); 
    x2 = sin(2*%pi*t*50)+0.5*rand(1,nc);
    x3 = sin(2*%pi*t*40)+0.5*rand(1,nc);
    //signal somme
    xtot = x1+x2+x3;Nx = length(xtot);
    set("current_figure",1)
    plot(t,xtot)
    tf=fft(xtot);
    w=(0:Nx-1)/Nx*fe;
     set("current_figure",2)
    plot(w,abs(tf(1:Nx)));
    plot([0 30 30 60 60 140 140 170 170 Nx],[40 40 150 150 40 40 150 150 40 40],'color','r')
    xgrid()
    xlabel('fréquences en Hz')
    for i=1:Nx;
       g(i)=tf(i)*heavi(abs(tf(i))-seuil(i,Nx));
    end
     set("current_figure",3)
    i=1:Nx;
    plot(i,g(i));xgrid()
    //Calcul des signaux par transformé inverse
    s=ifft(g);
    set("current_figure",4)
    plot(t,s);

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 28
    Points
    28
    Par défaut
    Phryte, merci pour votre aide.
    je n'ai pas encore tester votre code, j'ai besion de savoir quelles sont les bandes critiques sur un signal ".wav" SVP.
    et quelle est la différence entre "ifft" et "fft".

  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
    fft est la transformée de fourier (temps -> fréquence)
    ifft est la transformée inverse (fréquence -> temps)
    On peut ainsi en travaillant sur le spectre faire du filtrage.
    Bandes critiques. On en parle un peu là :
    http://deptinfo.cnam.fr/Enseignement...M/audionum.pdf

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 28
    Points
    28
    Par défaut
    bonjour tout le monde,
    Phryte, votre code marche tres bien.
    j'ai voulez faire la meme chose sur un signal .wav 44.1 k ech/s. (enlever des fréquence et laisser des autres).
    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
    46
    47
    48
    49
     
    n1=50000;
     
    [y,fs]=wavread('Bureau/z.wav',n1);
    t=(1:fs)/fs;
    rs=y(1,:);
    set("current_figure",1)
    plot2d(rs)
    Ny =1323;// length(rs);
    tf2=fft(rs,-1);
    w2=(0:Ny-1)/Ny*fs;
    set("current_figure",2)
    plot(w2,abs(tf2(1:Ny)));
    plot([0 2500 2500 40000 40000 45000],[200 200 400 400 200 200],'color','r')
    xgrid()
     
    function s=seuil1(n,N)
    plage=[200 0;400 2500;200 40000];
    if n>=plage(1,2)
        s=plage(1,1);
    end
    if n>=plage(2,2)
        s=plage(2,1);
    end
    if n>=plage(3,2);
        s=plage(3,1);
    end
     
    endfunction
     
    function v=heavi(x)
     if x<=0
         v=0;
     else
         v=1;
     end
    endfunction
    Nz=45000;
    for i=1:Nz;
       g(i)=tf2(i)*heavi(abs(tf2(i))-seuil1(i,Nz));
    end
     set("current_figure",3)
    i=1:Nz;
    plot(i,g(i));
    xgrid()
    //Calcul des signaux par transformé inverse
    s=ifft(g);
    set("current_figure",4)
    plot(t,s);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     error 17
     stack size exceeded 
    plot(t,s)
    je prend Ny = 1323 parce que j'ai trouvé sur internet qu'il faut prendre 30ms maximum d'un signal audio pour faire la fft ( je ne c'est pas pourqu'oi) et comme mon signal echantillonné a 44.1 khz donc 44100*0.03=1323 echantillon.
    figure 1 c'est bon
    figure 2 c'est bon
    figure 3 j'ai un zéro
    figure 4 s'affiche pas
    qu'est ce que je doit faire SVP?

  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
    Bonjour.
    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
    y,fs]=wavread('bonjour.wav');
    t=(1:fs)/fs;
    rs=y(1,:);
    set("current_figure",1)
    plot2d(rs)
    xgrid()
    Ny =1323;
    tf2=fft(rs);
    w2=(0:Ny-1)/Ny*fs;
    set("current_figure",2)
    plot(w2,abs(tf2(1:Ny)));
    plot([0 2500 2500 22050 22050],[200 200 400 400 200],'color','r')
    xgrid()
    for i=1:Ny;
       g(i)=tf2(i)*heavi(abs(tf2(i))-seuil2(i,Ny));
    end
     set("current_figure",3)
    i=1:Ny;
    plot(i,g(i));
    xgrid()
    //Calcul des signaux par transformé inverse
    s=ifft(g);
    set("current_figure",4)
    plot(t(1:length(s)),s);
    xgrid()

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 28
    Points
    28
    Par défaut
    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
    46
    47
     n1=100000;
    [y,fs]=wavread('Bureau/z.wav',n1);
    t=(1:fs)/fs;
    rs=y(1,:);
    set("current_figure",1)
    plot2d(rs)
    Ny =1323;// length(rs);
    tf2=fft(rs,-1);
    w2=(0:Ny-1)/Ny*fs;
    set("current_figure",2)
    plot(w2,abs(tf2(1:Ny)));
    plot([0 5000 5000 40000 40000],[300 300 900 900 300],'color','r')
    xgrid()
     
    function s=seuil1(n,N)
    plage=[300 0;900 5000;300 45000];
    if n>=plage(1,2)
        s=plage(1,1);
    end
    if n>=plage(2,2)
        s=plage(2,1);
    end
    if n>=plage(3,2);
        s=plage(3,1);
    end
     
    endfunction
     
    function v=heavi(x)
     if x<=0
         v=0;
     else
         v=1;
     end
    endfunction
     
    for i=1:Ny;
       g(i)=tf2(i)*heavi(abs(tf2(i))-seuil1(i,Ny));
    end
     set("current_figure",3)
    i=1:Ny;
    plot(i,g(i));
    xgrid()
    //Calcul des signaux par transformé inverse
    s=ifft(g);
    set("current_figure",4)
    plot(t(1:length(s),s);
    toujour figure 4 ne s'affiche pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     plot(t(1:length(s),s);  error 21 index invalid
    voici les figures
    figure 1 : signal d'origine
    figure 2 : la fft
    figure 3 : aucune idée
    avez vous une idée et une explication SVP?

  8. #8
    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
    La parenthèse !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    plot(t(1:length(s)),s);
    La figure 3 représente le spectre corrigé ::
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    set("current_figure",3)
    i=1:Ny;
    plot(w2,abs(g(i)));

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 28
    Points
    28
    Par défaut
    merci,
    pourquoi a votre avis j'obtient presque le meme signal d'origne?

  10. #10
    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.
    ourquoi a votre avis j'obtient presque le meme signal d'origne?
    Il faut mettre dans seuil1 le même gabarit que dans le plot.

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juillet 2009
    Messages
    58
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2009
    Messages : 58
    Points : 28
    Points
    28
    Par défaut
    par Phryte
    Il faut mettre dans seuil1 le même gabarit que dans le plot.
    seuil1 ou plage?

  12. #12
    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
    function s=seuil1(n,N)
    plage=[200 0;400 2500;200 40000];
    Il faut que plage corresponde au gabarit tracé dans le plot que tu as défini.

Discussions similaires

  1. Eliminer des bandes d'un signal wav
    Par ammoula1 dans le forum Signal
    Réponses: 9
    Dernier message: 02/06/2009, 08h45
  2. Elimination des doublons
    Par amika dans le forum Requêtes
    Réponses: 8
    Dernier message: 05/11/2005, 09h28
  3. Elimination des doublons
    Par bilalove dans le forum Oracle
    Réponses: 3
    Dernier message: 11/08/2005, 13h53
  4. Réponses: 4
    Dernier message: 12/04/2005, 19h51
  5. Eliminer des Doublon dans une Table
    Par Soulama dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 03/02/2005, 14h27

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