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

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Points : 27
    Points
    27
    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 é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
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Points : 27
    Points
    27
    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 é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
    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 du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2008
    Messages : 57
    Points : 52
    Points
    52
    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
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Points : 27
    Points
    27
    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 du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    57
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2008
    Messages : 57
    Points : 52
    Points
    52
    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...

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Points : 27
    Points
    27
    Par défaut
    J'ai effectué le calcul des coeffcients cepstraux sur les segments que j'avais découpés en fonctions des blancs (cf épisode précédent ). Je me retrouve donc avec quatre sous-trames correspondant à un dialogue entre deux personnes (locuteur1->locuteur2->locuteur1->locuteur2)

    Pour chacune de ces sous-trames, je calcule le coefficient cepstral associé, voici ce que j'obtiens:



    (j'ai tenté de mettre un titre, des abscisses et des ordonnées avec ce que je pense que ma courbe représente... mais je ne vois pas vraiment ce qu'un coefficient cepstral représente concrètement (une énergie, peut-être?) ni si ces coefficients sont calculés sur une fréquence ou un nombre d'échantillons)

    Le résultat obtenu me semble exploitable car les coefficients cepstraux du locuteurs 1 et 2 se ressemblent respectivement mais sont différents (autrement dit (coeff1=coeff3) != (coeff2=coeff4), mais cela est peut-être dû au hasard, car cela me semble un peu simple...

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 57
    Points : 52
    Points
    52
    Par défaut
    Lire... cela demande du temps et de la patiente !

    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
    Pour information il s'agit de 2 thèses. Je ne crois pas que le mot "article" soit le terme

    ...mais je ne vois pas vraiment ce qu'un coefficient cepstral représente concrètement
    Du document TU-1118 on peut lire...


    1.7.2/ Méthodes adaptées à la parole
    Ce paragraphe présente de manière assez succincte les grands principes qui ont conduit aux
    différentes représentations du signal actuellement les plus utilisées. Ces grandes méthodes sont les cepstres, le codage par prédiction linéaire, le codage par modulation et les modèles d’audition.
    1.7.2.1/ Représentations cepstrales
    Pour séparer les deux informations présentes dans le signal de parole que sont la fréquence
    fondamentale et la transformation, supposée linéaire, effectuée par le conduit vocal, il est nécessaire
    d’effectuer une déconvolution a posteriori du signal pour connaître la contribution des cordes
    vocales et du conduit vocal lors de la génération du signal qui a, par la suite, été observé en entrée du
    système. Cette déconvolution peut être effectuée grâce au cepstre. Il est à noter que le nom même de
    cepstre est défini à partir du mot spectre (cepstre = (spec)-1tre). De même, la représentation
    temps-fréquence associée n’est plus qualifiée de fréquentielle mais de quéfrentielle.
    ...

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Points : 27
    Points
    27
    Par défaut
    Merci de m'avoir souligné ces passages, je les avais déjà lu mais on ne lit jamais trop une définition.

    Cependant, je n'arrive toujours pas à savoir ce que peut représenter l'ordonnée de mon graphique (si je ne me trompe pas, l'abscisse serait équivalente à l'inverse de l'inverse d'un temps, mais pas vraiment un temps malgré tout)

    Et j'ai toujours, malgré toutes ces définitions, du mal à savoir quel partie de mon cepstre est intéressante pour qualifier la voix d'une personne. En effet, concrètement, lorsque j'effectue mon calcul de cepstre sur 10000 échantillons des sous-trames j'obtiens un pic au début, avec quelques autres pics qui suivent, puis une valeur cepstrale nulle, et à la fin d'autres pics. Et lorsque j'effectue ce calcul sur 1000 échantillons, le même schéma!!! Du coup, je n'arrive pas du tout à me représenter ce que représente mon cepstre concrètement...

    Je suis peux être passé pour un fainénant à vos yeux, mais mon problème est simplement que je n'arrive pas à faire le lien entre les définitions que j'ai pu lire, et ce que je vois sur ma courbe...

    PS: Désolé pour le mot "article" , c'est vrai que ce sont des thèses

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

    Informations forums :
    Inscription : Juin 2008
    Messages : 57
    Points : 52
    Points
    52
    Par défaut
    Je ne suis pas un expert dans le codage de la parole et pour ma part c'est la première fois que j'entends (je lis) le mot cepstre.

    Je n'ai rien lu de spécifique la dessus et j'ai à peine parcouru les documents cités.

    De mon avis il faut voir les résultats obtenus comme une signature du son émis par les cordes vocales de chacun des locuteurs. Il faudrait refaire les calculs sur tous les sons découpés pour voir si le schéma décrit, alternance rouge et bleu du dialogue, se reproduit.

    Pour l'interprétation de tes graphes :
    1. place le temps en abscisse dans ta figure plot(t,x)
    2. renseigne toi plus sur ce que déconvolution veut dire et quelles informations tu peux en ressrotir

    Pour séparer les deux informations présentes dans le signal de parole que sont la fréquence
    fondamentale et la transformation
    , supposée linéaire, effectuée par le conduit vocal, il est nécessaire
    d’effectuer une déconvolution a posteriori du signal pour connaître la contribution des cordes
    vocales et du conduit vocal

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    36
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 36
    Points : 27
    Points
    27
    Par défaut
    Bonjour,

    Si quelqu'un peut me renseigner car après une semaine à tourner le problème dans tous les sens, je ne sais toujours pas comment déterminer une empreinte vocale valable.

    En effet, je tente d'appliquer une des méthodes décrites dans ce ppt:
    http://gregoryvillemin.free.fr/Dossi...ORBEAU/ral.ppt

    J'en suis toujours à vouloir créer des paramètres d'analyse (concrètement, les fameuses empreintes vocales) -diapo 27 sur le ppt- par la méthode des cepstres.

    J'applique scrupuleusement la méthode: je découpe ma trame en sous-trames de 30ms puis je calcule le cepstre sur chacunes de ces sous-trames.

    Cependant, quand je visualise les cepstres obtenus pour 9 sous-trames où le même locuteur parle, je n'obtiens pas les même cepstres! Voici le graphique que j'obtiens :





    (je ne comprend pas:

    1- pourquoi sur la première trame mes valeurs de cepstres vont de 0 à 400 alors que sur les autres l'ordre de grandeur n'est pas le même
    2- pourquoi parfois le cepstre finit sur une ascendante, et parfois sur une descendante
    3- pourquoi finalement, mes cepstres n'ont pas tous la même allure...)

    Je suis complètement perdu, j'ai l'impression que plus je me renseigne sur le sujet, plus je suis perdu, mon maître de stage ne voit pas non plus où ça bug: en gros, pour moi c'est l'enfer!

    Donc si quelqu'un si connait mieux que moi sur le sujet, je serais vraiment reconnaissant s'il pouvait m'aider.


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