1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/*
2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Copyright (c) 2012 The WebRTC project authors. All Rights Reserved.
3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  Use of this source code is governed by a BSD-style license
5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  that can be found in the LICENSE file in the root of the source
6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  tree. An additional intellectual property rights grant can be found
7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  in the file PATENTS.  All contributing project authors may
8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_CORE_H_
12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_CORE_H_
13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef NS_FILEDEBUG
15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <stdio.h>
16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
18bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org#include "webrtc/common_audio/signal_processing/include/signal_processing_library.h"
19bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org#include "webrtc/modules/audio_processing/ns/nsx_defines.h"
20bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org#include "webrtc/typedefs.h"
21bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org
22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef struct NsxInst_t_ {
233f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  uint32_t                fs;
243f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org
253f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  const int16_t*          window;
263f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int16_t                 analysisBuffer[ANAL_BLOCKL_MAX];
273f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int16_t                 synthesisBuffer[ANAL_BLOCKL_MAX];
283f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  uint16_t                noiseSupFilter[HALF_ANAL_BLOCKL];
293f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  uint16_t                overdrive; /* Q8 */
303f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  uint16_t                denoiseBound; /* Q14 */
313f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  const int16_t*          factor2Table;
323f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int16_t                 noiseEstLogQuantile[SIMULT* HALF_ANAL_BLOCKL];
333f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int16_t                 noiseEstDensity[SIMULT* HALF_ANAL_BLOCKL];
343f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int16_t                 noiseEstCounter[SIMULT];
353f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int16_t                 noiseEstQuantile[HALF_ANAL_BLOCKL];
36b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
37aecc559aad6adc94be5f25fed8847fa7be066488kma@webrtc.org  int                     anaLen;
38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int                     anaLen2;
39b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int                     magnLen;
40b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int                     aggrMode;
41b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int                     stages;
42b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int                     initFlag;
43b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int                     gainMap;
44b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
453f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int32_t                 maxLrt;
463f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int32_t                 minLrt;
47bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org  // Log LRT factor with time-smoothing in Q8.
483f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int32_t                 logLrtTimeAvgW32[HALF_ANAL_BLOCKL];
493f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int32_t                 featureLogLrt;
503f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int32_t                 thresholdLogLrt;
513f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int16_t                 weightLogLrt;
52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
533f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  uint32_t                featureSpecDiff;
543f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  uint32_t                thresholdSpecDiff;
553f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int16_t                 weightSpecDiff;
56b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
573f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  uint32_t                featureSpecFlat;
583f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  uint32_t                thresholdSpecFlat;
593f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int16_t                 weightSpecFlat;
60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
61bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org  // Conservative estimate of noise spectrum.
623f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int32_t                 avgMagnPause[HALF_ANAL_BLOCKL];
633f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  uint32_t                magnEnergy;
643f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  uint32_t                sumMagn;
653f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  uint32_t                curAvgMagnEnergy;
663f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  uint32_t                timeAvgMagnEnergy;
673f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  uint32_t                timeAvgMagnEnergyTmp;
683f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org
693f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  uint32_t                whiteNoiseLevel;  // Initial noise estimate.
70bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org  // Initial magnitude spectrum estimate.
713f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  uint32_t                initMagnEst[HALF_ANAL_BLOCKL];
72bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org  // Pink noise parameters:
733f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int32_t                 pinkNoiseNumerator;  // Numerator.
743f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int32_t                 pinkNoiseExp;  // Power of freq.
75bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org  int                     minNorm;  // Smallest normalization factor.
76bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org  int                     zeroInputSignal;  // Zero input signal flag.
77bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org
78bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org  // Noise spectrum from previous frame.
793f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  uint32_t                prevNoiseU32[HALF_ANAL_BLOCKL];
80bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org  // Magnitude spectrum from previous frame.
813f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  uint16_t                prevMagnU16[HALF_ANAL_BLOCKL];
82bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org  // Prior speech/noise probability in Q14.
833f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int16_t                 priorNonSpeechProb;
84bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org
85bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org  int                     blockIndex;  // Frame index counter.
86bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org  // Parameter for updating or estimating thresholds/weights for prior model.
87bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org  int                     modelUpdate;
88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int                     cntThresUpdate;
89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
90bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org  // Histograms for parameter estimation.
913f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int16_t                 histLrt[HIST_PAR_EST];
923f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int16_t                 histSpecFlat[HIST_PAR_EST];
933f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int16_t                 histSpecDiff[HIST_PAR_EST];
94b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
95bc2021598db16f4355c064bad9355bb73d59456fbjornv@webrtc.org  // Quantities for high band estimate.
963f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int16_t                 dataBufHBFX[ANAL_BLOCKL_MAX];  // Q0
97b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int                     qNoise;
99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int                     prevQNoise;
100b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int                     prevQMagn;
101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int                     blockLen10ms;
102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
1033f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int16_t                 real[ANAL_BLOCKL_MAX];
1043f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int16_t                 imag[ANAL_BLOCKL_MAX];
1053f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.org  int32_t                 energyIn;
106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int                     scaleEnergyIn;
107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  int                     normData;
108b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org  struct RealFFT* real_fft;
110b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} NsxInst_t;
111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
112b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef __cplusplus
113b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgextern "C"
114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{
115b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
117b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/****************************************************************************
118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * WebRtcNsx_InitCore(...)
119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * This function initializes a noise suppression instance
121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Input:
123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *      - inst          : Instance that should be initialized
124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *      - fs            : Sampling frequency
125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Output:
127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *      - inst          : Initialized instance
128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
129b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Return value         :  0 - Ok
130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *                        -1 - Error
131b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
1323f6d5e0bded85b8b0d055da8fa49e8d7137fe8edpbos@webrtc.orgint32_t WebRtcNsx_InitCore(NsxInst_t* inst, uint32_t fs);
133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/****************************************************************************
135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * WebRtcNsx_set_policy_core(...)
136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * This changes the aggressiveness of the noise suppression method.
138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Input:
140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *      - inst       : Instance that should be initialized
141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *      - mode       : 0: Mild (6 dB), 1: Medium (10 dB), 2: Aggressive (15 dB)
142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Output:
144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *      - inst       : Initialized instance
145b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
146b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Return value      :  0 - Ok
147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *                     -1 - Error
148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint WebRtcNsx_set_policy_core(NsxInst_t* inst, int mode);
150b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/****************************************************************************
152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * WebRtcNsx_ProcessCore
153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Do noise suppression.
155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Input:
157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *      - inst          : Instance that should be initialized
158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *      - inFrameLow    : Input speech frame for lower band
159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *      - inFrameHigh   : Input speech frame for higher band
160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Output:
162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *      - inst          : Updated instance
163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *      - outFrameLow   : Output speech frame for lower band
164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *      - outFrameHigh  : Output speech frame for higher band
165b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *
166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Return value         :  0 - OK
167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *                        -1 - Error
168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
169b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgint WebRtcNsx_ProcessCore(NsxInst_t* inst,
170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          short* inFrameLow,
171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          short* inFrameHigh,
172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          short* outFrameLow,
173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                          short* outFrameHigh);
174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/****************************************************************************
176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Some function pointers, for internal functions shared by ARM NEON and
177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * generic C code.
178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */
179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Noise Estimation.
180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef void (*NoiseEstimation)(NsxInst_t* inst,
181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                uint16_t* magn,
182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                uint32_t* noise,
183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                int16_t* q_noise);
184b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgextern NoiseEstimation WebRtcNsx_NoiseEstimation;
185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
186b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Filter the data in the frequency domain, and create spectrum.
187b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef void (*PrepareSpectrum)(NsxInst_t* inst,
188b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                int16_t* freq_buff);
189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgextern PrepareSpectrum WebRtcNsx_PrepareSpectrum;
190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// For the noise supression process, synthesis, read out fully processed
192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// segment, and update synthesis buffer.
193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef void (*SynthesisUpdate)(NsxInst_t* inst,
194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                int16_t* out_frame,
195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                int16_t gain_factor);
196b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgextern SynthesisUpdate WebRtcNsx_SynthesisUpdate;
197b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// Update analysis buffer for lower band, and window data before FFT.
199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgtypedef void (*AnalysisUpdate)(NsxInst_t* inst,
200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               int16_t* out,
201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                               int16_t* new_speech);
202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgextern AnalysisUpdate WebRtcNsx_AnalysisUpdate;
203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
204556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org// Denormalize the real-valued signal |in|, the output from inverse FFT.
205556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.orgtypedef void (*Denormalize) (NsxInst_t* inst, int16_t* in, int factor);
206556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.orgextern Denormalize WebRtcNsx_Denormalize;
207556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org
208556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org// Normalize the real-valued signal |in|, the input to forward FFT.
209556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.orgtypedef void (*NormalizeRealBuffer) (NsxInst_t* inst,
210556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org                                     const int16_t* in,
211556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org                                     int16_t* out);
212556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.orgextern NormalizeRealBuffer WebRtcNsx_NormalizeRealBuffer;
213556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org
214556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org// Compute speech/noise probability.
215556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org// Intended to be private.
216556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.orgvoid WebRtcNsx_SpeechNoiseProb(NsxInst_t* inst,
217556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org                               uint16_t* nonSpeechProbFinal,
218556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org                               uint32_t* priorLocSnr,
219556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org                               uint32_t* postLocSnr);
220556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org
221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#if (defined WEBRTC_DETECT_ARM_NEON) || defined (WEBRTC_ARCH_ARM_NEON)
222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// For the above function pointers, functions for generic platforms are declared
223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// and defined as static in file nsx_core.c, while those for ARM Neon platforms
224b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org// are declared below and defined in file nsx_core_neon.S.
225b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcNsx_NoiseEstimationNeon(NsxInst_t* inst,
226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                   uint16_t* magn,
227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                   uint32_t* noise,
228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                   int16_t* q_noise);
229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcNsx_SynthesisUpdateNeon(NsxInst_t* inst,
230b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                   int16_t* out_frame,
231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                   int16_t gain_factor);
232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcNsx_AnalysisUpdateNeon(NsxInst_t* inst,
233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                  int16_t* out,
234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org                                  int16_t* new_speech);
235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.orgvoid WebRtcNsx_PrepareSpectrumNeon(NsxInst_t* inst, int16_t* freq_buff);
236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
238556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org#if defined(MIPS32_LE)
239556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org// For the above function pointers, functions for generic platforms are declared
240556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org// and defined as static in file nsx_core.c, while those for MIPS platforms
241556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org// are declared below and defined in file nsx_core_mips.c.
242556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.orgvoid WebRtcNsx_SynthesisUpdate_mips(NsxInst_t* inst,
243556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org                                    int16_t* out_frame,
244556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org                                    int16_t gain_factor);
245556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.orgvoid WebRtcNsx_AnalysisUpdate_mips(NsxInst_t* inst,
246556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org                                   int16_t* out,
247556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org                                   int16_t* new_speech);
248556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.orgvoid WebRtcNsx_PrepareSpectrum_mips(NsxInst_t* inst, int16_t* freq_buff);
249556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.orgvoid WebRtcNsx_NormalizeRealBuffer_mips(NsxInst_t* inst,
250556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org                                        const int16_t* in,
251556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org                                        int16_t* out);
252556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org#if defined(MIPS_DSP_R1_LE)
253556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.orgvoid WebRtcNsx_Denormalize_mips(NsxInst_t* inst, int16_t* in, int factor);
254556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org#endif
255556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org
256556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org#endif
257556423fc442dd37b8140a86b87f818ba2de4931bandrew@webrtc.org
258b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#ifdef __cplusplus
259b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org}
260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif
261b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org
262b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_CORE_H_
263