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