|
|
/** * Détection des lignes de pics. * * @short Détection des lignes de pics * @author G.Garcia (source cpp: Philippe Chose) * @version 7 */ class lines { /** * Type de fonction utilisé pour le calcul du score d'une ligne: * @li @ref lines::line_gain_general * @li @ref lines::line_gain_formant * @li @ref lines::line_gain_formant_viterbi * @li @ref lines::line_gain_additive * @li @ref lines::line_gain_additive_viterbi */ typedef float(lines::*LINE_GAIN)( PmPartialSet*, float, float **); public: /** * Somme des parties frequentielles des scores */ float freq_sum; /** * Somme des parties amplitude des scores */ float ampl_sum; /** * Somme des parties phase des scores */ float phase_sum; /** * Nombre de scores sommes dans les variables @ref lines::freq_sum, @ref lines::ampl_sum et @ref lines::phase_sum */ long nb_sum; /** * Nombre de scores negatifs */ long nb_sum_neg; /** * Pointeur sur la fonction de calcul de gain choisie. * Selection effectuée par @ref hmmLis en fonction du mode * choisi (@ref hmmLis::param_type ) ainsi que de la valeur * du membre ph de @ref lines::variances. * * Choix de fonctions: * @li @ref lines::line_gain_general * @li @ref lines::line_gain_formant * @li @ref lines::line_gain_formant_viterbi * @li @ref lines::line_gain_additive * @li @ref lines::line_gain_additive_viterbi */ LINE_GAIN line_gain; /** * Tableau des scores des différentes lignes détectées dans la fenêtre courante */ float* gain; /** * Nombre de lignes détectées dans la fenêtre courante */ int nb_lines; /** * Descriptif des lignes. Le premier indice de ce tableau bidimensionnel correspond au numéro * de la ligne; le second indice correspond au pas de temps à l'intérieur de la fenêtre * d'analyse HMM; enfin, la valeur contenue dans chaque cellule du tableau * correspond à l'indice du pic référencé. */ int** line; /** * Fréquence instantanée de chaque ligne calculée dans certain cas particuliers d'analyse. * Ce tableau n'est utilisé que par les fonctions viterbi_formant et viterbi_additive, * elles-mêmes uniquement appelées * des fonction de type LINE_GAIN suivantes: * @li @ref lines::line_gain_formant_viterbi * @li @ref lines::line_gain_additive_viterbi * * Notons que ces deux fonctions ne sont utilisées que si, d'une part la variance de la phase * @ref lines::variances n'est pas mise à NO(0), * et d'autre part si la variable @ref lines::nb_freq n'est pas à zéro. * Cette variable est contrôlée par l'option de ligne de commande -Q de hmmLis; * cette option n'est pas utilisée par le script hmm: * ainsi nb_freq=0 et ces deux fonctions de calcul de score sont actuellement inusitées. */ float** line_freq; private: /** * Structure pour l'algorithme de Viterbi utilisée par les fonctions @ref lines::viterbi_additive * et @ref lines::viterbi_formant. Elle contient dans le membre delta * les scores cumulés optimaux de chaque chemin exploré par l'algorithme. * Le membre fi correspond quant à lui à l'index du pic optimal. */ struct double_float_ptr { float** delta; float** fi; }; /** * Tableau contenant les index des pics de la ligne actuellement explorée. */ int* part; /** * Nombre de pas de fréquences pour le lissage des trajectoires de partiels * (cf @ref lines::line_gain_formant_viterbi et @ref lines::line_gain_additive_viterbi). */ int nb_freq; /** * Taille de la fenêtre d'analyse HMM. */ int window; /** * Nombre maximal de lignes détectées par fenêtre d'analyse HMM. */ int maxNbLines; /** * TODO */ float* mean_freq; /** * Différence maximale absolue de fréquence entre deux trames. */ float df_max; /** * Différence maximale relative de fréquence entre deux trames. */ float df_rel; /** * Fréquence explorée minimale. */ float fmin; /** * Fréquence explorée maximale. */ float fmax; /** * Taille du pas de fréquence pour le lissage des partiels (cf @ref lines::line_gain_formant_viterbi * et @ref lines::line_gain_additive_viterbi). */ float res_freq; /** * Tableau de données pour le lissage des partiels (cf @ref lines::line_gain_formant_viterbi * et @ref lines::line_gain_additive_viterbi). */ double_float_ptr* vit; /** * Gains pour le calcul du score de chaque ligne. */ param* gain_coefs; /** * Coefficients additifs pour le calcul du score de chaque ligne. */ param* add_coefs ; /** * Variances pour le calcul du score de chaque ligne. */ param* variances; public: /** * Constructeur * @param window taille de la fenêtre d'analyse HMM * @param nb_freq nombre de cellules de fréquence (cf @ref lines::line_gain_formant_viterbi * et @ref lines::line_gain_additive_viterbi) * @param df_max différence maximale absolue de fréquence * @param df_rel différence maximale relative de fréquence * @param fmin fréquence explorée minimale * @param fmax fréquence explorée maximale * @param res_freq resolution fréquentielle (cf @ref lines::line_gain_formant_viterbi * et @ref lines::line_gain_additive_viterbi) * @param gain_coefs coefficients de gain pour calcul du score (cf @ref lines::line_gain) * @param add_coefs coefficients additifs pour calcul du score (cf @ref lines::line_gain) * @param variances variances pour calcul du score (cf @ref lines::line_gain) * @param maxNbLines nombre maximal de lignes détectées par fenêtre d'analyse HMM */ lines(int window, int nb_freq, float df_max, float df_rel, float fmin, float fmax, float res_freq, param* gain_coefs, param* add_coefs, param* variances, int maxNbLines); /** * Destructeur * désalloue la mémoire. */ ~lines(); /** * Recherche des lignes de pics. Appelle la méthode @ref lines::next_line afin * d'explorer l'ensemble des lignes possibles. Pour chaque ligne de pics * trouvée, calcule le score de cette ligne et le stocke. * * @param bande données des pics. * @param nombre_f tableau donnanr le nombre de pics pour chaque trame. * @param step taille du pas de temps entre deux trames d'analyse. */ void find_lines(PmPartialSet* bande, int* nombre_f, float step); /** * Fonction de calcul du score d'une ligne de pics * de type LINE_GAIN. * Option: formant -> utilise la fréquence, l'amplitude et la largeur de bande * pour le calcul du score. * * @return score de la ligne de pics * @param bande données des partiels * @param step taille du pas de temps entre deux trames d'analyse * @param ptr_modif_freq non utilisé par cette fonction, mais nécéssaire dans la déclaration * pour se conformer au prototype LINE_GAIN */ float line_gain_formant(PmPartialSet* bande, float step, float** ptr_modif_freq); /** * Fonction de calcul du score d'une ligne de pics * de type LINE_GAIN. * Option: formant_viterbi -> utilise l'amplitude et la fréquence * détectées pour le calcul du score: effectue un lissage optimal * contraint par la variance obs (cf lines::variances). Notons que * ce lissage est effectué sur toutes les lignes candidates avant * de sélectionner celles retenues pour devenir des partiels. * * @return score de la ligne de pics * @param bande données des partiels * @param step taille du pas de temps entre deux trames d'analyse * @param ptr_modif_freq tableau destiné à recevoir les fréquences lissées * par la fonction @ref lines::formant_viterbi */ float line_gain_formant_viterbi( PmPartialSet* bande,float step, float** ptr_modif_freq); /** * Fonction de calcul du score d'une ligne de pics * de type LINE_GAIN. * Option: general -> utilise uniquement la fréquence et l'amplitude * pour le calcul du score * * @return score de la ligne de pics * @param bande données des partiels * @param step taille du pas de temps entre deux trames d'analyse * @param ptr_modif_freq non utilisé par cette fonction, mais nécéssaire dans la déclaration * pour se conformer au prototype LINE_GAIN */ float line_gain_general( PmPartialSet* bande, float step, float** ptr_modif_freq); /** * Fonction de calcul du score d'une ligne de pics * de type LINE_GAIN. * Option: additive -> utilise la fréquence, l'amplitude et la phase pour le calcul du score. * * @return score de la ligne de pics * @param bande données des partiels * @param step taille du pas de temps entre deux trames d'analyse * @param ptr_modif_freq non utilisé par cette fonction, mais nécéssaire dans la déclaration * pour se conformer au prototype LINE_GAIN */ float line_gain_additive( PmPartialSet* bande, float step, float** ptr_modif_freq); /** * Fonction de calcul du score d'une ligne de pics * de type LINE_GAIN. * Option: additive_viterbi -> utilise la fréquence, l'amplitude et la phase pour le calcul du score. * Effectue un lissage optimal de la trajectoire. Notons que ce lissage est effectué sur toutes * les lignes candidates et pas seulement sur celles retenues comme des partiels. * * @return score de la ligne de pics * @param bande données des partiels * @param step taille du pas de temps entre deux trames d'analyse * @param ptr_modif_freq TODO */ float line_gain_additive_viterbi( PmPartialSet* bande, float step, float** ptr_modif_freq); private: /** * Fonction de stockage des resultats separes en frequence, amplitude, et phase, * afin de permettre de regler les parametres de gain. * * @param freq_part partie frequentielle du score * @param ampl_part partie amplitude du score * @param phase_part partie phase du score */ void add_stat(float freq_part, float ampl_part, float phase_part = 0); /** * Recherche un pic dans une trame pas trop loin du pic actuel de la trame suivante. * Deux pics sont considérés comme suffisamment proches si le carré de la différence de * leurs fréquences est inférieur au carré d'une quantité égale à la somme de @ref lines::df_max * et de @ref lines::df_rel * (la fréquence du pic actuel de la trame suivante). * Cette fonction est appélée par la méthode @ref lines::next_line. * * @return 1 si un tel pic est trouvé (@ref lines::part[t] contient alors son indice), -1 sinon. * @param bande données sur les pics. * @param nombre_f tableau contenant le nombre de pics dans chaque trame. * @param t numéro de la trame dans laquelle on recherche un pic. */ int next_part( PmPartialSet* bande, int* nombre_f, int t, float step); /** * Recherche une nouvelle ligne de pics. * Pour cela explore l'arbre des pics en partant par la fin de la fenêtre d'analyse HMM * * @return 1 si une telle ligne est trouvée, sinon -1. * @param bande données sur les pics * @param nombre_f tableau contenant le nombre de pics dans chaque trame. * @param t numéro de la trame dans laquelle on recherche un pic. */ int next_line(PmPartialSet* bande, int* nombre_f, int t, float step); /** * Fonction de calcul de score de ligne actuellement inusitée * @see lines::line_freq */ float viterbi_additive(float* modif_freq, float step); /** * Fonction de calcul de score de ligne actuellement inusitée * @see lines::line_freq */ float viterbi_formant(float* modif_freq, float step); };
Generated by: chose@josquin on Wed Nov 10 20:55:59 199. |