1 /*
2  *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #ifndef WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_CORE_H_
12 #define WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_CORE_H_
13 
14 #include "typedefs.h"
15 #include "signal_processing_library.h"
16 
17 #include "nsx_defines.h"
18 
19 #ifdef NS_FILEDEBUG
20 #include <stdio.h>
21 #endif
22 
23 typedef struct NsxInst_t_ {
24   WebRtc_UWord32          fs;
25 
26   const WebRtc_Word16*    window;
27   WebRtc_Word16           analysisBuffer[ANAL_BLOCKL_MAX];
28   WebRtc_Word16           synthesisBuffer[ANAL_BLOCKL_MAX];
29   WebRtc_UWord16          noiseSupFilter[HALF_ANAL_BLOCKL];
30   WebRtc_UWord16          overdrive; /* Q8 */
31   WebRtc_UWord16          denoiseBound; /* Q14 */
32   const WebRtc_Word16*    factor2Table;
33   WebRtc_Word16           noiseEstLogQuantile[SIMULT* HALF_ANAL_BLOCKL];
34   WebRtc_Word16           noiseEstDensity[SIMULT* HALF_ANAL_BLOCKL];
35   WebRtc_Word16           noiseEstCounter[SIMULT];
36   WebRtc_Word16           noiseEstQuantile[HALF_ANAL_BLOCKL];
37 
38   WebRtc_Word16           anaLen;
39   int                     anaLen2;
40   int                     magnLen;
41   int                     aggrMode;
42   int                     stages;
43   int                     initFlag;
44   int                     gainMap;
45 
46   WebRtc_Word32           maxLrt;
47   WebRtc_Word32           minLrt;
48   WebRtc_Word32           logLrtTimeAvgW32[HALF_ANAL_BLOCKL]; //log lrt factor with time-smoothing in Q8
49   WebRtc_Word32           featureLogLrt;
50   WebRtc_Word32           thresholdLogLrt;
51   WebRtc_Word16           weightLogLrt;
52 
53   WebRtc_UWord32          featureSpecDiff;
54   WebRtc_UWord32          thresholdSpecDiff;
55   WebRtc_Word16           weightSpecDiff;
56 
57   WebRtc_UWord32          featureSpecFlat;
58   WebRtc_UWord32          thresholdSpecFlat;
59   WebRtc_Word16           weightSpecFlat;
60 
61   WebRtc_Word32           avgMagnPause[HALF_ANAL_BLOCKL]; //conservative estimate of noise spectrum
62   WebRtc_UWord32          magnEnergy;
63   WebRtc_UWord32          sumMagn;
64   WebRtc_UWord32          curAvgMagnEnergy;
65   WebRtc_UWord32          timeAvgMagnEnergy;
66   WebRtc_UWord32          timeAvgMagnEnergyTmp;
67 
68   WebRtc_UWord32          whiteNoiseLevel;              //initial noise estimate
69   WebRtc_UWord32          initMagnEst[HALF_ANAL_BLOCKL];//initial magnitude spectrum estimate
70   WebRtc_Word32           pinkNoiseNumerator;           //pink noise parameter: numerator
71   WebRtc_Word32           pinkNoiseExp;                 //pink noise parameter: power of freq
72   int                     minNorm;                      //smallest normalization factor
73   int                     zeroInputSignal;              //zero input signal flag
74 
75   WebRtc_UWord32          prevNoiseU32[HALF_ANAL_BLOCKL]; //noise spectrum from previous frame
76   WebRtc_UWord16          prevMagnU16[HALF_ANAL_BLOCKL]; //magnitude spectrum from previous frame
77   WebRtc_Word16           priorNonSpeechProb; //prior speech/noise probability // Q14
78 
79   int                     blockIndex; //frame index counter
80   int                     modelUpdate; //parameter for updating or estimating thresholds/weights for prior model
81   int                     cntThresUpdate;
82 
83   //histograms for parameter estimation
84   WebRtc_Word16           histLrt[HIST_PAR_EST];
85   WebRtc_Word16           histSpecFlat[HIST_PAR_EST];
86   WebRtc_Word16           histSpecDiff[HIST_PAR_EST];
87 
88   //quantities for high band estimate
89   WebRtc_Word16           dataBufHBFX[ANAL_BLOCKL_MAX]; /* Q0 */
90 
91   int                     qNoise;
92   int                     prevQNoise;
93   int                     prevQMagn;
94   int                     blockLen10ms;
95 
96   WebRtc_Word16           real[ANAL_BLOCKL_MAX];
97   WebRtc_Word16           imag[ANAL_BLOCKL_MAX];
98   WebRtc_Word32           energyIn;
99   int                     scaleEnergyIn;
100   int                     normData;
101 
102 } NsxInst_t;
103 
104 #ifdef __cplusplus
105 extern "C"
106 {
107 #endif
108 
109 /****************************************************************************
110  * WebRtcNsx_InitCore(...)
111  *
112  * This function initializes a noise suppression instance
113  *
114  * Input:
115  *      - inst          : Instance that should be initialized
116  *      - fs            : Sampling frequency
117  *
118  * Output:
119  *      - inst          : Initialized instance
120  *
121  * Return value         :  0 - Ok
122  *                        -1 - Error
123  */
124 WebRtc_Word32 WebRtcNsx_InitCore(NsxInst_t* inst, WebRtc_UWord32 fs);
125 
126 /****************************************************************************
127  * WebRtcNsx_set_policy_core(...)
128  *
129  * This changes the aggressiveness of the noise suppression method.
130  *
131  * Input:
132  *      - inst       : Instance that should be initialized
133  *      - mode       : 0: Mild (6 dB), 1: Medium (10 dB), 2: Aggressive (15 dB)
134  *
135  * Output:
136  *      - inst       : Initialized instance
137  *
138  * Return value      :  0 - Ok
139  *                     -1 - Error
140  */
141 int WebRtcNsx_set_policy_core(NsxInst_t* inst, int mode);
142 
143 /****************************************************************************
144  * WebRtcNsx_ProcessCore
145  *
146  * Do noise suppression.
147  *
148  * Input:
149  *      - inst          : Instance that should be initialized
150  *      - inFrameLow    : Input speech frame for lower band
151  *      - inFrameHigh   : Input speech frame for higher band
152  *
153  * Output:
154  *      - inst          : Updated instance
155  *      - outFrameLow   : Output speech frame for lower band
156  *      - outFrameHigh  : Output speech frame for higher band
157  *
158  * Return value         :  0 - OK
159  *                        -1 - Error
160  */
161 int WebRtcNsx_ProcessCore(NsxInst_t* inst,
162                           short* inFrameLow,
163                           short* inFrameHigh,
164                           short* outFrameLow,
165                           short* outFrameHigh);
166 
167 /****************************************************************************
168  * Some function pointers, for internal functions shared by ARM NEON and
169  * generic C code.
170  */
171 // Noise Estimation.
172 typedef void (*NoiseEstimation)(NsxInst_t* inst,
173                                 uint16_t* magn,
174                                 uint32_t* noise,
175                                 int16_t* q_noise);
176 extern NoiseEstimation WebRtcNsx_NoiseEstimation;
177 
178 // Filter the data in the frequency domain, and create spectrum.
179 typedef void (*PrepareSpectrum)(NsxInst_t* inst,
180                                 int16_t* freq_buff);
181 extern PrepareSpectrum WebRtcNsx_PrepareSpectrum;
182 
183 // For the noise supression process, synthesis, read out fully processed
184 // segment, and update synthesis buffer.
185 typedef void (*SynthesisUpdate)(NsxInst_t* inst,
186                                 int16_t* out_frame,
187                                 int16_t gain_factor);
188 extern SynthesisUpdate WebRtcNsx_SynthesisUpdate;
189 
190 // Update analysis buffer for lower band, and window data before FFT.
191 typedef void (*AnalysisUpdate)(NsxInst_t* inst,
192                                int16_t* out,
193                                int16_t* new_speech);
194 extern AnalysisUpdate WebRtcNsx_AnalysisUpdate;
195 
196 // Denormalize the input buffer.
197 typedef void (*Denormalize)(NsxInst_t* inst,
198                             int16_t* in,
199                             int factor);
200 extern Denormalize WebRtcNsx_Denormalize;
201 
202 // Create a complex number buffer, as the intput interleaved with zeros,
203 // and normalize it.
204 typedef void (*CreateComplexBuffer)(NsxInst_t* inst,
205                                     int16_t* in,
206                                     int16_t* out);
207 extern CreateComplexBuffer WebRtcNsx_CreateComplexBuffer;
208 
209 /****************************************************************************
210  * Initialization of the above function pointers for ARM Neon.
211  */
212 void WebRtcNsx_InitNeon(void);
213 
214 extern const WebRtc_Word16 WebRtcNsx_kLogTable[9];
215 extern const WebRtc_Word16 WebRtcNsx_kLogTableFrac[256];
216 extern const WebRtc_Word16 WebRtcNsx_kCounterDiv[201];
217 
218 #ifdef __cplusplus
219 }
220 #endif
221 
222 #endif  // WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_CORE_H_
223