/*
 *  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.
 */

#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_NS_NS_CORE_H_
#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_NS_CORE_H_

#include "webrtc/modules/audio_processing/ns/defines.h"

typedef struct NSParaExtract_t_ {
  // bin size of histogram
  float binSizeLrt;
  float binSizeSpecFlat;
  float binSizeSpecDiff;
  // range of histogram over which lrt threshold is computed
  float rangeAvgHistLrt;
  // scale parameters: multiply dominant peaks of the histograms by scale factor
  // to obtain thresholds for prior model
  float factor1ModelPars;  // for lrt and spectral difference
  float factor2ModelPars;  // for spectral_flatness: used when noise is flatter
                           // than speech
  // peak limit for spectral flatness (varies between 0 and 1)
  float thresPosSpecFlat;
  // limit on spacing of two highest peaks in histogram: spacing determined by
  // bin size
  float limitPeakSpacingSpecFlat;
  float limitPeakSpacingSpecDiff;
  // limit on relevance of second peak:
  float limitPeakWeightsSpecFlat;
  float limitPeakWeightsSpecDiff;
  // limit on fluctuation of lrt feature
  float thresFluctLrt;
  // limit on the max and min values for the feature thresholds
  float maxLrt;
  float minLrt;
  float maxSpecFlat;
  float minSpecFlat;
  float maxSpecDiff;
  float minSpecDiff;
  // criteria of weight of histogram peak  to accept/reject feature
  int thresWeightSpecFlat;
  int thresWeightSpecDiff;

} NSParaExtract_t;

typedef struct NSinst_t_ {
  uint32_t fs;
  int blockLen;
  int blockLen10ms;
  int windShift;
  int outLen;
  int anaLen;
  int magnLen;
  int aggrMode;
  const float* window;
  float analyzeBuf[ANAL_BLOCKL_MAX];
  float dataBuf[ANAL_BLOCKL_MAX];
  float syntBuf[ANAL_BLOCKL_MAX];
  float outBuf[3 * BLOCKL_MAX];

  int initFlag;
  // parameters for quantile noise estimation
  float density[SIMULT * HALF_ANAL_BLOCKL];
  float lquantile[SIMULT * HALF_ANAL_BLOCKL];
  float quantile[HALF_ANAL_BLOCKL];
  int counter[SIMULT];
  int updates;
  // parameters for Wiener filter
  float previousEstimateStsa[HALF_ANAL_BLOCKL];
  float smooth[HALF_ANAL_BLOCKL];
  float overdrive;
  float denoiseBound;
  int gainmap;
  // fft work arrays.
  int ip[IP_LENGTH];
  float wfft[W_LENGTH];

  // parameters for new method: some not needed, will reduce/cleanup later
  int32_t blockInd;  // frame index counter
  int modelUpdatePars[4];  // parameters for updating or estimating
  // thresholds/weights for prior model
  float priorModelPars[7];  // parameters for prior model
  float noisePrev[HALF_ANAL_BLOCKL];  // noise spectrum from previous frame
  float magnPrev[HALF_ANAL_BLOCKL];  // magnitude spectrum of previous frame
  float logLrtTimeAvg[HALF_ANAL_BLOCKL];  // log lrt factor with time-smoothing
  float priorSpeechProb;  // prior speech/noise probability
  float featureData[7];  // data for features
  float magnAvgPause[HALF_ANAL_BLOCKL];  // conservative noise spectrum estimate
  float signalEnergy;  // energy of magn
  float sumMagn;  // sum of magn
  float whiteNoiseLevel;  // initial noise estimate
  float initMagnEst[HALF_ANAL_BLOCKL];  // initial magnitude spectrum estimate
  float pinkNoiseNumerator;  // pink noise parameter: numerator
  float pinkNoiseExp;  // pink noise parameter: power of freq
  float parametricNoise[HALF_ANAL_BLOCKL];
  NSParaExtract_t featureExtractionParams;  // parameters for feature extraction
  // histograms for parameter estimation
  int histLrt[HIST_PAR_EST];
  int histSpecFlat[HIST_PAR_EST];
  int histSpecDiff[HIST_PAR_EST];
  // quantities for high band estimate
  float speechProb[HALF_ANAL_BLOCKL];  // final speech/noise prob: prior + LRT
  float dataBufHB[ANAL_BLOCKL_MAX];  // buffering data for HB

} NSinst_t;

#ifdef __cplusplus
extern "C" {
#endif

/****************************************************************************
 * WebRtcNs_InitCore(...)
 *
 * This function initializes a noise suppression instance
 *
 * Input:
 *      - inst          : Instance that should be initialized
 *      - fs            : Sampling frequency
 *
 * Output:
 *      - inst          : Initialized instance
 *
 * Return value         :  0 - Ok
 *                        -1 - Error
 */
int WebRtcNs_InitCore(NSinst_t* inst, uint32_t fs);

/****************************************************************************
 * WebRtcNs_set_policy_core(...)
 *
 * This changes the aggressiveness of the noise suppression method.
 *
 * Input:
 *      - inst          : Instance that should be initialized
 *      - mode          : 0: Mild (6dB), 1: Medium (10dB), 2: Aggressive (15dB)
 *
 * Output:
 *      - NS_inst      : Initialized instance
 *
 * Return value         :  0 - Ok
 *                        -1 - Error
 */
int WebRtcNs_set_policy_core(NSinst_t* inst, int mode);

/****************************************************************************
 * WebRtcNs_AnalyzeCore
 *
 * Estimate the background noise.
 *
 * Input:
 *      - inst          : Instance that should be initialized
 *      - speechFrame   : Input speech frame for lower band
 *
 * Output:
 *      - inst          : Updated instance
 *
 * Return value         :  0 - OK
 *                        -1 - Error
 */
int WebRtcNs_AnalyzeCore(NSinst_t* inst, float* speechFrame);

/****************************************************************************
 * WebRtcNs_ProcessCore
 *
 * Do noise suppression.
 *
 * Input:
 *      - inst          : Instance that should be initialized
 *      - inFrameLow    : Input speech frame for lower band
 *      - inFrameHigh   : Input speech frame for higher band
 *
 * Output:
 *      - inst          : Updated instance
 *      - outFrameLow   : Output speech frame for lower band
 *      - outFrameHigh  : Output speech frame for higher band
 *
 * Return value         :  0 - OK
 *                        -1 - Error
 */
int WebRtcNs_ProcessCore(NSinst_t* inst,
                         float* inFrameLow,
                         float* inFrameHigh,
                         float* outFrameLow,
                         float* outFrameHigh);

#ifdef __cplusplus
}
#endif
#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_NS_NS_CORE_H_
