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 :

Jouer des sons


Sujet :

Signal

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Jouer des sons
    bonjour,

    J'aimerais jouer un son a l'aide de matlab. Je ne sais pas comment faire.
    Je dispose d'un fichier excel, dans une colonne j'ai des fréquences échantillonnées tous les 4 Hz de 0-10000 Hz, dans l'autre j'ai leur amplitude en décibel.
    Faut-il d'abord utiliser une fft pour passer du frequentiel au temporel?
    Faut-il passer du discret au continu?

    je ne sais vraiment pas comment faire.
    Merci de votre aide!!

    Christophe

  2. #2
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    Par défaut
    Bonjour,

    puisque les frequences sont echantillonées chaque 4 Hz, donc ca donne dans le domaine tomporel un signal périodique de periode 1/4=0.25 s (c'est la decompositions en serie de fourier), donc pour retourner en domaine tomporel vous utilisez:
    _
    \
    /_ a(f)*cos(2*pi*f*t) ; ou a(f) sont les amplitudes en fonction de f(frequence)

    je vous propose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    clear
    N=xlsread('nom.xls');
    f=N(:,1);
    A_db=N(:,2);
    A=10.^(A_db/20);
    t=(1:100)/200;
    x=cos(2*pi*f*t);
    for i=1:length(A);
        x(i,:)=A(i)*x(i,:);
    end
    y=sum(x);
    subplot(2,1,1);plot(f,A)
    subplot(2,1,2);plot(t,y)
    MATLAB 7.4 (R2007a) WIN XP SP2
    -------------------------------------

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Ok, merci beaucoup pour cette réponse.
    Pour tout ce qui est de la visualisation, il n'y a plus de pb.

    Mais j'ai encore des difficultés à jouer le son. J'ai des soucis sur la fréquence d'échantillonnage. Je ne sais pas vraiment comment choisir cette fréquence.
    En plus, dans l'aide, il faut que la fonction que l'on veut "écouter" soit comprise entre -1 et 1, ce qui n'est vraiment pas le cas. Comment dois-je faire?

    Merci encore pour votre aide!

  4. #4
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    Par défaut
    Bonjour,

    Etant donné que votre signal s'etale en domaine fréquenciel jusqu'à la fréquence Fmax=10000 Hz =10 kHz, donc la fréquence d'echantillonage doit etre superieur ou egale au 2*Fmax=20 KHz (theoreme de Shanon).
    Puisque votre signal va etre periodique, vous pouvez le generer sur une periode ( T=0.25 s ), et puis refaire les meme valeurs de vecteur plusieur fois : y=[ y y y y y y y];
    pour que les valeurs de y ne depassent pas -1 ou 1, il suffit de deviser tout sur max(abs(y));
    voila comment faire:
    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
     
    clear
    N=xlsread('nom.xls');
    f=N(:,1);
    A_db=N(:,2);
    A=10.^(A_db/20);
    F_ech=20000;
    t=(1:.25*F_ech)/F_ech;
    x=cos(2*pi*f*t);
    for i=1:length(A);
        x(i,:)=A(i)*x(i,:);
    end
    y=sum(x);
    y=y/(max(abs(y));
    y=[y y y y y y y]; % 7 periodes
    wavplay(y,F_ech);
    MATLAB 7.4 (R2007a) WIN XP SP2
    -------------------------------------

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup, le problème n'est pas loin d'être résolu!

    Tout m'a l'air bon, il reste encore un pb au niveau de l'écoute.
    En effet, la solution que vous proposez est de créer un vecteur avec 7 périodes par exemple. Le pb, c'est que lorsqu'on écoute le son associé, on entend comme un marteau-piqueur. Il y a un minusucule temps de pause entre 2 périodes, d'où cette impression.Dans notre cas, ca fait comme un marteau-piqueur donnant 7 coups. Je sais pas si vous me suivez.

    Peut-être qu'en jouant sur "t" on pourrait remédier à ce pb?
    Je sais pas si vous avez une idée?

    Merci encore!

  6. #6
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    Par défaut
    Bonjour,

    Je comprend de ca que votre signal n'est pas périodique d'origine, dans ce cas vous enlevez la répétition ( y=[y y y .....] ), et vous n'aurez qu'un signal de durée de 0.25 s à ecouter.
    j'ai remarqué que le programme prend beaucoup de temps pour l'execution à cause de la boucle, donc ca sera mieu d'utiliser le ifft(). voila le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    clear
    N=xlsread('nom.xls');
    f=N(:,1);
    A_db=N(:,2);
    A=10.^(A_db/20);
    F_ech=20000;
    t=(1:.25*F_ech)/F_ech;
    y=ifft(A,length(t),'symmetric');
    y=y/(max(abs(y));
    wavplay(y,F_ech);
    MATLAB 7.4 (R2007a) WIN XP SP2
    -------------------------------------

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    J'ai essayé avec votre nouvelle proposition, mais là ca ne marche plus du tout.
    J'ai un problème de définition de la fonction ifft(), il ne reconnait pas 'symmetric' comme une DIM.

    Je n'ai effectivement pas de phénomène périodique, mais j'aimerais le périodiser.

    Une dernière idée?? On n'est pas loin pourtant je pense...

    Merci encore

  8. #8
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    Par défaut
    Bonjour,

    Pour le probleme de ifft(), peut etre que ca depend de la version.
    Pour enlever l'effet de pause entre deux periode, la seule solution que je trouve est de la faire manuellement, c-à-d, avant de faire la repetition (y=[y y y ..]), essayez de localiser le scilence (par affichage plot), ensuite l'enlever.
    MATLAB 7.4 (R2007a) WIN XP SP2
    -------------------------------------

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2007
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Ok, j'ai essayé ca mais c'est pas évident de localiser le silence.

    Est-ce que ca serait pas plus simple de jouer sur la variable "t". Est-ce qu'en augmentant sa longueur on aurait pas un son qui dure plus longtemps??

    Merci

  10. #10
    Membre éprouvé
    Avatar de rostomus
    Homme Profil pro
    Doctorant électronique et traitement du signal
    Inscrit en
    Décembre 2006
    Messages
    791
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant électronique et traitement du signal

    Informations forums :
    Inscription : Décembre 2006
    Messages : 791
    Points : 1 205
    Points
    1 205
    Par défaut
    Bonjour,

    Si vous augmentez la variable "t" de 0.25 à 0.5 ( 2 fois), ca sera la meme chose que faire y=[y y]; c.à.d faire une répetition, et vous aurez le meme probleme que precedement.
    postez le fichier .xls, si ca ne vous derange pas.
    MATLAB 7.4 (R2007a) WIN XP SP2
    -------------------------------------

Discussions similaires

  1. [Audio] [javax.sound]ou[MIDI]Jouer des sons "à la volée"
    Par Claythest dans le forum Multimédia
    Réponses: 8
    Dernier message: 12/12/2008, 16h12
  2. jouer des sons tout en jouant
    Par Mo_Poly dans le forum Multimédia
    Réponses: 6
    Dernier message: 12/03/2007, 09h29
  3. [VB.Net 2003] jouer des sons
    Par damned3 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 02/12/2006, 05h30
  4. Comment jouer des sons dans un programme ???
    Par aldur_disciple dans le forum MFC
    Réponses: 8
    Dernier message: 17/08/2005, 12h10

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