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 :

Calcul de coefficients cepstraux


Sujet :

Signal

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Par défaut Calcul de coefficients cepstraux
    Bonjour,

    Suite à mon dernier post intitulé "Détection de silences dans un fichier .wav", vous avez pu voir que j'étais un humble débutant en signal.

    Je souhaite à présent "qualifier" les portions de signal, en faisant apparaître en sortie les coefficients cepstraux de mon signal.

    J'ai donc effectuer un peu de veille sur le sujet et je suis tombé sur deux articles intéressants:

    ftp://ftp.inria.fr/INRIA/publication/Theses/TU-1118.pdf (notamment diapo 47)

    http://tel.archives-ouvertes.fr/docs...l-00005757.pdf

    Dans ce dernier article on peut trouver un algorithme proposé, décrit par la figure suivante:



    Je tente à présent d'implémenter cet algorithme, en mettant pour l'instant de côté le filtrage de Mel.

    Cependant, mes maigres connaissances en calcul matlab (en calcul tout court d'ailleurs, ) font que j'obtiens des résultats assez aberrants. Pour l'instant, j'en suis simplement à vouloir afficher le résultat de la transformation de Fourier de mon signal, après un fenètrage de hamming:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    function y = cepstral(x)
     
    ham = hamming(length(x));
     
    y = fft(x(:,1).* ham);
    j'obtiens une espèce d'étoile de trait que je ne me souviens pas avoir vu en cours, lorsque le prof parlais de transformation de Fourier...

    Merci à tous ceux qui pourront me donner quelques pistes

  2. #2
    Membre Expert
    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
    Par défaut
    Salut.
    les coefficients cepstraux de mon signal.
    Il y a des exemples dans la doc de Matlab :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    t = 0:0.01:1.27;
    s1 = sin(2*pi*45*t);
    s2 = s1 + 0.5*[zeros(1,20) s1(1:108)];
    c = cceps(s2);
    [xh,nd] = cceps(s2);%Cepstrum analysis
    plot(t,s2)
    grid
    figure(2)
    plot(t,xh)
    grid
    xh=icceps(xh,nd);%Inverse complex Cepstrum
    figure(3)
    plot(t,xh)
    grid

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Par défaut
    Merci pour les informations sur l'obtention des coefficients cepstraux,

    Cependant, lorsque je tente d'utiliser ces fonctions sur un .wav pour créer une empreinte vocale à partir de celui-ci, la fonction cceps semble ne rien me retourner... Est-ce normal? Désolé pour mon ignorance en la matière, j'ai peut-être commis une erreur en enlevant le paramètre t, ms je ne voyait pas comment l'utiliser avec mon signal wave

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    s1 = wavread('2.wav');
    c = cceps(s1(1,:))
    [xh,nd] = cceps(s1(1,:));%Cepstrum analysis
    plot(s1)
    grid
    figure(2)
    plot(xh)
    Par ailleurs, au cours de mes recherches, j'ai vu qu'il est fortement conseillé de faire une sorte de mise à l'échelle de Mel, est-ce que tu sait comment on fait ça sur matlab?

    Merci pour ton aide!

    François

  4. #4
    Membre Expert
    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
    Par défaut
    Salut.
    S1 est-il bien dimensionné ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    s1=wavread('bonjour.wav');
    c = cceps(s1);
    [xh,nd] = cceps(s1);%Cepstrum analysis
    plot(s1)
    grid
    figure(2)
    plot(xh)
    figure(2)
    plot(xh)
    grid
    xh=icceps(xh,nd);%Inverse complex Cepstrum
    figure(3)
    plot(xh)
    grid

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2008
    Messages : 57
    Par défaut
    bonjour,

    j'obtiens une espèce d'étoile de trait que je ne me souviens pas avoir vu en cours, lorsque le prof parlait de transformation de Fourier...
    Une fft produit un signal complexe, et il faut apprendre à exploiter les informations obtenues après une transformée de Fourier. En règle général on va calculer le module que l'on placera dans une fonction logarithmique ce qui permettra d'en avoir une "meilleure" représentation (mais toute autre opération est valable pour peut qu'on en retire ce que l'on cherche ).
    Ensuite il sera nécessaire de mettre ton graphe à l'échelle (en abscisse) pour placer correctement les raies des fréquences.

    Pour cela il est nécessaire de connaitre la fréquence d'échantillonnage Fe de ton signal et de prendre une nombre N d'échantillons pour le calcul (pas forcément le nombre d'échantillons total.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Fe = ...
    N = ...
     fftXs = fft(Xs(1:N))/N;
     plot((-N:N-1)*Fe/(N*2),20*log10(abs(fftshift(fftXs))));grid on
    Ce type de représentation dite en bande de base centre la représentation fréquentielle de ton signal sur la bande 2*Fe


    Pour en savoir plus ... lire beaucoup et ne pas avoir peur des mathématiques

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Par défaut
    Bonjour à tous,

    Tout d'abord, merci pour vos réponses. Phryte, je pense que tu as raison, car lorsque j'exécute ton code avec mon .wav, MATLAB me retourne ce message d'erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ??? Error using ==> unknown
    Matrix dimensions must agree.
     
    Error in ==> cceps>rcunwrap at 79
    y(:) = y(:)' - pi*nd*(0:(n-1))/nh;
     
    Error in ==> cceps at 36
    [ah,nd] = rcunwrap(angle(h));
     
    Error in ==> exemple at 27
    c = cceps(s1);
    Cependant, par tâtonnement, j'ai tenté un:

    Là, MATLAB reste 'Busy' pendant très (trop) longtemps (si j'enlève le point-virgule, je m'aperçois qu'il calcule énormément de valeurs de s1)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    s1=s1(1,:)';
    %ou
    s1=s1(1,:);
    Il me renvoie une grille vide.

    Il reste 'Busy'.

    Cependant, lorsque je fais:

    Il reste 'Busy' pendant un long moment, puis me calcul bien un coefficient cepstral:



    Mais, dans l'hypothèse où un seul locuteur est présent dans l'extrait, puis-je affirmer directement: "j'ai déterminé son empreinte vocale!" où ya-t-il d'autre opération à effectuer (j'ai entendu parler d'une mise à l'échelle de Mel ou filtrage de Mel...)?

    Par ailleurs, j'ai noté qu'il faut beaucoup zoomer sur l'image pour obtenir quelquechose d'exploitable, à partir de quel instant puis-je affirmer cette partie est intéressante, elle va me permettre de différencier deux locuteurs différents?

    Je sais, ça fait beaucoup de questions, mais la documentation que j'ai trouvé ne me permet pas de me figurer concrètement comment je peux exploiter un coefficient cepstral...

    Merci d'avance à ceux qui sauront me conseiller

    François

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2008
    Messages : 57
    Par défaut
    Tout graphe mérite un titre et des labels sur les axes des abscisses et des ordonnées, sinon on ne peut pas t'aider. Tu es le seul à comprendre cette figure .

    Il reste 'Busy' pendant un long moment, puis me calcul bien un coefficient cepstral:
    Plus de 3*10e6 échantillons ça fait beaucoup, c'est surement pour cela qu'on ne s'intéressait au début à découper le signal en fonction d'un seuil d'énergie.
    Travail qui était préparatoire au calcul de la fft


    s1 = s1';
    Pour un signal mono dimensionnel réel cela revient au même sous matlab sauf quand on a énormément d'échantillons. Il faut le temps de traitement... quand même

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Code :
     
    s1=s1(1,:)';
    %ou
    s1=s1(1,:);
    Il me renvoie une grille vide.
    Surement normal car suivant l'orientation de ton vecteur, tu as du lui donner un seul échantillon à calculer...

Discussions similaires

  1. [Langage/Algorithme] probleme calcul Factorielle, Coefficient binomial
    Par dz_robotix dans le forum C++Builder
    Réponses: 1
    Dernier message: 15/10/2010, 10h01
  2. Calcul des coefficients par fir1
    Par Sytra dans le forum Signal
    Réponses: 4
    Dernier message: 23/02/2010, 13h40
  3. calcul du coefficient de hurst d'une image
    Par hksa93 dans le forum Traitement d'images
    Réponses: 2
    Dernier message: 05/01/2010, 00h01
  4. les coefficients cepstraux a partir du signal
    Par fleurrouge dans le forum Signal
    Réponses: 0
    Dernier message: 19/05/2009, 00h51
  5. Calculer les coefficients de distorsion
    Par yan dans le forum OpenCV
    Réponses: 1
    Dernier message: 02/08/2007, 20h28

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