pocketsphinx / src /fe /fe_warp.c
camenduru's picture
pocketsphinx
5610573
/* -*- 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 <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"
/* 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);
}
}