summaryrefslogtreecommitdiffstats
path: root/media/sphinxbase/src/libsphinxbase/fe/fe_warp.c
diff options
context:
space:
mode:
Diffstat (limited to 'media/sphinxbase/src/libsphinxbase/fe/fe_warp.c')
-rw-r--r--media/sphinxbase/src/libsphinxbase/fe/fe_warp.c252
1 files changed, 252 insertions, 0 deletions
diff --git a/media/sphinxbase/src/libsphinxbase/fe/fe_warp.c b/media/sphinxbase/src/libsphinxbase/fe/fe_warp.c
new file mode 100644
index 000000000..e409bea76
--- /dev/null
+++ b/media/sphinxbase/src/libsphinxbase/fe/fe_warp.c
@@ -0,0 +1,252 @@
+/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */
+/* ====================================================================
+ * Copyright (c) 2006 Carnegie Mellon University. All rights
+ * reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * This work was supported in part by funding from the Defense Advanced
+ * Research Projects Agency and the National Science Foundation of the
+ * United States of America, and the CMU Sphinx Speech Consortium.
+ *
+ * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND
+ * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY
+ * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * ====================================================================
+ *
+ */
+/*********************************************************************
+ *
+ * File: fe_warp.c
+ *
+ * Description:
+ * Allows a caller to choose a warping function.
+ *********************************************************************/
+
+/* static char rcsid[] = "@(#)$Id: fe_warp.c,v 1.2 2006/02/17 00:31:34 egouvea Exp $";*/
+
+#include "fe_warp_inverse_linear.h"
+#include "fe_warp_affine.h"
+#include "fe_warp_piecewise_linear.h"
+#include "fe_warp.h"
+
+#include "sphinxbase/err.h"
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include <stdlib.h>
+
+/* This is for aliases for each of the entries below. Currently not
+ used.
+*/
+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}, /* Inverse linear warping */
+ {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}, /* Affine warping */
+ {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}, /* Piecewise_Linear warping */
+};
+
+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);
+ }
+}