Source: lines.h


Annotated List
Files
Globals
Hierarchy
Index
/**
 * 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.