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