blob: bd751322adf988292bf3fa76bb328b027123b73b [file] [log] [blame]
/*---------------------------------------------------------------------------*
* front.h *
* *
* Copyright 2007, 2008 Nuance Communciations, Inc. *
* *
* Licensed under the Apache License, Version 2.0 (the 'License'); *
* you may not use this file except in compliance with the License. *
* *
* You may obtain a copy of the License at *
* http://www.apache.org/licenses/LICENSE-2.0 *
* *
* Unless required by applicable law or agreed to in writing, software *
* distributed under the License is distributed on an 'AS IS' BASIS, *
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
* See the License for the specific language governing permissions and *
* limitations under the License. *
* *
*---------------------------------------------------------------------------*/
#ifndef _h_front_
#define _h_front_
#include "all_defs.h"
#include "fronttyp.h"
#include "log_tabl.h"
#include "duk_err.h"
#include "voicing.h"
#include "specnorm.h"
#include "channorm.h"
#include "swicms.h"
#ifndef _RTT
#include "duk_io.h"
#endif
#include "fft.h"
#include "frontpar.h" /* Shared front end parameters structure. Native data types only. */
#define SPEC_SUB 0
#define SPEC_CORRECT 0
#define BIGGER_WINDOW 0
#define MIN_WARP_SCALE 0.5
#define MAX_WARP_SCALE 1.5
#define D_FIXED D_LONG
#define FRAMERATE 100
#define NUM_MEL_FREQS 30 /* up to 3750 Hz. Now >5512 -BP */
#define DELTA 3
#define Q2 7
#define NP 1025
#define NF 40
#define NC 40
#define MEL_FREQ_ARRAY_SIZE 30
/* Spectral sub def moved from spec_sub.c BP */
#ifdef SET_RCSID
static const char spec_sub_h[] = "$Id: front.h,v 1.2.10.9 2007/08/31 17:44:53 dahan Exp $";
#endif
/**
* @todo document
*/
typedef struct
{
cepdata *sub_vector;
int is_valid;
unsigned int frame_dur;
cepdata scale;
unsigned int count;
}
spectral_sub_info;
/**
* Contains the data storage points associated with a channel.
*/
typedef struct
{
size_t mel_dim;
/* WAVE data */
int buff_size;
samdata *outbuff; /* incoming samples buffer */
samdata *refbuff; /* outgoing samples buffer */
fftdata *prebuff; /* buffer for preemphasised data */
fftdata *prerefbuff; /* buffer for preemphasised data outgoing */
int forget_factor;
norm_info *channorm;
swicms_norm_info *swicms;
spect_dist_info *spchchan[MAX_CHAN_DIM];
/* FREQ data */
int shift;
int num_freq;
cepdata *filterbank;
cepdata *filterbankref;
spectral_sub_info *spectral_sub;
/* CEP data */
int frame_valid; /* whether frame is valid */
long frame_count; /* frame count */
int frame_delay; /* ignore the first few frames */
cepdata *cep; /* cepstrum coefs. of prev. frames */
cepdata *rasta;
featdata *framdata;
bigdata lastx;
}
front_channel;
/* This is where the front end objects are defined
WAVE (front_wave)
FREQ (front_freq)
CEP (front_cep)
*/
/**
* @todo document
*/
typedef struct
{
size_t samdim;
int samtyp;
int samplerate;
coefdata pre_mel;
int high_clip;
int low_clip;
int max_per10000_clip;
int max_dc_offset;
int high_noise_level_bit;
int low_speech_level_bit;
int min_samples;
}
front_wave;
/**
* FREQ object.
*/
typedef struct
{
int window_length;
int samplerate;
int framerate;
int frame_period; /* the following 3 are private */
ESR_BOOL do_spectral_sub;
int do_nonlinear_filter;
ESR_BOOL do_filterbank_input;
ESR_BOOL do_filterbank_dump;
float warp_scale; /*## */
float piecewise_start; /*## */
int low_cut;
int high_cut;
int num_fb_to_use;
int *spectrum_filter; /* List of FFT taps to filter */
int spectrum_filter_num;
fftdata peakpickup;
fftdata peakpickdown;
int cut_off_below, cut_off_above;
int np, ns, nf, lognp;
fftdata fcb[NF];
fftdata *fc;
int fcmid[NF+2];
fftdata fcscl[NF+1], framp[NP+1];
fftdata *ham;
fft_info fft;
}
front_freq;
/**
* CEP object.
*/
typedef struct
{
ESR_BOOL do_dd_mel;
ESR_BOOL do_rasta;
int do_scales;
ESR_BOOL do_plp;
size_t mel_dim;
int lpc_order;
ESR_BOOL do_skip_even_frames;
ESR_BOOL do_smooth_c0;
int spectral_sub_frame_dur;
coefdata spec_sub_scale;
int forget_factor; /* preserve % of previous hist */
int sv6_margin;
cepdata *melA_scale;
cepdata *melB_scale;
cepdata *dmelA_scale;
cepdata *dmelB_scale;
cepdata *ddmelA_scale;
cepdata *ddmelB_scale;
cepdata *rastaA_scale;
cepdata *rastaB_scale;
cepdata *mel_offset;
cepdata *mel_loop;
cepdata *cs;
log_table_info logtab;
}
front_cep;
/**
* @todo document
*/
typedef struct
{
front_wave *waveobj;
front_freq *freqobj;
front_cep *cepobj;
/* Internal memberrs that may need to be configurable. Currently constants
size_t mel_dim;
*/
}
front_config;
/* Front end function declarations follow */
front_config *config_frontend(void);
int make_frame(front_channel *channel, front_wave *waveobj,
front_freq *freqobj, front_cep *cepobj,
voicing_info *voice,
samdata *inFramesWorth, samdata *refFramesWorth,
int num_samples,
featdata *framdata, featdata *voicedata);
void standard_front_init(front_config *config, front_freq *freqobj);
void init_cepstrum_analysis(front_config *config, front_freq *freqobj);
void load_samples(front_channel *channel, int window_length,
samdata *incom, samdata *outgo, int nsam);
void filterbank_emulation(front_channel * channel, front_wave *waveobj,
front_freq *freqobj, front_cep *cepobj, samdata *income, samdata *outgo,
int num_samples);
void cepstrum_params(front_channel *channel, front_wave *waveobj,
front_freq *freqobj, front_cep *cepobj);
int make_std_frame(front_channel *channel, front_cep *cepobj,
featdata *hFrame);
int purge_std_frames(front_channel *channel, front_cep *cepobj,
featdata *hFrame, int frame);
void init_spectral_sub(front_config *config, front_freq *freqobj);
void close_spectral_sub(front_freq *freqobj);
void reset_spectral_sub(front_freq *freqobj);
void do_spectral_subtraction(cepdata *fbo, spectral_sub_info* spectral_sub,
int num_freqs);
int create_spectrum_filter(front_freq *freqobj, int *freq, int *spread);
void clear_spectrum_filter(front_freq *freqobj);
front_config *create_config_object(void) ;
void setup_config_object(front_config *config, front_parameters *parameters);
void clear_config_object(front_config *config);
void delete_config_object(front_config *config);
front_channel *create_channel_object(void) ;
void delete_channel_object(front_channel *channel);
void setup_channel_object(front_channel *channel, front_wave *waveobj,
front_freq *freqobj, front_cep *cepobj);
void clear_channel_object(front_channel *channel);
void reset_channel_object(front_channel *channel);
/*
** Fixed pont front end
**
** Function: Scaling (in bit shifts)
**
** preemphasis -1
** hamming-window 0
** fft 0
** magnitude HFN
** filterbank 0
**
** log
** cosine HFN-
** regression 0
** scaling
*/
#endif /* _h_front_ */