14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  chelmel4.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#include <stdlib.h>
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef _RTT
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdio.h>
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string.h>
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <math.h>
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <limits.h>
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <assert.h>
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "hmm_desc.h"
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "front.h"
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "portable.h"
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DEBUG           0
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define LOG_AS_PRINT 0
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define LPCMAX 100
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if LOG_AS_PRINT /* BP temp hack */
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define log_report printf
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "sh_down.h"
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* cepstrum_params has been broken into three functions:
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project filterbank_emulation    - does preemp, window, fft and filtbank
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project gain_adjustment                 - estimates gain
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project cepstrum_params                 - does gain adj.(if on), spec corr and cos transform
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   This enables us to bypass gain adjustment.
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project*/
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//static void mel_cuberoot_offset(cepdata *fbo, cepdata *ch_off, int nf);
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if SPEC_CORRECT
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void mel_spectrum_correction(cepdata *fbo, cepdata *ch_gain, int nf);
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void mel_loglookup_with_offset(front_cep *cepobj,
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                      front_channel *channel);
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//static void mel_exp(cepdata *fbo, int nf);
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//static void durbin(cepdata *a, cepdata *r, int n);
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//static void lpc_to_cepstral_recursion(cepdata *c, cepdata *a, int nc, int n);
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void icostrans(cepdata *cs, cepdata fb[], cepdata cep[], int nf, int nc);
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid cepstrum_params(front_channel *channel, front_wave *waveobj,
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                     front_freq *freqobj, front_cep *cepobj)
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if SPEC_CORRECT
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*  2.30 Apply a spectrum correction */
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (cepobj->mel_loop)
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    mel_spectrum_correction(freqobj->filterbank, cepobj->mel_loop, channel->num_freq);
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*  2.33 Calculate log dB energy values */
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    mel_loglookup_with_offset(cepobj, channel);
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if DEBUG
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  log_report("Filterbank output: ");
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  write_scaled_frames(freqobj->nf, 1, channel->filterbank, D_FIXED, 1 / (float)LOG_SCALE);
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*  2.34 Cosine transformation */
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  icostrans(cepobj->cs, channel->filterbank, channel->cep,
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            channel->num_freq, cepobj->mel_dim);
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if DEBUG
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  log_report("Cepstrum coefficients: ");
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  write_scaled_frames((cepobj->mel_dim + 1), 1, channel->cep, D_FIXED, (float)1 / (0x01 << (LOG_SCALE_SHIFT + COSINE_TABLE_SHIFT)));
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void icostrans(cepdata *cs, cepdata fb[], cepdata cep[], int nf, int nc)
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**  inv rotated-cosine transform
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**  ref Davis and Mermelstein, ASSP 1980 */
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int   i, j;
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepdata *cp;
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cepdata temp;
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i <= nc; i++)
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cp = &cs[i*nf];
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (j = 0, temp = 0; j < nf; j++)
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      temp += fb[j] * cp[j];
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    cep[i] = temp;
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if SPEC_CORRECT
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void mel_spectrum_correction(cepdata *fbo, cepdata *ch_gain, int nf)
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**  pwr spect -> filter bank output */
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i;
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0;i < nf; i++)
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    fbo[i] = fbo[i] * ch_gain[i]; /* TODO: Fixedpt scale up and down */
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic void mel_loglookup_with_offset(front_cep *cepobj,
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                      front_channel *channel)
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project**  pwr spect -> filter bank output */
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int ii;
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (channel->shift > 0)
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (ii = 0; ii < channel->num_freq; ii++)
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      channel->filterbank[ii] = (cepdata) log_lookup(&cepobj->logtab,
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                (int)(channel->filterbank[ii] +
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                      SHIFT_DOWN(cepobj->mel_offset[ii], channel->shift)),
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                channel->shift);
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (ii = 0; ii < channel->num_freq; ii++)
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      channel->filterbank[ii] = (cepdata) log_lookup(&cepobj->logtab,
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                (int)(channel->filterbank[ii] +
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                      SHIFT_UP(cepobj->mel_offset[ii], -channel->shift)),
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                channel->shift);
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return;
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//static void mel_exp(cepdata *fbo, int nf)
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project///*
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//**  pwr spect -> filter bank output */
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//{
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  int i;
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  for (i = 0; i < nf; i++)
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  {
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    fbo[i] = (cepdata) exp((double) fbo[i]);
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  }
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  return;
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//}
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//static void durbin(
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  cepdata *a,   /* lpc coefficients           */
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  cepdata *r,   /* autocorrelation coefficients       */
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  int n)     /* order of lpc analysis        */
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//{
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  int i, j;
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  cepdata A[LPCMAX+1][LPCMAX+1], sum;
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  cepdata k[LPCMAX+1];
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  cepdata e[LPCMAX+1];
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  e[0] = r[0];
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  for (i = 1; i <= n; i++)
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  {
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    sum = 0;
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    for (j = 1; j <= (i - 1); j++)
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    {
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//      sum += A[j][i-1] * r[i-j];
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    }
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    k[i] = -(r[i] + sum) / e[i-1];
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    A[i][i] = k[i] ;
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    for (j = 1; j <= (i - 1); j++)
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    {
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//      A[j][i] = A[j][i-1] + k[i] * A[i-j][i-1];
1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    }
1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    e[i] = (1 - k[i] * k[i]) * e[i-1];
1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  }
1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  for (j = 1 ; j <= n; j++)
1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  {
1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    a[j] = A[j][n];
1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  }
1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  a[0] = (cepdata) 1.0 ;
1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  return;
1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//}
1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//static void lpc_to_cepstral_recursion(
2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  cepdata *c,     /* cepstral coefficients        */
2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  cepdata *a,     /* lpc coeffiecients            */
2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  int nc,         /* order of cepstra             */
2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  int n)          /* order of lpc                 */
2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//{
2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  int k, i;
2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  cepdata sum;
2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  ASSERT(nc < LPCMAX);
2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  for (i = n + 1; i <= nc; i++)
2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  {
2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    a[i] = (cepdata) 0.0;
2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  }
2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  /* if lpc order less    */
2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  /* than cepstral order  */
2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  /* define higher lpccos */
2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//
2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  for (i = 1; i <= nc; i++)
2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  {
2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    sum = (cepdata) 0.0;
2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    for (k = 1; k <= (i - 1); k++)
2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    {
2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//      sum = sum + k * c[k] * a[i-k]; /* TODO: fixedpt range for mult */
2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    }
2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    c[i] = -a[i] - (sum / i);               /* cepstral calculated  */
2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    /* to <=nc in icostrans */
2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//    /* so I shall do the    */                                                      /* same here            */
2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//  }
2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//}
2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
231