blob: dbd26c46d062522e8d4ad172f8958327dbbfc727 [file] [log] [blame]
/*---------------------------------------------------------------------------*
* chelfep.c *
* *
* 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 _RTT
#include <stdio.h>
#endif
#include <stdlib.h>
#include <string.h>
#ifdef unix
#include <unistd.h>
#endif
#include <assert.h>
#ifndef _RTT
#include "duk_io.h"
#endif
#include "voicing.h"
#include "front.h"
#include "portable.h"
#include "../clib/memmove.h"
#include "sh_down.h"
#define SMOOTH_C0_FOR_VOICING 1
#if SMOOTH_C0_FOR_VOICING
static featdata smoothed_c0(front_cep *cepobj, front_channel *channel);
#endif
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)
{
#if SMOOTH_C0_FOR_VOICING
featdata smooth_c0;
#endif
if (freqobj->do_filterbank_input)
/* This memmove is in filterbank_emulation */
MEMMOVE(channel->cep + (channel->mel_dim + 1), channel->cep,
(Q2 - 1) *(channel->mel_dim + 1), sizeof(float));
else
{
/* not fb input */
/* JFR data processing is no longer supported. BP 21-Jul98. */
/* 2. CEP data processing */
filterbank_emulation(channel, waveobj, freqobj, cepobj,
inFramesWorth, refFramesWorth, num_samples);
/* if doing fb dump then skip frame making. A top level will
read channel->fbo and dump it. */
if (freqobj->do_filterbank_dump)
return True;
}
cepstrum_params(channel, waveobj, freqobj, cepobj);
/* 4. Delta CEP data processing */
(void) make_std_frame(channel, cepobj, framdata);
if (!channel->frame_valid)
return (channel->frame_valid);
/* 5. Voicing analysis */
if (channel->frame_valid)
{
if (voice != NULL)
{
#if SMOOTH_C0_FOR_VOICING
if (cepobj->do_smooth_c0)
{
smooth_c0 = smoothed_c0(cepobj, channel);
*voicedata = (featdata) voicing_analysis(voice, smooth_c0, NULL);
}
else
*voicedata = (featdata) voicing_analysis(voice, framdata[0], NULL);
#else
*voicedata = (featdata) voicing_analysis(voice, framdata[0], NULL);
#endif
}
if (cepobj->do_skip_even_frames)
channel->frame_valid = (channel->frame_count) % 2;
}
return (channel->frame_valid);
}
static featdata smoothed_c0(front_cep *cepobj, front_channel *channel)
{
cepdata val;
featdata fval;
bigdata scval;
if (channel->frame_count <= 1)
val = channel->cep[DELTA * (channel->mel_dim+1)];
else
{
val = (channel->cep[(DELTA-1) * (channel->mel_dim+1)] >> 2)
+ (channel->cep[DELTA * (channel->mel_dim+1)] >> 1)
+ (channel->cep[(DELTA+1) * (channel->mel_dim+1)] >> 2);
}
/* Now scaling and byteranging
*/
/* Now take the costable scaling off the ceps. */
ASSERT((cepobj->melA_scale[0] *(float)SHIFT_DOWN(val, COSINE_TABLE_SHIFT))
< LONG_MAX);
ASSERT((cepobj->melA_scale[0] *(float)SHIFT_DOWN(val, COSINE_TABLE_SHIFT))
> -LONG_MAX);
scval = (bigdata)(SHIFT_DOWN((bigdata)cepobj->melA_scale[0]
* (bigdata) SHIFT_DOWN(val, COSINE_TABLE_SHIFT)
+ (bigdata)cepobj->melB_scale[0], BYTERANGE_SHIFT + LOG_SCALE_SHIFT));
fval = (featdata) MAKEBYTE(scval);
return (fval);
}