#include <stdio.h>
#include <fixpoint.h>
#include <listelem_alloc.h>
Go to the source code of this file.
Data Structures | |
struct | hmm_context_s |
struct | hmm_state_t |
A single state in the HMM. More... | |
struct | hmm_s |
Defines | |
#define | SENSCR_SHIFT 10 |
Shift count for senone scores. | |
#define | WORST_SCORE ((int)0xE0000000) |
Large negative number. | |
#define | HMM_MAX_NSTATE 5 |
Hard-coded limit on the number of emitting states. | |
#define | hmm_context(h) (h)->ctx |
Access macros. | |
#define | hmm_is_mpx(h) (h)->mpx |
#define | hmm_state(h, st) (h)->state[st] |
#define | hmm_in_score(h) hmm_state(h,0).score |
#define | hmm_score(h, st) hmm_state(h,st).score |
#define | hmm_out_score(h) (h)->out.score |
#define | hmm_in_history(h) hmm_state(h,0).history |
#define | hmm_history(h, st) hmm_state(h,st).history |
#define | hmm_out_history(h) (h)->out.history |
#define | hmm_bestscore(h) (h)->bestscore |
#define | hmm_frame(h) (h)->frame |
#define | hmm_mpx_ssid(h, st) (h)->s.mpx_ssid[st] |
#define | hmm_nonmpx_ssid(h) (h)->s.ssid |
#define | hmm_ssid(h, st) |
#define | hmm_senid(h, st) |
#define | hmm_senscr(h, st) |
#define | hmm_tmatid(h) (h)->tmatid |
#define | hmm_tprob(h, i, j) (h)->ctx->tp[hmm_tmatid(h)][i][j] |
#define | hmm_n_emit_state(h) ((h)->n_emit_state) |
#define | hmm_n_state(h) ((h)->n_emit_state + 1) |
#define | hmm_context_set_senscore(ctx, senscr) ((ctx)->senscore = (senscr)) |
Change the senone score array for a context. | |
Typedefs | |
typedef float32 | mean_t |
typedef float32 | var_t |
typedef struct hmm_context_s | hmm_context_t |
typedef struct hmm_s | hmm_t |
Functions | |
hmm_context_t * | hmm_context_init (int32 n_emit_state, int32 **const *tp, int16 const *senscore, int16 *const *sseq) |
Create an HMM context. | |
void | hmm_context_free (hmm_context_t *ctx) |
Free an HMM context. | |
void | hmm_init (hmm_context_t *ctx, hmm_t *hmm, int mpx, int ssid, int tmatid) |
Populate a previously-allocated HMM structure, allocating internal data. | |
void | hmm_deinit (hmm_t *hmm) |
Free an HMM structure, releasing internal data (but not the HMM structure itself). | |
void | hmm_clear (hmm_t *h) |
Reset the states of the HMM to the invalid condition. | |
void | hmm_clear_scores (hmm_t *h) |
Reset the scores of the HMM. | |
void | hmm_normalize (hmm_t *h, int32 bestscr) |
Renormalize the scores in this HMM based on the given best score. | |
void | hmm_enter (hmm_t *h, int32 score, int32 histid, int frame) |
Enter an HMM with the given path score and history ID. | |
int32 | hmm_vit_eval (hmm_t *hmm) |
Viterbi evaluation of given HMM. | |
int32 | hmm_dump_vit_eval (hmm_t *hmm, FILE *fp) |
Like hmm_vit_eval, but dump HMM state and relevant senscr to fp first, for debugging;. | |
void | hmm_dump (hmm_t *h, FILE *fp) |
For debugging, dump the whole HMM out. |
HMM data structure and operation.
Hidden Markov Model base structures.
For efficiency, this version is hardwired for two possible HMM topologies, but will fall back to others:
5-state left-to-right HMMs: (0 is the *emitting* entry state and E is a non-emitting exit state; the x's indicate allowed transitions between source and destination states):
0 1 2 3 4 E (destination-states) 0 x x x 1 x x x 2 x x x 3 x x x 4 x x (source-states)
5-state topologies that contain a subset of the above transitions should work as well.
3-state left-to-right HMMs (similar notation as the 5-state topology above):
0 1 2 E (destination-states) 0 x x x 1 x x x 2 x x (source-states)
3-state topologies that contain a subset of the above transitions should work as well.
Definition in file hmm.h.
#define hmm_senid | ( | h, | |||
st | ) |
#define hmm_senscr | ( | h, | |||
st | ) |
Value:
(hmm_ssid(h,st) == -1 \ ? WORST_SCORE \ : -(h)->ctx->senscore[hmm_senid(h,st)] << SENSCR_SHIFT)
#define hmm_ssid | ( | h, | |||
st | ) |
#define SENSCR_SHIFT 10 |
Shift count for senone scores.
Definition at line 60 of file hmm.h.
Referenced by senone_eval_all(), and senone_init().
#define WORST_SCORE ((int)0xE0000000) |
Large negative number.
This number must be small enough so that 4 times WORST_SCORE will not overflow. The reason for this is that the search doesn't check the scores in a model before evaluating the model and it may require as many was 4 plies before the new 'good' score can wipe out the initial WORST_SCORE initialization.
Definition at line 72 of file hmm.h.
Referenced by hmm_clear(), hmm_clear_scores(), hmm_normalize(), ngram_compute_seg_scores(), ngram_fwdflat_search(), ngram_fwdtree_search(), ngram_search_find_exit(), ngram_search_lattice(), ngram_search_save_bp(), and ps_astar_start().
void hmm_clear | ( | hmm_t * | h | ) |
Reset the states of the HMM to the invalid condition.
i.e., scores to WORST_SCORE and hist to undefined.
Definition at line 185 of file hmm.c.
References WORST_SCORE.
void hmm_context_free | ( | hmm_context_t * | ctx | ) |
void hmm_dump | ( | hmm_t * | h, | |
FILE * | fp | |||
) |
int32 hmm_dump_vit_eval | ( | hmm_t * | hmm, | |
FILE * | fp | |||
) |
int32 hmm_vit_eval | ( | hmm_t * | hmm | ) |
Viterbi evaluation of given HMM.