#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.
1.5.8