SphinxBase 5prealpha
fe_warp.c
1/* -*- c-basic-offset: 4; indent-tabs-mode: nil -*- */
2/* ====================================================================
3 * Copyright (c) 2006 Carnegie Mellon University. All rights
4 * reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 *
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in
15 * the documentation and/or other materials provided with the
16 * distribution.
17 *
18 * This work was supported in part by funding from the Defense Advanced
19 * Research Projects Agency and the National Science Foundation of the
20 * United States of America, and the CMU Sphinx Speech Consortium.
21 *
22 * THIS SOFTWARE IS PROVIDED BY CARNEGIE MELLON UNIVERSITY ``AS IS'' AND
23 * ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
24 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
25 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY
26 * NOR ITS EMPLOYEES BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
27 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
28 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
29 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
30 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
32 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33 *
34 * ====================================================================
35 *
36 */
37/*********************************************************************
38 *
39 * File: fe_warp.c
40 *
41 * Description:
42 * Allows a caller to choose a warping function.
43 *********************************************************************/
44
45/* static char rcsid[] = "@(#)$Id: fe_warp.c,v 1.2 2006/02/17 00:31:34 egouvea Exp $";*/
46
47#include "fe_warp_inverse_linear.h"
48#include "fe_warp_affine.h"
49#include "fe_warp_piecewise_linear.h"
50#include "fe_warp.h"
51
52#include "sphinxbase/err.h"
53
54#include <stdio.h>
55#include <string.h>
56#include <assert.h>
57#include <stdlib.h>
58
59/* This is for aliases for each of the entries below. Currently not
60 used.
61*/
62static char *__name2id[] = {
63 "inverse",
64 "linear",
65 "piecewise",
66 NULL
67};
68
69static char *name2id[] = {
70 "inverse_linear",
71 "affine",
72 "piecewise_linear",
73 NULL
74};
75
76static fe_warp_conf_t fe_warp_conf[FE_WARP_ID_MAX + 1] = {
77 {fe_warp_inverse_linear_set_parameters,
78 fe_warp_inverse_linear_doc,
79 fe_warp_inverse_linear_id,
80 fe_warp_inverse_linear_n_param,
81 fe_warp_inverse_linear_warped_to_unwarped,
82 fe_warp_inverse_linear_unwarped_to_warped,
83 fe_warp_inverse_linear_print}, /* Inverse linear warping */
84 {fe_warp_affine_set_parameters,
85 fe_warp_affine_doc,
86 fe_warp_affine_id,
87 fe_warp_affine_n_param,
88 fe_warp_affine_warped_to_unwarped,
89 fe_warp_affine_unwarped_to_warped,
90 fe_warp_affine_print}, /* Affine warping */
91 {fe_warp_piecewise_linear_set_parameters,
92 fe_warp_piecewise_linear_doc,
93 fe_warp_piecewise_linear_id,
94 fe_warp_piecewise_linear_n_param,
95 fe_warp_piecewise_linear_warped_to_unwarped,
96 fe_warp_piecewise_linear_unwarped_to_warped,
97 fe_warp_piecewise_linear_print}, /* Piecewise_Linear warping */
98};
99
100int
101fe_warp_set(melfb_t *mel, const char *id_name)
102{
103 uint32 i;
104
105 for (i = 0; name2id[i]; i++) {
106 if (strcmp(id_name, name2id[i]) == 0) {
107 mel->warp_id = i;
108 break;
109 }
110 }
111
112 if (name2id[i] == NULL) {
113 for (i = 0; __name2id[i]; i++) {
114 if (strcmp(id_name, __name2id[i]) == 0) {
115 mel->warp_id = i;
116 break;
117 }
118 }
119 if (__name2id[i] == NULL) {
120 E_ERROR("Unimplemented warping function %s\n", id_name);
121 E_ERROR("Implemented functions are:\n");
122 for (i = 0; name2id[i]; i++) {
123 fprintf(stderr, "\t%s\n", name2id[i]);
124 }
125 mel->warp_id = FE_WARP_ID_NONE;
126
127 return FE_START_ERROR;
128 }
129 }
130
131 return FE_SUCCESS;
132}
133
134void
135fe_warp_set_parameters(melfb_t *mel, char const *param_str, float sampling_rate)
136{
137 if (mel->warp_id <= FE_WARP_ID_MAX) {
138 fe_warp_conf[mel->warp_id].set_parameters(param_str, sampling_rate);
139 }
140 else if (mel->warp_id == FE_WARP_ID_NONE) {
141 E_FATAL("feat module must be configured w/ a valid ID\n");
142 }
143 else {
144 E_FATAL
145 ("fe_warp module misconfigured with invalid fe_warp_id %u\n",
146 mel->warp_id);
147 }
148}
149
150const char *
151fe_warp_doc(melfb_t *mel)
152{
153 if (mel->warp_id <= FE_WARP_ID_MAX) {
154 return fe_warp_conf[mel->warp_id].doc();
155 }
156 else if (mel->warp_id == FE_WARP_ID_NONE) {
157 E_FATAL("fe_warp module must be configured w/ a valid ID\n");
158 }
159 else {
160 E_FATAL
161 ("fe_warp module misconfigured with invalid fe_warp_id %u\n",
162 mel->warp_id);
163 }
164
165 return NULL;
166}
167
168uint32
169fe_warp_id(melfb_t *mel)
170{
171 if (mel->warp_id <= FE_WARP_ID_MAX) {
172 assert(mel->warp_id == fe_warp_conf[mel->warp_id].id());
173 return mel->warp_id;
174 }
175 else if (mel->warp_id != FE_WARP_ID_NONE) {
176 E_FATAL
177 ("fe_warp module misconfigured with invalid fe_warp_id %u\n",
178 mel->warp_id);
179 }
180
181 return FE_WARP_ID_NONE;
182}
183
184uint32
185fe_warp_n_param(melfb_t *mel)
186{
187 if (mel->warp_id <= FE_WARP_ID_MAX) {
188 return fe_warp_conf[mel->warp_id].n_param();
189 }
190 else if (mel->warp_id == FE_WARP_ID_NONE) {
191 E_FATAL("fe_warp module must be configured w/ a valid ID\n");
192 }
193 else {
194 E_FATAL
195 ("fe_warp module misconfigured with invalid fe_warp_id %u\n",
196 mel->warp_id);
197 }
198
199 return 0;
200}
201
202float
203fe_warp_warped_to_unwarped(melfb_t *mel, float nonlinear)
204{
205 if (mel->warp_id <= FE_WARP_ID_MAX) {
206 return fe_warp_conf[mel->warp_id].warped_to_unwarped(nonlinear);
207 }
208 else if (mel->warp_id == FE_WARP_ID_NONE) {
209 E_FATAL("fe_warp module must be configured w/ a valid ID\n");
210 }
211 else {
212 E_FATAL
213 ("fe_warp module misconfigured with invalid fe_warp_id %u\n",
214 mel->warp_id);
215 }
216
217 return 0;
218}
219
220float
221fe_warp_unwarped_to_warped(melfb_t *mel,float linear)
222{
223 if (mel->warp_id <= FE_WARP_ID_MAX) {
224 return fe_warp_conf[mel->warp_id].unwarped_to_warped(linear);
225 }
226 else if (mel->warp_id == FE_WARP_ID_NONE) {
227 E_FATAL("fe_warp module must be configured w/ a valid ID\n");
228 }
229 else {
230 E_FATAL
231 ("fe_warp module misconfigured with invalid fe_warp_id %u\n",
232 mel->warp_id);
233 }
234
235 return 0;
236}
237
238void
239fe_warp_print(melfb_t *mel, const char *label)
240{
241 if (mel->warp_id <= FE_WARP_ID_MAX) {
242 fe_warp_conf[mel->warp_id].print(label);
243 }
244 else if (mel->warp_id == FE_WARP_ID_NONE) {
245 E_FATAL("fe_warp module must be configured w/ a valid ID\n");
246 }
247 else {
248 E_FATAL
249 ("fe_warp module misconfigured with invalid fe_warp_id %u\n",
250 mel->warp_id);
251 }
252}
Implementation of logging routines.
#define E_ERROR(...)
Print error message to error log.
Definition: err.h:104
#define E_FATAL(...)
Exit with non-zero status after error message.
Definition: err.h:81
Base Struct to hold all structure for MFCC computation.
Definition: fe_internal.h:75