Source: hmmLis.h


Annotated List
Files
Globals
Hierarchy
Index
/**
 * Classe principale de l'algorithme hmm.
 *
 * @short Module HMM
 * @author G.Garcia (source cpp: Philippe Chose)
 * @version 7
 */

class hmmLis
{
public:
  /**
   * Fréquence minimale d'analyse
   */
  float   fmin;
  /**
   * Fréquence maximale d'analyse
   */
  float   fmax;
  /**
   * Variation maximale absolue de fréquence
   */
  float   df_abs;
  /**
   * Variation maximale relative de fréquence
   */
  float   df_rel;
  /**
   * Poids des scores (frequence, amplitude, phase)
   */
  param* gain_coefs;
  /**
   * Variances pour le calcul du score
   */
  param* variances;
  /**
   * Coefficients additifs pour le calcul du score
   */
  param* add_coefs;
  /**
   * Taille de la fenêtre d'analyse HMM
   */
  int     window;
  /**
   * Nombre maximal de pics dans une trame 
   */
  int     maxNbPeaks;
  /**
   * Nombre maximal de partiels dans une trame
   */
  int     maxNbOutput;
  /**
   * Nombre maximal de partiels détectés dans une fenêtre d'analyse HMM
   */
  int     maxNbViterbi;
  /**
   * Pas de temps entre deux trames
   */
  float   step;
  /**
   * Marqueur de fin d'analyse
   */
  float   tmax;
  /**
   * Marqueur de début d'analyse
   */
  float   tmin;
  /**
   * Fréquence d´échantillonage
   */
  float   SR;
  /** 
   * Nombre maximal de lignes détectées dans une fenêtre d'analyse HMM
   */
  int     maxNbLines;
  /**
   * Nombre maximal de lignes dans un fenêtre d'analyse HMM ayant au moins un
   * pic en commun
   */
  int     maxNbLinks;
  /**
   * Résolution fréquentielle pour algorithme de viterbi (cf @ref lines::res_freq )
   */
  float   res_freq;
  /**
   * Nombre de cellules fréquentielles pour algorithme de viterbi (cf @ref lines::nb_freq )
   */
  int	  nb_freq;
  /**
   * Choix entre détection de partiels ou de formants. Deux valeurs possibles: HMM_ADDITIVE
   * et HMM_FORMANT.
   */
  char    param_type;
  /**
   * Structure de gestion du delai de deuil après mort d'un partiel et avant réutilisation de son index.
   */
  tab_time 	*heaven ;
  /**
   * Drapeau indiquant le mode d'entrées/sorties de Pm: PM_BIN ou PM_SDIF.
   */
  PmFormat pmMode;
  
private:
  /**
   * Type de fonction de lecture de partiels (cf @ref hmmLis::read_additive_param et
   * @ref hmmLis::read_formant_param )
   */
  typedef int(hmmLis::*READ_PARAM)(FILE *fp, PmPartialSet ps, PmFormat format_flag);
  /**
   * Pointeur sur la fonction de lecture de pics choisie
   */
  READ_PARAM read_param;
  /**
   * Tableau de PmPartialSet contenant les données à analyser
   */
  PmPartialSet* bande;
  /**
   * TODO
   */
  float* mean_freq ;
  /**
   * Tableau contenant le nombre de pics par trame
   */
  int* nombre_f;
  /**
   * Tableau contenant les repères temporels des trames
   */
  float* tmp_f;
  /**
   * Tableau contenant les trajets de partiels correspondant à une fenêtre
   * d'analyse HMM.
   */
  int** Tviterbi;
  /**
   * Trajectoires de partiels indexées en fonction de leur état (Alive, Dead, ...)
   */
  int** Toutput;
  /**
   * Tableaux d'index des partiels détectés (vivants,morts,...)
   */
  partials* p ;
  
public:
  /**
   * Constructeur
   *  effectue certaines allocations mémoire (p,heaven,gain_coefs,variances,mul_coefs)
   *  et initialise les variables 
   */
  hmmLis();
  /**
   * Destructeur
   *  ne fait rien
   */
  ~hmmLis();

  /**
   * Procédure de calcul
   *  selectionne la fonction de lecture, alloue de la mémoire, initialise
   *  les données en mémoire puis rentre dans la boucle principale.
   *  Cette boucle principale est constituée essentiellement
   *  de deux appels de méthodes dans les classes lines et line_sets.
   *  le premier appel (@ref lines::find_lines ) détecte les lignes de pics
   *  susceptibles de devenir des partiels
   */
  void process();

private:

  /**
   * Décalage des tableaux en mémoire au changement de trame
   *
   * @param bande tableau des pics
   * @param tmp_f tableau des repères temporels
   * @param nombre_f tableau du nombre de pics par trame
   * @param window taille de la fenêtre d'analyse
   */
  void ShiftMem( PmPartialSet* bande, float* tmp_f, int* nombre_f, int window );

  /**
   * Initializations diverses
   *
   * @param bande tableau de pics
   * @param tmp_f tableau des repères temporels
   * @param nombre_f tableau du nombre de pics par trame
   * @param p tableaux des index de partiels
   */
  void Init(PmPartialSet* bande, int* nombre_f, float* tmp_f, partials* p);
  
  /**
   * Allocation mémoire
   *
   * @param maxNbPeaks nombre maximal de pics par trame
   */
  void AllocMem(int maxNbPeaks );
  /**
   * Désallocation mémoire
   */
  void DesallocMem();
  
  /**
   * Lecture de trames de pics au format fmt(Pm)
   *   option partiels
   *
   * @param fp fichier au format fmt(Pm)
   * @param ps tableau de pics à remplir
   * @param format_flag format du fichier à lire
   */
  int read_additive_param(FILE* fp, PmPartialSet ps, PmFormat format_flag);
  /** 
   * Lecture de trames de pics au format fmt(Pm)
   *   option formants
   *
   * @param fp fichier au format fmt(Pm)
   * @param ps tableau de pics à remplir
   * @param format_flag format du fichier à lire
   */
  int read_formant_param(FILE* fp, PmPartialSet ps, PmFormat format_flag);

  /**
   * Mise à jour des données du tableau @ref hmmLis::Toutput à partir du tableau @ref hmmLis::Tviterbi
   *
   * @param optnbPart nombre de partiels détectés dans la fenêtre d'analyse courante
   * et contenus dans le tableau @ref hmmLis::Tviterbi
   */  
  void FillToutput(int optnbPart);
  /**
   * Sortie fichier des partiels détectés au format fmt(Pm)
   */
  void write_param();
  /**
   * Décalage des tableaux de lignes en fin de trame
   */
  void ShiftLines();
  /**
   * Mise à jour des temps de deuil après mort de partiels (cf @ref tab_time )
   */
  void IncrHeavenTime();
};


/**
 * Aide sur la ligne de commande
 */
void usage();

/**
 * Program entry point
 *
 * @param argc nombre de paramètre sur la ligne de commande + 1
 * @param argv tableau contenant ces paramètres
 */
int main(int argc, char **argv);

/**
 * Drapeau indiquant si les informations de debugging doivent être affichées
 */
int DEBUG;

Generated by: chose@josquin on Wed Nov 10 20:55:59 199.