#include <stdio.h>
#include <fixpoint.h>
#include <listelem_alloc.h>
#include "bin_mdef.h"
Go to the source code of this file.
Data Structures | |
| struct | hmm_context_s |
| struct | hmm_s |
Defines | |
| #define | SENSCR_SHIFT 10 |
| Shift count for senone scores. | |
| #define | WORST_SCORE ((int)0xE0000000) |
| Large "bad" score. | |
| #define | TMAT_WORST_SCORE (-255 << SENSCR_SHIFT) |
| Watch out, though! Transition matrix entries that are supposed to be "zero" don't actually get that small due to quantization. | |
| #define | BETTER_THAN > |
| Is one score better than another? | |
| #define | WORSE_THAN < |
| Is one score worse than another? | |
| #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_in_score(h) (h)->score[0] |
| #define | hmm_score(h, st) (h)->score[st] |
| #define | hmm_out_score(h) (h)->out_score |
| #define | hmm_in_history(h) (h)->history[0] |
| #define | hmm_history(h, st) (h)->history[st] |
| #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)->senid[st] |
| #define | hmm_nonmpx_ssid(h) (h)->ssid |
| #define | hmm_ssid(h, st) |
| #define | hmm_mpx_senid(h, st) |
| #define | hmm_nonmpx_senid(h, st) ((h)->senid[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] << SENSCR_SHIFT) |
| #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 hmm_context_s | hmm_context_t |
| typedef hmm_s | hmm_t |
Functions | |
| hmm_context_t * | hmm_context_init (int32 n_emit_state, uint8 **const *tp, int16 const *senscore, uint16 *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. | |
Definition in file hmm.h.
| #define hmm_mpx_senid | ( | h, | |||
| st | ) |
Value:
(hmm_mpx_ssid(h,st) == BAD_SENID \ ? BAD_SENID : (h)->ctx->sseq[hmm_mpx_ssid(h,st)][st])
| #define hmm_senid | ( | h, | |||
| st | ) |
Value:
(hmm_is_mpx(h) \ ? hmm_mpx_senid(h,st) : hmm_nonmpx_senid(h,st))
Definition at line 196 of file hmm.h.
Referenced by hmm_dump().
| #define hmm_senscr | ( | h, | |||
| st | ) |
Value:
(hmm_senid(h,st) == BAD_SENID \ ? WORST_SCORE \ : -(h)->ctx->senscore[hmm_senid(h,st)] << SENSCR_SHIFT)
Definition at line 198 of file hmm.h.
Referenced by hmm_dump().
| #define hmm_ssid | ( | h, | |||
| st | ) |
Value:
(hmm_is_mpx(h) \ ? hmm_mpx_ssid(h,st) : hmm_nonmpx_ssid(h))
Definition at line 191 of file hmm.h.
Referenced by hmm_dump().
| #define WORST_SCORE ((int)0xE0000000) |
Large "bad" score.
This number must be "bad" 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 74 of file hmm.h.
Referenced by acmod_best_score(), hmm_clear(), hmm_clear_scores(), hmm_normalize(), ngram_compute_seg_score(), 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 183 of file hmm.c.
References hmm_history, hmm_in_history, hmm_in_score, hmm_n_emit_state, hmm_out_history, hmm_out_score, hmm_score, and WORST_SCORE.
| void hmm_context_free | ( | hmm_context_t * | ctx | ) |
| void hmm_dump | ( | hmm_t * | h, | |
| FILE * | fp | |||
| ) |
For debugging, dump the whole HMM out.
| h | In/Out: HMM being updated |
| fp | An output file pointer |
Definition at line 116 of file hmm.c.
References hmm_history, hmm_in_history, hmm_in_score, hmm_is_mpx, hmm_n_emit_state, hmm_out_history, hmm_out_score, hmm_score, hmm_senid, hmm_senscr, and hmm_ssid.
| int32 hmm_dump_vit_eval | ( | hmm_t * | hmm, | |
| FILE * | fp | |||
| ) |
| int32 hmm_vit_eval | ( | hmm_t * | hmm | ) |
Viterbi evaluation of given HMM.
Definition at line 789 of file hmm.c.
References hmm_is_mpx, and hmm_n_emit_state.
1.4.7