Le modèle sonore utilise par Hmm se décrit en termes de sinusoïdes appelées partiels dont les fréquences, les amplitudes et les phases varient au cours du temps. Cette description du son est obtenue en trois temps: tout d'abord une analyse spectrale du son est effectuée (FFT à fenêtre glissante) puis les maxima locaux (pics) de chaque spectre sont detectés; enfin ces pics sont reliés entre eux afin de former des partiels. Hmm utilise la librairie Pm pour calculer les différentes FFT et pour détecter les pics. Le coeur du programme se situe dans la phase de détection des partiels qui utilise un algorithme inspiré des Modèles de Markov Cachés (Hidden Markov Models).
hmm -A -R -D -S test.sfUn sous-répertoire HMMtest est crée dans lequel sont placés les fichiers obtenus aux différents stades de l'analyse. Tout d'abord un fichier test.peak.sdif contenant l'ensemble des pics détectés dans le fichier sonore; un fichier test.sdif contenant les partiels détectés; et enfin un fichier history dans lequel sont stockées les lignes de commande de toutes les analyses effectuées sur ce son. Par ailleurs, dans le répertoire courant, deux nouveaux fichiers sont apparus: test.synt.sf et test.noise.sf contenant respectivement le son resynthétise et le résiduel, c'est à dire ce qu'il reste dans le son après soustraction du son resynthétisé.
setenv SFDIR /user/my_group/my_name/sound_dir/Hmm reconnaît en entrée les formats AIFF/AIFF-C ainsi que le format IRCAM .sf. Un ensemble de programmes est disponible à l'IRCAM afin de manipuler ces fichier sonores: fromsf, tosf, querysf, playsf, normsf, peaksf, diffsf, sfmix et xspect. Utilisez l'option -h en ligne de commande pour obtenir plus d'information.
Hmm utilise la variable d'environnement DATADIR pour désigner le répertoire devant recevoir les fichiers de pics et de partiels crées. Par défaut, cette variable est initialisée à la même valeur que SFDIR. Les fichiers sont placés dans un sous-répertoire de DATADIR portant un nom commençant par HMM suivi par le nom du son analysé sans son extension. Un fichier history est aussi écrit dans ce répertoire: il contient la trace de l'ensemble des analyses effectuées sur le fichier son correspondant. Si par exemple le fichier analyse s'appelle wood.sf, les fichiers de pics et de partiels wood.peak.sdif et wood.sdif ainsi que le fichier history seront plac's dans le sous-répertoire HMMwood de DATADIR.
Les deux fichiers de pics et de partiels sont au format SDIF.
Ils contiennent respectivement les pics détectés dans le
spectre à tous les instants d'analyse (trames 1PIC) et les partiels
détectés (trames 1TRC). Ces fichiers peuvent être visualisés
graphiquement avec le programme sview ou
être convertis et manipulés grâce aux outils suivants:
sdiftofmt, sdiftoformat
et
sdifextract.
Voici par
exemple un fichier de pics visualisé avec sview:
hmm <options, ....>ou options est une liste d'options separées par des blancs. Notons tout de suite l'option -h qui permet d'obtenir l'aide en ligne:
hmm -h
Analysis/Synthesis steps -A hmm tracking -R additive synthesis -D residual -P peak detection -T partial tracking Analysis parameters N.B. SPACE BETWEEN FLAG AND ITS VALUE -S input sound file (relative paths will be searched in SFDIR, except for paths starting with '~', './', or '../', and of course absolute paths.) -B begin analysis in s (0) -E end analysis in s (end of file) -M analysis window width in s (.08) -I analysis step in s (.01) -W min length of partials in frames (3) -f frequency variance in Hz^2 per ms (5.) -a amplitude variance per ms (0.1) -y phase variance in radians per ms (2.5) -d absolute freq slope coefficient in Hz per ms (1.5) -e relative freq slope coefficient in Hz per Hz and per ms (0.) -fm minimum frequency in Hz (0.) -fM maximum frequency in hz (srate/2) -p zero padding exponent (0) -u additive frequency coefficient for HMM score (8) -v additive amplitude coefficient for HMM score (8) -w additive phase coefficient for HMM score (8) -X gain for frequency weight in HMM score (1) -Y gain for amplitude weight in HMM score (1) -Z gain for phase weight in HMM score (1) -s gain smoothing in HMM score (1)
-A : analyse complète (détection des pics et suivi de partiels)Cette option indique qu'on souhaite effectuer un calcul des trajectoires de partiels. Ceci est realisé en trois étapes:
-P : détection des pics uniquementCette option indique que l'on souhaite effectuer une détection des pics uniquement sans relier ces pics dans des partiels. Le résultat est un fichier SDIF contenant des trames de type 1PIC dans le sous-répertoire HMM<nom_du_fichier_son>.peak.sdif. De ce fichier peuvent être extraites les données grâce au programme sdifextract. Par ailleurs, le fichier peut être visualisé graphiquement à l'aide de sview. Les données stockées pour chaque pic sont la fréquence de ce pic, son amplitude et sa phase mesurée au centre de la fenêtre d'analyse, c'est à dire à l'instant repéré par le temps de la trame.
-T : tracking des partielsCette option indique que l'on souhaite effectuer un tracking des partiels à partir du fichier <nom_du_fichier_son>.peak.sdif situe dans le sous-répertoire HMM<nom_du_fichier_son>. Le résultat de cette opération est stocké dans le fichier <nom_du_fichier_son>.sdif situé dans le même sous-répertoire. Ce fichier est un fichier SDIF contenant des trames de type 1TRC. Les données peuvent être extraites grâce au programme sdifextract ou visualisées graphiquement avec sview (voir ci dessous un exemple de visualisation): pour chaque partiel on dispose de sa fréquence, de son amplitude, de sa phase (mesurée au centre de la fenêtre d'analyse) et de son numéro d'index (ce qui permet de le relier aux pics des autres trames).
-R : synthèse additiveCette option indique que l'on souhaite effectuer une resynthèse à partir des partiels détectés en utilisant les données stockées dans le fichier <nom_du_fichier_son>.sdif dans le répertoire HMM<nom_du_fichier_son>. Le fichier sonore produit est un fichier de meme format que le son original (sf ou aiff). Sa fréquence d'échantillonage est la même que le fichier source. Il est nécessaire pour utiliser cette option d'avoir lancé hmm préalablement avec les options -A ou -P et -T.
-D : calcul du résiduelCette option indique que l'on souhaite calculer le résiduel c'est à dire ce qu'il reste dans le son après soustraction des partiels détectés. Cette opération est effectuée par soustraction dans le domaine temporel des deux formes d'onde du fichier son original et du fichier son resynthétisé qui aura ete préalablement calculé grâce à l'option -R. Si tous les partiels ont ete détectés au cours de l'analyse, seul les parties non-sinusoïdales du son subsistent dans le résiduel. Le fichier son crée se nomme <nom_du_fichier_son>.noise.sf ou .aiff, sa fréquence d'échantillonage étant la même que celle du fichier son original; il est situé dans le répertoire $DATADIR.
-S nom_du_fichier_son_à_traiterDonne le nom du fichier à analyser. Exemple -S test.sf.
Si un chemin relatif est donné, il sera cherché à partir du répertoire $SFDIR. Le nom du son, c'est à dire ce qui précède l'extension .sf ou .aiff sera utilisé pour former le nom du sous-répertoire de $DATADIR devant recevoir les fichier produits (voir Fichier sons et fichiers SDIF ci-dessus). Cette option ne peut JAMAIS être omise.
-B instant_de_début_d'analyse_en_secondesInstant repérant le début de l'analyse par rapport au début du fichier son. Exemple -B 1.32. La valeur par défaut est 0.
-E instant_de_fin_d'analyse_en_secondesInstant repérant la fin de l'analyse par rapport au début du fichier son. Exemple -E 1.64. La valeur par défault place ce repère en fin de fichier.
-M taille_de_la_fenêtre_d'analyse_en_secondesTaille de la fenêtre d'analyse c'est à dire de la portion du signal analysée à chaque pas d'analyse par une FFT. Exemple -M 0.022. La valeur par défaut est de 0.08 secondes. Afin que les différents pics spectraux apparaissent séparés dans la FFT et puissent ainsi être correctement détectes, il est nécessaire d'utiliser une taille de fenêtre d'analyse au moins 3 fois plus grande que l'inverse de la plus petite distance en Hertz que l'on souhaite séparer. Si par exemple df dénote l'e'eartement minimal en fréquence entre deux partiels du son a analyser, la taille de la fenêtre d'analyse devra être au moins égale à 3/df, voire même 3.5/df pour éviter toute surprise. Plus la taille de cette fenêtre est grande, plus les pics seront séparés et meilleure sera leur détection. La contrepartie est une moins bonne résolution temporelle.
-I pas_d'analyse_en_secondesIntervalle de temps s'ecoulant entre deux analyses successives. Exemple -I 0.005. La valeur par défaut est de 0.01 secondes. Pour une meilleure estimation des paramètres des partiels lors d'une évolution rapide de ceux-ci, une valeur plus faible pourra être utilisée. Néanmoins une faible valeur augmente le temps de calcul et la taille des fichiers produits.
-fm fréquence_minimale_explorée -fM fréquence_maximale_exploréeLimite inférieure et supérieure de fréquence explorée pour la détection des pics. Les valeurs par défaut sont 1 Hertz et la moitié de la fréquence d'échantillonage du fichier son analysé.
-W taille_minimale_d'un_partielDurée minimale d'un partiel en nombre de trames. Tout partiel plus court sera rejeté. La valeur par défaut est de 3 trames. Cette taille est directement reliée à la taille de la fenêtre HMM, c'est à dire la portion de signal sur laquelle une détection globale des partiels sera effectuée. Plus cette valeur sera grande plus le nombre de partiels candidats sera élevé et plus le temps de calcul sera important. Des valeurs très importantes de ce paramètre combiné avec des valeurs importantes du seuil de différence de fréquence (-d, -e) peuvent conduire à des calculs extrêmement longs.
-p exposant_de_zero_paddingLe rapport entre taille de la FFT et taille de la fenêtre d'analyse est égal à 2^exposant. Ce paramètre permet donc de contrôler la taille de la FFT. La valeur par défaut est 0.
-d différence_absolue_maximale_de_fréquence -e différence_relative_maximale_de_fréquenceCes deux paramètres servent à contrôler la différence maximale de fréquence entre deux pics successifs d'un même partiel. Cette différence maximale est calculée de la manière suivante:
différence_maximale ^ 2 = différence_absolue ^ 2 + (différence_relative * fréquence) ^ 2où fréquence désigne la fréquence du premier pic. Si la différence de fréquence entre deux pics dans des trames successives est supérieure à cette borne alors ces deux pics ne peuvent être reliés pour faire partie d'un même partiel. Si par contre elle est inférieure à cette même borne, un partiel contenant ces deux pics est possible. Un autre lui sera peut être preféré au cours de l'optimisation HMM (cf les options -f, -a, -y, -u, -v, -w, -X, -Y, -Z, -s). L'interêt d'avoir scinde ce seuil en partie absolue et relative permet d'avoir un seuil variant en fonction de la fréquence, très pratique lors de l'analyse de signaux harmoniques, puisqu'une variation de fréquence (Hz/ms) df_n pour l'harmonique d'ordre n entraînera une variation de fréquence df_m valant approximativement df_n * m / n, ce qui montre bien la proportionnalité entre cette différence de fréquence et la fréquence elle-même.
-f variance_de_la_fréquence -a variance_de_l'amplitude -y variance_de_la_phaseCes trois paramètres sont utilis's dans le calcul du score d'une séquence de pics. Ils contrôlent le degré de tolérance aux variations de la grandeur considerée (fréquence, amplitude ou phase) entre deux pics successifs d'une meme séquence. Leurs valeurs par défaut sont respectivement 5, 0.1, 2.5, les unites etant des Hz^2/ms, des 1/ms, et des rad/ms.
-u coefficient_additif_de_la_fréquence -v coefficient_additif_de_l'amplitude -w coefficient_additif_de_la_phaseCes trois paramètres sont utilisés dans le calcul du score d'une sequence de pics et sont en fait redondants. Ils permettent lorsqu'on les augmente de tolérer beaucoup plus de séquences qui sinon aurait été rejetées. Leur valeur par défaut est 8.
-X gain_de_la_partie_fréquence -Y gain_de_la_partie_amplitude -Z gain_de_la_partie_phase -s gain_de_la_partie_lissageCes quatres paramètres sont utilisés dans le calcul du score d'une séquence de pics. Ils permettent de modifier le poids relatif de la fréquence, de l'amplitude ou de la phase dans le calcul du score et ainsi donner plus d'importance à la relative linéarité du dit paramètre. Leur valeur par défaut est 1.
Soit p[i], i = 0..W-1, une séquence de pics
extraits de W trames successives (W est la taille
de la fenêtre HMM). Le score S de cette séquence vaut:
S = S_1* S_2 * ... * S_(W-2)
S_i = S_i_f * S_i_a * S_i_p
S_i_f = exp( -gain_f * (p[i-1].f - 2*p[i].f + p[i+1].f)^2 / variance_f - additive_f) ) S_i_a = exp( -gain_a * (p[i-1].a - 2*p[i].a + p[i+1].a)^2 / p[i].a^2 / variance_a - additive_a) ) S_i_p = exp( -gain_p * (p[i-1].p - 2*p[i].p + p[i+1].p)^2 / variance_p - additive_p) )ou gain_?, variance_? et additive_? correspondent aux paramètres -f, -u, -X pour la fréquence, -a, -v, -y pour l'amplitude et -y, -w, -z pour la phase.
Le score d'une séquence de pics est donc le
produit des scores de séquences de trois pics successifs, chacun
de ces scores étant le produit de trois termes, le premier relatif
à la variation de fréquence, le second à la variation
d'amplitude et le troisieme à la variation de phase. Ces trois termes
sont des gaussiennes ayant pour argument la derivée seconde discrète
de la quantité considerée (fréquence, amplitude ou
phase). Il s'en suit donc que le score est plus important lorsque cette
derivée seconde est la plus faible possible et donc lorsque ces
paramètres suivent des évolutions linéaires.
La variance permet de contrôler quantitativement
l'écart à la linéarite du paramètre; le gain
permet de contrôler quant à lui le poids relatif de ces trois
termes afin de donner plus d'importance à la fréquence, à
l'amplitude ou à la phase dans le choix des partiels sélectionnes.
Les trois paramètres additifs sont en fait redondants et ne sont
qu'un seul et même paramètre multiplicatif global du score.
Les séquences de pics de score inférieur à 1 etant
immediatement rejetées, ce paramètre permet de ne sélectionner
que les séquences de score important.
Notons que l'implémentation de ce calcul
dans hmm est faite avec le logarithme du score, ceci afin d'optimiser
les calculs