14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  frontobj.c  *
34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the 'License');          *
74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  you may not use this file except in compliance with the License.         *
84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  You may obtain a copy of the License at                                  *
104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0                           *
114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software      *
134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  distributed under the License is distributed on an 'AS IS' BASIS,        *
144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  See the License for the specific language governing permissions and      *
164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  limitations under the License.                                           *
174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/
194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdlib.h>
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if defined(__cplusplus) && defined(_MSC_VER)
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectextern "C"
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string.h>
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string.h>
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef _RTT
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdio.h>
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef unix
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <unistd.h>
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef POSIX
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <memory.h>
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <assert.h>
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "front.h"
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "portable.h"
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "sh_down.h"
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DEBUG       0
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void hamming_window(fftdata *ham, int win_len);
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic front_wave *create_wave_object(void);
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void delete_wave_object(front_wave *waveobj);
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void setup_wave_object(front_wave *waveobj, front_parameters *parameters);
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void clear_wave_object(front_wave *waveobj);
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic front_freq *create_freq_object(void);
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void delete_freq_object(front_freq *freqobj);
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void setup_freq_object(front_freq *freqobj, front_parameters *parameters, int mel_dim);
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void reset_freq_object(front_freq *freqobj);
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void clear_freq_object(front_freq *freqobj);
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic front_cep *create_cep_object(void);
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void delete_cep_object(front_cep *cepobj);
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void setup_cep_object(front_cep *cepobj, front_parameters *parameters,
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                             size_t num_fb, size_t mel_dim);
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void reset_cep_object(front_cep *cepobj);
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void clear_cep_object(front_cep *cepobj);
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectfront_config *create_config_object(void)
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  front_config  *config;
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  config = (front_config *) CALLOC_CLR(1,
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project           sizeof(front_config), "cfront.front_config");
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return config;
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*******************************************************************************
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**  FUNCTION: setup_config_object
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**  DESCRIPTION: Set up the front end using the paramteters. This function
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**       configures the member Wave, Freq and Cep objects, by calling their
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**       create and setup
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**       functions.
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**  ARGUMENTS:
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**  RETURNS: pointer to config object
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project*******************************************************************************/
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid setup_config_object(front_config *config, front_parameters *parameters)
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(config);
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(parameters);
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Create and configure sub-components */
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  config->waveobj = create_wave_object();
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  config->freqobj = create_freq_object();
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  config->cepobj = create_cep_object();
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  setup_wave_object(config->waveobj, parameters);
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  setup_freq_object(config->freqobj, parameters, parameters->mel_dim);
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  setup_cep_object(config->cepobj, parameters, config->freqobj->nf,
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                   parameters->mel_dim);
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid clear_config_object(front_config *config)
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(config);
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  clear_wave_object(config->waveobj);
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  clear_freq_object(config->freqobj);
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  clear_cep_object(config->cepobj);
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  delete_wave_object(config->waveobj);
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  config->waveobj = NULL;
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  delete_freq_object(config->freqobj);
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  config->freqobj = NULL;
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  delete_cep_object(config->cepobj);
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  config->cepobj = NULL;
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid delete_config_object(front_config *config)
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(config);
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE((char *) config);
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectfront_channel *create_channel_object(void)
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  front_channel *channel;
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel = (front_channel *) CALLOC_CLR(1,
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            sizeof(front_channel), "cfront.channel");
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return channel;
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid delete_channel_object(front_channel *channel)
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(channel);
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE((char *) channel);
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid setup_channel_object(
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  front_channel *channel, front_wave *waveobj,
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  front_freq *freqobj, front_cep *cepobj)
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(channel);
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(waveobj);
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(freqobj);
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(cepobj);
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->prebuff = (fftdata *) CALLOC(freqobj->window_length + 1,
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                     sizeof(fftdata), "cfront.prebuff");
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->prerefbuff = (fftdata *) CALLOC(freqobj->window_length + 1,
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                        sizeof(fftdata), "cfront.prerefbuff");
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->buff_size = freqobj->window_length + 1;
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Create gain normalization object, and space for filter bank storage. BP */
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->num_freq = freqobj->nf;
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->filterbank = (cepdata *) CALLOC(channel->num_freq,
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                        sizeof(cepdata), "cfront.filterbank");
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->filterbankref = (cepdata *) CALLOC(channel->num_freq,
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                           sizeof(cepdata), "cfront.filterbankref");
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->mel_dim = cepobj->mel_dim;
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->cep = (cepdata *) CALLOC((Q2 + 1) * (channel->mel_dim + 1),
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          sizeof(cepdata), "cfront.cep");
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->rasta = (cepdata *) CALLOC((channel->mel_dim + 1),
1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                   sizeof(cepdata), "cfront.rasta");
1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->framdata = (featdata *) CALLOC(3 * (channel->mel_dim + 1),
1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                      sizeof(featdata), "cfront.chan_framdata");
1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (freqobj->do_spectral_sub)
1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /*  Spectral subtraction requires estimate of BG levels. This is currently
1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        estimated on the first config->spectral_sub_frame_dur frames, which are
1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        assumed to be in silence. The channel means are estimated when the
1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        frame count is reached, and is_valid is set, in
1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        estimate_spectral_sub_means. Spectral subtraction is turned on with
1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        config->do_spectral_sub.
1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    */
2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    channel->spectral_sub = (spectral_sub_info *) CALLOC_CLR(1,
2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                            sizeof(spectral_sub_info), "cfront.spectral_sub_info");
2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    channel->spectral_sub->sub_vector = (cepdata *) CALLOC(NUM_MEL_FREQS,
2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                        sizeof(cepdata), "cfront.spectral_sub_vector");
2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    channel->spectral_sub->frame_dur = cepobj->spectral_sub_frame_dur;
2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    channel->spectral_sub->scale = cepobj->spec_sub_scale;
2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(freqobj->frame_period > 0);
2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->frame_delay = DELTA + (freqobj->window_length / freqobj->frame_period) - 1;
2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->forget_factor = cepobj->forget_factor;
2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  reset_channel_object(channel);
2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid clear_channel_object(front_channel *channel)
2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(channel);
2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE((char *) channel->prebuff);
2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->prebuff = NULL;
2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE((char *) channel->prerefbuff);
2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->prerefbuff = NULL;
2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE((char *) channel->filterbank);
2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->filterbank = NULL;
2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE((char *) channel->filterbankref);
2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->filterbankref = NULL;
2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE((char *) channel->cep);
2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->cep = NULL;
2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE((char *) channel->rasta);
2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->rasta = NULL;
2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE((char *) channel->framdata);
2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->framdata = NULL;
2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (channel->spectral_sub)
2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE((char *) channel->spectral_sub->sub_vector);
2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE((char *) channel->spectral_sub);
2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    channel->spectral_sub = NULL;
2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->buff_size = 0;
2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* Replacement fns for reset_std_channel */
2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid reset_channel_object(front_channel *channel)
2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t ii;
2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(channel);
2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if DEBUG
2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  log_report("Channel reset\n");
2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  memset(channel->cep, 0x00, Q2 *(channel->mel_dim + 1) * sizeof(float));
2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  memset(channel->prebuff, 0x00, channel->buff_size * sizeof(fftdata));
2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  memset(channel->prerefbuff, 0x00, channel->buff_size * sizeof(fftdata));
2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->lastx = 0;
2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (ii = 0; ii <= channel->mel_dim; ii++)
2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    channel->rasta[ii] = 0;
2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (channel->spectral_sub)
2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    channel->spectral_sub->is_valid = False;
2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (ii = 0; ii < NUM_MEL_FREQS; ii++)
2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      channel->spectral_sub->sub_vector[ii] = (cepdata) 0.0;
2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  channel->frame_count = 0;
2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/******************************************************************************
2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**  WAVE OBJECT
2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project*******************************************************************************/
2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic front_wave *create_wave_object(void)
2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  front_wave *waveobj;
2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  waveobj = (front_wave *) CALLOC_CLR(1, sizeof(front_wave), "cfront.waveobj");
2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return waveobj;
2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void delete_wave_object(front_wave *waveobj)
2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(waveobj);
2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE((char *) waveobj);
2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void setup_wave_object(front_wave *waveobj, front_parameters *parameters)
2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(waveobj);
3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(parameters);
3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  waveobj->samplerate = parameters->samplerate;
3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*  Be careful about the value of COEFDATA_SHIFT - it should be <16.
3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      During preemphasis the data is shifted up by COEFDATA_SHIFT too.
3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  */
3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  waveobj->pre_mel = (coefdata) fixed_point_convert(parameters->pre_mel,
3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                     COEFDATA_SHIFT);
3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  waveobj->high_clip   = parameters->high_clip;
3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  waveobj->low_clip    = parameters->low_clip;
3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  waveobj->max_per10000_clip  = parameters->max_per10000_clip;
3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  waveobj->max_dc_offset  = parameters->max_dc_offset;
3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  waveobj->high_noise_level_bit = parameters->high_noise_level_bit;
3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  waveobj->low_speech_level_bit = parameters->low_speech_level_bit;
3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  waveobj->min_samples  = parameters->min_samples;
3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void clear_wave_object(front_wave *waveobj)
3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(waveobj);
3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/******************************************************************************
3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**  FREQUENCY OBJECT
3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project*******************************************************************************/
3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic front_freq *create_freq_object(void)
3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  front_freq *freqobj;
3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj = (front_freq *) CALLOC_CLR(1,
3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            sizeof(front_freq), "cfront.freqobj");
3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->fc = &freqobj->fcb[1];
3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->lognp = 4;
3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  reset_freq_object(freqobj);
3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return freqobj;
3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void delete_freq_object(front_freq *freqobj)
3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(freqobj);
3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE((char *) freqobj);
3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void setup_freq_object(front_freq *freqobj,
3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                              front_parameters *parameters, int mel_dim)
3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int     fmax, i, j, high_cut, bandwidth;
3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  float   t, finc, f;
3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(freqobj);
3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(parameters);
3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(FRAMERATE > 0);
3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(parameters->samplerate);
3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->framerate = FRAMERATE;
3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->frame_period = parameters->samplerate / freqobj->framerate;
3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->samplerate = parameters->samplerate;
3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->window_length = (int)(parameters->window_factor * freqobj->frame_period);
3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->low_cut = parameters->low_cut;
3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->high_cut = parameters->high_cut;
3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->do_spectral_sub = parameters->do_spectral_sub;
3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->do_filterbank_input = parameters->do_filterbank_input;
3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->do_filterbank_dump = parameters->do_filterbank_dump;
3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->num_fb_to_use = parameters->num_fb_to_use;
3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->do_nonlinear_filter = True;    /* on by default */
3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->spectrum_filter_num = 0;
3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->warp_scale = parameters->warp_scale; /*## */
3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->piecewise_start = parameters->piecewise_start; /*## */
3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (freqobj->high_cut > 0)
3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    high_cut = freqobj->high_cut;
3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    high_cut = parameters->samplerate / 2;
3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bandwidth = parameters->samplerate / 2;
3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(bandwidth != 0);
3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->np = 1 << freqobj->lognp;                            /* fft sizing */
3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  while (freqobj->np < freqobj->window_length)
3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    freqobj->np *= 2, freqobj->lognp++;
3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  while (freqobj->np < 128)
3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    freqobj->np *= 2, freqobj->lognp++;
3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (freqobj->np > NP)
3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SERVICE_ERROR(FFT_TOO_SMALL);
3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*  Change the values of the peakpick forward and backward coefficients
3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  to compensate for sample rate. */
3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  t = (float) exp(log((double)parameters->peakpickup)
3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                  * ((double)parameters->samplerate / (double)11025)
3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                  / ((double)freqobj->np / (double)256));
3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->peakpickup = (fftdata) fixed_point_convert(t, COEFDATA_SHIFT);
3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  t = (float) exp(log((double)parameters->peakpickdown)
3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                  * ((double)parameters->samplerate / (double)11025)
3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                  / ((double)freqobj->np / (double)256));
4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->peakpickdown = (fftdata) fixed_point_convert(t, COEFDATA_SHIFT);
4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if BIGGER_WINDOW
4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->window_length = freqobj->np;
4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  configure_fft(&freqobj->fft, freqobj->np);
4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->ns = freqobj->np / 2 + 1;
4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  fmax = bandwidth;
4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  finc = (float)parameters->samplerate / (float)freqobj->np;
4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*    finc= fmax/freqobj->ns; */
4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->cut_off_below = (int)(((long)freqobj->low_cut * freqobj->np) / (2.0 * bandwidth));
4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->cut_off_above = (int)(((long)high_cut * freqobj->np) / (2.0 * bandwidth));
4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->fc[-1] = (fftdata) freqobj->low_cut;                        /* 1st channel at cutoff */
4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  i = ((int)freqobj->low_cut + 50) / 100 + 1;              /* other channels at x00Hz */
4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (freqobj->nf = 0; i <= 10; i++, freqobj->nf++)
4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    freqobj->fc[freqobj->nf] = (fftdata)(100 * i);          /* 100 Hz */
4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (f = 1000.; f <= high_cut; freqobj->nf++)
4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    f *= (float)1.1; /* 10% */
4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    freqobj->fc[freqobj->nf] = (fftdata) fixed_round(f);        /* 10 % */
4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->nf--;
4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ((freqobj->fc[freqobj->nf] + freqobj->fc[freqobj->nf-1]) / 2. > high_cut)
4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    freqobj->nf--;
4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->fc[freqobj->nf] = (fftdata) high_cut;
4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->fc[freqobj->nf+1] = (fftdata) high_cut;
4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if DEBUG
4304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  write_frames(freqobj->nf + 1, 1, freqobj->fc, D_FLOAT);
4314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i <= freqobj->cut_off_below; i++)
4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    freqobj->framp[i] = 0;
4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->fcscl[0] = 0;
4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->fcmid[0] = freqobj->cut_off_below;
4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  f = (freqobj->cut_off_below + 1) * finc;
4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0, j = freqobj->cut_off_below + 1; i <= freqobj->nf; i++)
4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    freqobj->fcscl[i+1] = (fftdata) 0.0;
4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (; f < freqobj->fc[i] && f < (float) high_cut; f += finc, j++)
4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      t = (f - freqobj->fc[i-1]) / (freqobj->fc[i] - freqobj->fc[i-1]);
4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      freqobj->framp[j] = (fftdata) fixed_point_convert(t, RAMP_SHIFT); /* scale it up by 12 bits, (16 - 4) */
4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      freqobj->fcscl[i] += (fftdata) SHIFT_UP(1, RAMP_SHIFT) - freqobj->framp[j];    /* scale it up by 12 bits as well () */
4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      freqobj->fcscl[i+1] += freqobj->framp[j];       /* scale it up by 12 bits as well () */
4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (j > freqobj->cut_off_above)
4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      freqobj->fcmid[i+1] = freqobj->cut_off_above;
4504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
4514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      freqobj->fcmid[i+1] = j;
4524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*  Put in a check to validate the range of fcscl[] for fixed point f/e
4544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  */
4554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if DEBUG
4564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  write_frames(freqobj->nf, 1, freqobj->fcmid, D_LONG);
4574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  write_frames(freqobj->nf, 1, freqobj->fcscl, D_LONG);
4584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  write_frames(freqobj->ns, 1, freqobj->framp, D_LONG);
4594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
4604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (mel_dim > freqobj->nf)
4624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SERVICE_ERROR(BAD_COSINE_TRANSFORM);
4634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (freqobj->nf > NF)
4654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SERVICE_ERROR(BAD_COSINE_TRANSFORM);
4664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*  Weighting function construction */
4684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  freqobj->ham = (fftdata *) CALLOC(freqobj->window_length + 1,
4694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                          sizeof(fftdata), "cfront.ham");
4704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hamming_window(freqobj->ham, freqobj->window_length);
4714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*  Sine tables for FFT */
4734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if DEBUG
4754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define log_report printf
4764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  log_report("fc\n");
4774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  write_scaled_frames(freqobj->nf + 1, 1, freqobj->fc, D_FIXED, 1);
4784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  log_report("framp\n");
4804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  write_scaled_frames(freqobj->ns, 1, freqobj->framp, D_FIXED, 1);
4814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
4824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  create_spectrum_filter(freqobj, parameters->spectrum_filter_freq,
4844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                         parameters->spectrum_filter_spread);
4854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (freqobj->spectrum_filter_num == 0)
4864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    clear_spectrum_filter(freqobj);
4874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
4884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
4894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void hamming_window(fftdata *ham, int win_len)
4914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*
4924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**  add Hamming window on speech data */
4934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
4944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int     i;
4954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  double  f;
4964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  double  coef;
4974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  f = (2 * M_PI) / win_len;
4994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i <= win_len; i++)
5004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    coef = 0.54 - 0.46 * cos(f * (double)i);
5024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ham[i] = (fftdata) fixed_point_convert((float)coef,
5034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                           HALF_FFTDATA_SIZE - 1);
5044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
5064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void clear_freq_object(front_freq *freqobj)
5094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(freqobj);
5114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (freqobj->ham)
5124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE((char *)freqobj->ham);
5144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    freqobj->ham = NULL;
5154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  unconfigure_fft(&freqobj->fft);
5174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (freqobj->spectrum_filter_num > 0)
5194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    clear_spectrum_filter(freqobj);
5204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
5214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void reset_freq_object(front_freq *freqobj)
5244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(freqobj);
5264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
5274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/******************************************************************************
5314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**  CEPSTRAL OBJECT
5324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project*******************************************************************************/
5334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic front_cep *create_cep_object(void)
5344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  front_cep *cepobj;
5364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj = (front_cep *) CALLOC_CLR(1, sizeof(front_cep), "cfront.cepobj");
5374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return cepobj;
5384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void delete_cep_object(front_cep *cepobj)
5424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(cepobj);
5444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE((char *) cepobj);
5454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
5464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void setup_cep_object(front_cep *cepobj, front_parameters *parameters,
5494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                             size_t num_fb, size_t mel_dim)
5504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  float f;
5524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t i, j;
5534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(cepobj);
5554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(parameters);
5564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->mel_dim = mel_dim;
5574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->do_dd_mel = parameters->do_dd_mel;
5584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->do_skip_even_frames = parameters->do_skip_even_frames;
5594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->do_smooth_c0 = parameters->do_smooth_c0;
5604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->sv6_margin = parameters->sv6_margin;
5614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->forget_factor = parameters->forget_factor;
5624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->spectral_sub_frame_dur = parameters->spectral_sub_frame_dur;
5634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->spec_sub_scale = (coefdata) fixed_point_convert(
5644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                             parameters->spec_sub_scale, COEFDATA_SHIFT);
5654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->lpc_order  = parameters->lpc_order;
5664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->mel_offset = (cepdata *) CALLOC(MEL_FREQ_ARRAY_SIZE,
5694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                       sizeof(cepdata), "cfront.mel_offset");
5704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->mel_loop = (cepdata *) CALLOC(MEL_FREQ_ARRAY_SIZE,
5714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                     sizeof(cepdata), "cfront.mel_loop");
5724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->melA_scale = (cepdata *) CALLOC(cepobj->mel_dim + 1,
5734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                       sizeof(cepdata), "cfront.melA_scale");
5744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->dmelA_scale = (cepdata *) CALLOC(cepobj->mel_dim + 1,
5754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                        sizeof(cepdata), "cfront.dmelA_scale");
5764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->ddmelA_scale = (cepdata *) CALLOC(cepobj->mel_dim + 1,
5774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                         sizeof(cepdata), "cfront.ddmelA_scale");
5784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->melB_scale = (cepdata *) CALLOC(cepobj->mel_dim + 1,
5794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                       sizeof(cepdata), "cfront.melB_scale");
5804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->dmelB_scale = (cepdata *) CALLOC(cepobj->mel_dim + 1,
5814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                        sizeof(cepdata), "cfront.dmelB_scale");
5824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->ddmelB_scale = (cepdata *) CALLOC(cepobj->mel_dim + 1,
5834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                         sizeof(cepdata), "cfront.ddmelB_scale");
5844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->rastaA_scale = (cepdata *) CALLOC(cepobj->mel_dim + 1,
5854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                         sizeof(cepdata), "cfront.rastaA_scale");
5864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->rastaB_scale = (cepdata *) CALLOC(cepobj->mel_dim + 1,
5874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                         sizeof(cepdata), "cfront.rastaB_scale");
5884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->do_scales = True; /* Hack so default scalings are loaded */
5904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < MEL_FREQ_ARRAY_SIZE; ++i)
5924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cepobj->mel_offset[i] = (cepdata) parameters->mel_offset[i];
5944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cepobj->mel_loop[i] = (cepdata) parameters->mel_loop[i];
5954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i <= cepobj->mel_dim; ++i)
5984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cepobj->melA_scale[i] = (cepdata) parameters->melA_scale[i];
6004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cepobj->dmelA_scale[i] = (cepdata) parameters->dmelA_scale[i];
6014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cepobj->ddmelA_scale[i] = (cepdata) parameters->ddmelA_scale[i];
6024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cepobj->melB_scale[i] = (cepdata) parameters->melB_scale[i];
6034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cepobj->dmelB_scale[i] = (cepdata) parameters->dmelB_scale[i];
6044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cepobj->ddmelB_scale[i] = (cepdata) parameters->ddmelB_scale[i];
6054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cepobj->rastaA_scale[i] = (cepdata) parameters->rastaA_scale[i];
6064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cepobj->rastaB_scale[i] = (cepdata) parameters->rastaB_scale[i];
6074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cepobj->melA_scale[i] = (cepdata) fixed_point_convert((float) parameters->melA_scale[i],
6084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                            BYTERANGE_SHIFT);
6094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cepobj->dmelA_scale[i] = (cepdata) fixed_point_convert((float) parameters->dmelA_scale[i],
6104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                             BYTERANGE_SHIFT);
6114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cepobj->ddmelA_scale[i] = (cepdata) fixed_point_convert((float) parameters->ddmelA_scale[i],
6124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                              BYTERANGE_SHIFT);
6134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cepobj->melB_scale[i] = (cepdata) fixed_point_convert((float) parameters->melB_scale[i],
6144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                            BYTERANGE_SHIFT + LOG_SCALE_SHIFT);
6154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cepobj->dmelB_scale[i] = (cepdata) fixed_point_convert((float) parameters->dmelB_scale[i],
6164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                             BYTERANGE_SHIFT + LOG_SCALE_SHIFT);
6174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cepobj->ddmelB_scale[i] = (cepdata) fixed_point_convert((float) parameters->ddmelB_scale[i],
6184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                              BYTERANGE_SHIFT + LOG_SCALE_SHIFT);
6194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cepobj->rastaA_scale[i] = (cepdata) fixed_point_convert((float) parameters->rastaA_scale[i],
6204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                              BYTERANGE_SHIFT);
6214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cepobj->rastaB_scale[i] = (cepdata) fixed_point_convert((float) parameters->rastaB_scale[i],
6224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                              BYTERANGE_SHIFT + LOG_SCALE_SHIFT);
6234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Now allocate space for the cosine matrix. Previously fixed. */
6264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  f = (float)(M_PI / num_fb);
6274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->cs = (cepdata *) CALLOC(num_fb * num_fb, sizeof(cepdata), "cfront.cosine_matrix");
6284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < num_fb; ++i)
6294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
6304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (j = 0; j < num_fb; ++j) /* TODO: fixedpt cosine matrix */
6314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      cepobj->cs[i*(num_fb)+j] = (cepdata) fixed_point_convert(
6324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                   (float)(cos((double)(i * (j + .5) * f)) / num_fb),
6334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                   COSINE_TABLE_SHIFT); /* balanced after icostrans */
6344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  create_lookup_log(&cepobj->logtab, 12);   /* TODO: rename 12 as macro */
6364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  reset_cep_object(cepobj);
6374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
6384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
6394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void reset_cep_object(front_cep *cepobj)
6424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
6434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(cepobj);
6444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
6454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
6464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void clear_cep_object(front_cep *cepobj)
6494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
6504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT(cepobj);
6514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (cepobj->melA_scale)
6524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE((char*)cepobj->melA_scale);
6534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->melA_scale = NULL; /* Set to null in either case, for simplicity */
6544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (cepobj->dmelA_scale)
6554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE((char*)cepobj->dmelA_scale);
6564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->dmelA_scale = NULL;
6574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (cepobj->ddmelA_scale)
6584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE((char*)cepobj->ddmelA_scale);
6594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->ddmelA_scale = NULL;
6604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (cepobj->melB_scale)
6614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE((char*)cepobj->melB_scale);
6624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->melB_scale = NULL;
6634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (cepobj->dmelB_scale)
6644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE((char*)cepobj->dmelB_scale);
6654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->dmelB_scale = NULL;
6664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (cepobj->ddmelB_scale)
6674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE((char*)cepobj->ddmelB_scale);
6684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->ddmelB_scale = NULL;
6694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (cepobj->rastaA_scale)
6704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE((char*)cepobj->rastaA_scale);
6714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->rastaA_scale = NULL;
6724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (cepobj->rastaB_scale)
6734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE((char*)cepobj->rastaB_scale);
6744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->rastaB_scale = NULL;
6754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (cepobj->cs)
6764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE((char *) cepobj->cs);
6774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->cs = NULL;
6784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (cepobj->mel_offset)
6794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE((char*)cepobj->mel_offset);
6804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->mel_offset = NULL;
6814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (cepobj->mel_loop)
6824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE((char*)cepobj->mel_loop);
6834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepobj->mel_loop = NULL;
6844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  destroy_lookup_log(&cepobj->logtab);
6854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
6864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
687