| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
|
|
| |
|
|
| #include <stdio.h> |
| #include <string.h> |
| #include <assert.h> |
| #include <stdlib.h> |
|
|
| #include <pocketsphinx.h> |
|
|
| #include "fe/fe_warp_inverse_linear.h" |
| #include "fe/fe_warp_affine.h" |
| #include "fe/fe_warp_piecewise_linear.h" |
| #include "fe/fe_warp.h" |
|
|
| |
| |
| |
| static char *__name2id[] = { |
| "inverse", |
| "linear", |
| "piecewise", |
| NULL |
| }; |
|
|
| static char *name2id[] = { |
| "inverse_linear", |
| "affine", |
| "piecewise_linear", |
| NULL |
| }; |
|
|
| static fe_warp_conf_t fe_warp_conf[FE_WARP_ID_MAX + 1] = { |
| {fe_warp_inverse_linear_set_parameters, |
| fe_warp_inverse_linear_doc, |
| fe_warp_inverse_linear_id, |
| fe_warp_inverse_linear_n_param, |
| fe_warp_inverse_linear_warped_to_unwarped, |
| fe_warp_inverse_linear_unwarped_to_warped, |
| fe_warp_inverse_linear_print}, |
| {fe_warp_affine_set_parameters, |
| fe_warp_affine_doc, |
| fe_warp_affine_id, |
| fe_warp_affine_n_param, |
| fe_warp_affine_warped_to_unwarped, |
| fe_warp_affine_unwarped_to_warped, |
| fe_warp_affine_print}, |
| {fe_warp_piecewise_linear_set_parameters, |
| fe_warp_piecewise_linear_doc, |
| fe_warp_piecewise_linear_id, |
| fe_warp_piecewise_linear_n_param, |
| fe_warp_piecewise_linear_warped_to_unwarped, |
| fe_warp_piecewise_linear_unwarped_to_warped, |
| fe_warp_piecewise_linear_print}, |
| }; |
|
|
| int |
| fe_warp_set(melfb_t *mel, const char *id_name) |
| { |
| uint32 i; |
|
|
| for (i = 0; name2id[i]; i++) { |
| if (strcmp(id_name, name2id[i]) == 0) { |
| mel->warp_id = i; |
| break; |
| } |
| } |
|
|
| if (name2id[i] == NULL) { |
| for (i = 0; __name2id[i]; i++) { |
| if (strcmp(id_name, __name2id[i]) == 0) { |
| mel->warp_id = i; |
| break; |
| } |
| } |
| if (__name2id[i] == NULL) { |
| E_ERROR("Unimplemented warping function %s\n", id_name); |
| E_ERROR("Implemented functions are:\n"); |
| for (i = 0; name2id[i]; i++) { |
| fprintf(stderr, "\t%s\n", name2id[i]); |
| } |
| mel->warp_id = FE_WARP_ID_NONE; |
|
|
| return FE_START_ERROR; |
| } |
| } |
|
|
| return FE_SUCCESS; |
| } |
|
|
| void |
| fe_warp_set_parameters(melfb_t *mel, char const *param_str, float sampling_rate) |
| { |
| if (mel->warp_id <= FE_WARP_ID_MAX) { |
| fe_warp_conf[mel->warp_id].set_parameters(param_str, sampling_rate); |
| } |
| else if (mel->warp_id == FE_WARP_ID_NONE) { |
| E_FATAL("feat module must be configured w/ a valid ID\n"); |
| } |
| else { |
| E_FATAL |
| ("fe_warp module misconfigured with invalid fe_warp_id %u\n", |
| mel->warp_id); |
| } |
| } |
|
|
| const char * |
| fe_warp_doc(melfb_t *mel) |
| { |
| if (mel->warp_id <= FE_WARP_ID_MAX) { |
| return fe_warp_conf[mel->warp_id].doc(); |
| } |
| else if (mel->warp_id == FE_WARP_ID_NONE) { |
| E_FATAL("fe_warp module must be configured w/ a valid ID\n"); |
| } |
| else { |
| E_FATAL |
| ("fe_warp module misconfigured with invalid fe_warp_id %u\n", |
| mel->warp_id); |
| } |
|
|
| return NULL; |
| } |
|
|
| uint32 |
| fe_warp_id(melfb_t *mel) |
| { |
| if (mel->warp_id <= FE_WARP_ID_MAX) { |
| assert(mel->warp_id == fe_warp_conf[mel->warp_id].id()); |
| return mel->warp_id; |
| } |
| else if (mel->warp_id != FE_WARP_ID_NONE) { |
| E_FATAL |
| ("fe_warp module misconfigured with invalid fe_warp_id %u\n", |
| mel->warp_id); |
| } |
|
|
| return FE_WARP_ID_NONE; |
| } |
|
|
| uint32 |
| fe_warp_n_param(melfb_t *mel) |
| { |
| if (mel->warp_id <= FE_WARP_ID_MAX) { |
| return fe_warp_conf[mel->warp_id].n_param(); |
| } |
| else if (mel->warp_id == FE_WARP_ID_NONE) { |
| E_FATAL("fe_warp module must be configured w/ a valid ID\n"); |
| } |
| else { |
| E_FATAL |
| ("fe_warp module misconfigured with invalid fe_warp_id %u\n", |
| mel->warp_id); |
| } |
|
|
| return 0; |
| } |
|
|
| float |
| fe_warp_warped_to_unwarped(melfb_t *mel, float nonlinear) |
| { |
| if (mel->warp_id <= FE_WARP_ID_MAX) { |
| return fe_warp_conf[mel->warp_id].warped_to_unwarped(nonlinear); |
| } |
| else if (mel->warp_id == FE_WARP_ID_NONE) { |
| E_FATAL("fe_warp module must be configured w/ a valid ID\n"); |
| } |
| else { |
| E_FATAL |
| ("fe_warp module misconfigured with invalid fe_warp_id %u\n", |
| mel->warp_id); |
| } |
|
|
| return 0; |
| } |
|
|
| float |
| fe_warp_unwarped_to_warped(melfb_t *mel,float linear) |
| { |
| if (mel->warp_id <= FE_WARP_ID_MAX) { |
| return fe_warp_conf[mel->warp_id].unwarped_to_warped(linear); |
| } |
| else if (mel->warp_id == FE_WARP_ID_NONE) { |
| E_FATAL("fe_warp module must be configured w/ a valid ID\n"); |
| } |
| else { |
| E_FATAL |
| ("fe_warp module misconfigured with invalid fe_warp_id %u\n", |
| mel->warp_id); |
| } |
|
|
| return 0; |
| } |
|
|
| void |
| fe_warp_print(melfb_t *mel, const char *label) |
| { |
| if (mel->warp_id <= FE_WARP_ID_MAX) { |
| fe_warp_conf[mel->warp_id].print(label); |
| } |
| else if (mel->warp_id == FE_WARP_ID_NONE) { |
| E_FATAL("fe_warp module must be configured w/ a valid ID\n"); |
| } |
| else { |
| E_FATAL |
| ("fe_warp module misconfigured with invalid fe_warp_id %u\n", |
| mel->warp_id); |
| } |
| } |
|
|