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_NS_CORE_H_
12 #define WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NS_CORE_H_
13 
14 #include "defines.h"
15 
16 typedef struct NSParaExtract_t_ {
17 
18   //bin size of histogram
19   float binSizeLrt;
20   float binSizeSpecFlat;
21   float binSizeSpecDiff;
22   //range of histogram over which lrt threshold is computed
23   float rangeAvgHistLrt;
24   //scale parameters: multiply dominant peaks of the histograms by scale factor to obtain
25   //thresholds for prior model
26   float factor1ModelPars; //for lrt and spectral difference
27   float factor2ModelPars; //for spectral_flatness: used when noise is flatter than speech
28   //peak limit for spectral flatness (varies between 0 and 1)
29   float thresPosSpecFlat;
30   //limit on spacing of two highest peaks in histogram: spacing determined by bin size
31   float limitPeakSpacingSpecFlat;
32   float limitPeakSpacingSpecDiff;
33   //limit on relevance of second peak:
34   float limitPeakWeightsSpecFlat;
35   float limitPeakWeightsSpecDiff;
36   //limit on fluctuation of lrt feature
37   float thresFluctLrt;
38   //limit on the max and min values for the feature thresholds
39   float maxLrt;
40   float minLrt;
41   float maxSpecFlat;
42   float minSpecFlat;
43   float maxSpecDiff;
44   float minSpecDiff;
45   //criteria of weight of histogram peak  to accept/reject feature
46   int thresWeightSpecFlat;
47   int thresWeightSpecDiff;
48 
49 } NSParaExtract_t;
50 
51 typedef struct NSinst_t_ {
52 
53   WebRtc_UWord32  fs;
54   int             blockLen;
55   int             blockLen10ms;
56   int             windShift;
57   int             outLen;
58   int             anaLen;
59   int             magnLen;
60   int             aggrMode;
61   const float*    window;
62   float           dataBuf[ANAL_BLOCKL_MAX];
63   float           syntBuf[ANAL_BLOCKL_MAX];
64   float           outBuf[3 * BLOCKL_MAX];
65 
66   int             initFlag;
67   // parameters for quantile noise estimation
68   float           density[SIMULT* HALF_ANAL_BLOCKL];
69   float           lquantile[SIMULT* HALF_ANAL_BLOCKL];
70   float           quantile[HALF_ANAL_BLOCKL];
71   int             counter[SIMULT];
72   int             updates;
73   // parameters for Wiener filter
74   float           smooth[HALF_ANAL_BLOCKL];
75   float           overdrive;
76   float           denoiseBound;
77   int             gainmap;
78   // fft work arrays.
79   int             ip[IP_LENGTH];
80   float           wfft[W_LENGTH];
81 
82   // parameters for new method: some not needed, will reduce/cleanup later
83   WebRtc_Word32   blockInd;                           //frame index counter
84   int             modelUpdatePars[4];                 //parameters for updating or estimating
85   // thresholds/weights for prior model
86   float           priorModelPars[7];                  //parameters for prior model
87   float           noisePrev[HALF_ANAL_BLOCKL];        //noise spectrum from previous frame
88   float           magnPrev[HALF_ANAL_BLOCKL];         //magnitude spectrum of previous frame
89   float           logLrtTimeAvg[HALF_ANAL_BLOCKL];    //log lrt factor with time-smoothing
90   float           priorSpeechProb;                    //prior speech/noise probability
91   float           featureData[7];                     //data for features
92   float           magnAvgPause[HALF_ANAL_BLOCKL];     //conservative noise spectrum estimate
93   float           signalEnergy;                       //energy of magn
94   float           sumMagn;                            //sum of magn
95   float           whiteNoiseLevel;                    //initial noise estimate
96   float           initMagnEst[HALF_ANAL_BLOCKL];      //initial magnitude spectrum estimate
97   float           pinkNoiseNumerator;                 //pink noise parameter: numerator
98   float           pinkNoiseExp;                       //pink noise parameter: power of freq
99   NSParaExtract_t featureExtractionParams;            //parameters for feature extraction
100   //histograms for parameter estimation
101   int             histLrt[HIST_PAR_EST];
102   int             histSpecFlat[HIST_PAR_EST];
103   int             histSpecDiff[HIST_PAR_EST];
104   //quantities for high band estimate
105   float           speechProbHB[HALF_ANAL_BLOCKL];     //final speech/noise prob: prior + LRT
106   float           dataBufHB[ANAL_BLOCKL_MAX];         //buffering data for HB
107 
108 } NSinst_t;
109 
110 
111 #ifdef __cplusplus
112 extern "C" {
113 #endif
114 
115 /****************************************************************************
116  * WebRtcNs_InitCore(...)
117  *
118  * This function initializes a noise suppression instance
119  *
120  * Input:
121  *      - inst          : Instance that should be initialized
122  *      - fs            : Sampling frequency
123  *
124  * Output:
125  *      - inst          : Initialized instance
126  *
127  * Return value         :  0 - Ok
128  *                        -1 - Error
129  */
130 int WebRtcNs_InitCore(NSinst_t* inst, WebRtc_UWord32 fs);
131 
132 /****************************************************************************
133  * WebRtcNs_set_policy_core(...)
134  *
135  * This changes the aggressiveness of the noise suppression method.
136  *
137  * Input:
138  *      - inst          : Instance that should be initialized
139  *      - mode          : 0: Mild (6 dB), 1: Medium (10 dB), 2: Aggressive (15 dB)
140  *
141  * Output:
142  *      - NS_inst      : Initialized instance
143  *
144  * Return value         :  0 - Ok
145  *                        -1 - Error
146  */
147 int WebRtcNs_set_policy_core(NSinst_t* inst, int mode);
148 
149 /****************************************************************************
150  * WebRtcNs_ProcessCore
151  *
152  * Do noise suppression.
153  *
154  * Input:
155  *      - inst          : Instance that should be initialized
156  *      - inFrameLow    : Input speech frame for lower band
157  *      - inFrameHigh   : Input speech frame for higher band
158  *
159  * Output:
160  *      - inst          : Updated instance
161  *      - outFrameLow   : Output speech frame for lower band
162  *      - outFrameHigh  : Output speech frame for higher band
163  *
164  * Return value         :  0 - OK
165  *                        -1 - Error
166  */
167 
168 
169 int WebRtcNs_ProcessCore(NSinst_t* inst,
170                          short* inFrameLow,
171                          short* inFrameHigh,
172                          short* outFrameLow,
173                          short* outFrameHigh);
174 
175 
176 #ifdef __cplusplus
177 }
178 #endif
179 #endif  // WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NS_CORE_H_
180