/*
 *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
 *
 *  Use of this source code is governed by a BSD-style license
 *  that can be found in the LICENSE file in the root of the source
 *  tree. An additional intellectual property rights grant can be found
 *  in the file PATENTS.  All contributing project authors may
 *  be found in the AUTHORS file in the root of the source tree.
 */

/*
 * pitch_estimator.h
 *
 * Pitch functions
 *
 */

#ifndef MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_PITCH_ESTIMATOR_H_
#define MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_PITCH_ESTIMATOR_H_

#include "structs.h"



void WebRtcIsac_PitchAnalysis(const double *in,               /* PITCH_FRAME_LEN samples */
                              double *out,                    /* PITCH_FRAME_LEN+QLOOKAHEAD samples */
                              PitchAnalysisStruct *State,
                              double *lags,
                              double *gains);

void WebRtcIsac_InitializePitch(const double *in,
                                const double old_lag,
                                const double old_gain,
                                PitchAnalysisStruct *State,
                                double *lags);

void WebRtcIsac_PitchfilterPre(double *indat,
                               double *outdat,
                               PitchFiltstr *pfp,
                               double *lags,
                               double *gains);

void WebRtcIsac_PitchfilterPost(double *indat,
                                double *outdat,
                                PitchFiltstr *pfp,
                                double *lags,
                                double *gains);

void WebRtcIsac_PitchfilterPre_la(double *indat,
                                  double *outdat,
                                  PitchFiltstr *pfp,
                                  double *lags,
                                  double *gains);

void WebRtcIsac_PitchfilterPre_gains(double *indat,
                                     double *outdat,
                                     double out_dG[][PITCH_FRAME_LEN + QLOOKAHEAD],
                                     PitchFiltstr *pfp,
                                     double *lags,
                                     double *gains);

void WebRtcIsac_WeightingFilter(const double *in, double *weiout, double *whiout, WeightFiltstr *wfdata);

void WebRtcIsac_Highpass(const double *in,
                         double *out,
                         double *state,
                         size_t N);

void WebRtcIsac_DecimateAllpass(const double *in,
                                double *state_in,  /* array of size:
                                                    *     2*ALLPASSSECTIONS+1 */
                                size_t N,          /* number of input samples */
                                double *out);      /* array of size N/2 */

#endif /* MODULES_AUDIO_CODING_CODECS_ISAC_MAIN_SOURCE_PITCH_ESTIMATOR_H_ */
