64 #pragma warning (disable: 4996)
71 #include "fe_warp_piecewise_linear.h"
81 static float params[N_PARAM] = { 1.0f, 6800.0f };
82 static float final_piece[2];
83 static int32 is_neutral = YES;
84 static char p_str[256] =
"";
85 static float nyquist_frequency = 0.0f;
89 fe_warp_piecewise_linear_doc()
91 return "piecewise_linear :== < w' = a * w, w < F >";
95 fe_warp_piecewise_linear_id()
97 return FE_WARP_ID_PIECEWISE_LINEAR;
101 fe_warp_piecewise_linear_n_param()
107 fe_warp_piecewise_linear_set_parameters(
char const *param_str,
112 char temp_param_str[256];
115 nyquist_frequency = sampling_rate / 2;
116 if (param_str == NULL) {
121 if (strcmp(param_str, p_str) == 0) {
125 strcpy(temp_param_str, param_str);
126 memset(params, 0, N_PARAM *
sizeof(
float));
127 memset(final_piece, 0, 2 *
sizeof(
float));
128 strcpy(p_str, param_str);
130 tok = strtok(temp_param_str, seps);
131 while (tok != NULL) {
132 params[param_index++] = (float)
atof_c(tok);
133 tok = strtok(NULL, seps);
134 if (param_index >= N_PARAM) {
140 (
"Piecewise linear warping takes up to two arguments, %s ignored.\n",
143 if (params[1] < sampling_rate) {
149 if (params[1] == 0) {
150 params[1] = sampling_rate * 0.85f;
154 params[0] * params[1]) / (nyquist_frequency - params[1]);
156 nyquist_frequency * params[1] * (params[0] -
157 1.0f) / (nyquist_frequency -
161 memset(final_piece, 0, 2 *
sizeof(
float));
163 if (params[0] == 0) {
166 (
"Piecewise linear warping cannot have slope zero, warping not applied.\n");
171 fe_warp_piecewise_linear_warped_to_unwarped(
float nonlinear)
179 if (nonlinear < params[0] * params[1]) {
180 temp = nonlinear / params[0];
183 temp = nonlinear - final_piece[1];
184 temp /= final_piece[0];
186 if (temp > nyquist_frequency) {
188 (
"Warp factor %g results in frequency (%.1f) higher than Nyquist (%.1f)\n",
189 params[0], temp, nyquist_frequency);
196 fe_warp_piecewise_linear_unwarped_to_warped(
float linear)
204 if (linear < params[1]) {
205 temp = linear * params[0];
208 temp = final_piece[0] * linear + final_piece[1];
215 fe_warp_piecewise_linear_print(
const char *label)
219 for (i = 0; i < N_PARAM; i++) {
220 printf(
"%s[%04u]: %6.3f ", label, i, params[i]);
Miscellaneous useful string functions.
#define E_INFO(...)
Print logging information to standard error stream.
SPHINXBASE_EXPORT double atof_c(char const *str)
Locale independent version of atof().
Implementation of logging routines.
#define E_WARN(...)
Print warning message to error log.