/**
* 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. |