• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_NS_CORE_H_
12 #define WEBRTC_MODULES_AUDIO_PROCESSING_NS_NS_CORE_H_
13 
14 #include "webrtc/modules/audio_processing/ns/defines.h"
15 
16 typedef struct NSParaExtract_ {
17   // Bin size of histogram.
18   float binSizeLrt;
19   float binSizeSpecFlat;
20   float binSizeSpecDiff;
21   // Range of histogram over which LRT threshold is computed.
22   float rangeAvgHistLrt;
23   // Scale parameters: multiply dominant peaks of the histograms by scale factor
24   // to obtain thresholds for prior model.
25   float factor1ModelPars;  // For LRT and spectral difference.
26   float factor2ModelPars;  // For spectral_flatness: used when noise is flatter
27                            // 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
31   // bin size.
32   float limitPeakSpacingSpecFlat;
33   float limitPeakSpacingSpecDiff;
34   // Limit on relevance of second peak.
35   float limitPeakWeightsSpecFlat;
36   float limitPeakWeightsSpecDiff;
37   // Limit on fluctuation of LRT feature.
38   float thresFluctLrt;
39   // Limit on the max and min values for the feature thresholds.
40   float maxLrt;
41   float minLrt;
42   float maxSpecFlat;
43   float minSpecFlat;
44   float maxSpecDiff;
45   float minSpecDiff;
46   // Criteria of weight of histogram peak to accept/reject feature.
47   int thresWeightSpecFlat;
48   int thresWeightSpecDiff;
49 
50 } NSParaExtract;
51 
52 typedef struct NoiseSuppressionC_ {
53   uint32_t fs;
54   size_t blockLen;
55   size_t windShift;
56   size_t anaLen;
57   size_t magnLen;
58   int aggrMode;
59   const float* window;
60   float analyzeBuf[ANAL_BLOCKL_MAX];
61   float dataBuf[ANAL_BLOCKL_MAX];
62   float syntBuf[ANAL_BLOCKL_MAX];
63 
64   int initFlag;
65   // Parameters for quantile noise estimation.
66   float density[SIMULT * HALF_ANAL_BLOCKL];
67   float lquantile[SIMULT * HALF_ANAL_BLOCKL];
68   float quantile[HALF_ANAL_BLOCKL];
69   int counter[SIMULT];
70   int updates;
71   // Parameters for Wiener filter.
72   float smooth[HALF_ANAL_BLOCKL];
73   float overdrive;
74   float denoiseBound;
75   int gainmap;
76   // FFT work arrays.
77   size_t ip[IP_LENGTH];
78   float wfft[W_LENGTH];
79 
80   // Parameters for new method: some not needed, will reduce/cleanup later.
81   int32_t blockInd;  // Frame index counter.
82   int modelUpdatePars[4];  // Parameters for updating or estimating.
83   // Thresholds/weights for prior model.
84   float priorModelPars[7];  // Parameters for prior model.
85   float noise[HALF_ANAL_BLOCKL];  // Noise spectrum from current frame.
86   float noisePrev[HALF_ANAL_BLOCKL];  // Noise spectrum from previous frame.
87   // Magnitude spectrum of previous analyze frame.
88   float magnPrevAnalyze[HALF_ANAL_BLOCKL];
89   // Magnitude spectrum of previous process frame.
90   float magnPrevProcess[HALF_ANAL_BLOCKL];
91   float logLrtTimeAvg[HALF_ANAL_BLOCKL];  // Log LRT factor with time-smoothing.
92   float priorSpeechProb;  // Prior speech/noise probability.
93   float featureData[7];
94   // Conservative noise spectrum estimate.
95   float magnAvgPause[HALF_ANAL_BLOCKL];
96   float signalEnergy;  // Energy of |magn|.
97   float sumMagn;
98   float whiteNoiseLevel;  // Initial noise estimate.
99   float initMagnEst[HALF_ANAL_BLOCKL];  // Initial magnitude spectrum estimate.
100   float pinkNoiseNumerator;  // Pink noise parameter: numerator.
101   float pinkNoiseExp;  // Pink noise parameter: power of frequencies.
102   float parametricNoise[HALF_ANAL_BLOCKL];
103   // Parameters for feature extraction.
104   NSParaExtract featureExtractionParams;
105   // Histograms for parameter estimation.
106   int histLrt[HIST_PAR_EST];
107   int histSpecFlat[HIST_PAR_EST];
108   int histSpecDiff[HIST_PAR_EST];
109   // Quantities for high band estimate.
110   float speechProb[HALF_ANAL_BLOCKL];  // Final speech/noise prob: prior + LRT.
111   // Buffering data for HB.
112   float dataBufHB[NUM_HIGH_BANDS_MAX][ANAL_BLOCKL_MAX];
113 
114 } NoiseSuppressionC;
115 
116 #ifdef __cplusplus
117 extern "C" {
118 #endif
119 
120 /****************************************************************************
121  * WebRtcNs_InitCore(...)
122  *
123  * This function initializes a noise suppression instance
124  *
125  * Input:
126  *      - self          : Instance that should be initialized
127  *      - fs            : Sampling frequency
128  *
129  * Output:
130  *      - self          : Initialized instance
131  *
132  * Return value         :  0 - Ok
133  *                        -1 - Error
134  */
135 int WebRtcNs_InitCore(NoiseSuppressionC* self, uint32_t fs);
136 
137 /****************************************************************************
138  * WebRtcNs_set_policy_core(...)
139  *
140  * This changes the aggressiveness of the noise suppression method.
141  *
142  * Input:
143  *      - self          : Instance that should be initialized
144  *      - mode          : 0: Mild (6dB), 1: Medium (10dB), 2: Aggressive (15dB)
145  *
146  * Output:
147  *      - self          : Initialized instance
148  *
149  * Return value         :  0 - Ok
150  *                        -1 - Error
151  */
152 int WebRtcNs_set_policy_core(NoiseSuppressionC* self, int mode);
153 
154 /****************************************************************************
155  * WebRtcNs_AnalyzeCore
156  *
157  * Estimate the background noise.
158  *
159  * Input:
160  *      - self          : Instance that should be initialized
161  *      - speechFrame   : Input speech frame for lower band
162  *
163  * Output:
164  *      - self          : Updated instance
165  */
166 void WebRtcNs_AnalyzeCore(NoiseSuppressionC* self, const float* speechFrame);
167 
168 /****************************************************************************
169  * WebRtcNs_ProcessCore
170  *
171  * Do noise suppression.
172  *
173  * Input:
174  *      - self          : Instance that should be initialized
175  *      - inFrame       : Input speech frame for each band
176  *      - num_bands     : Number of bands
177  *
178  * Output:
179  *      - self          : Updated instance
180  *      - outFrame      : Output speech frame for each band
181  */
182 void WebRtcNs_ProcessCore(NoiseSuppressionC* self,
183                           const float* const* inFrame,
184                           size_t num_bands,
185                           float* const* outFrame);
186 
187 #ifdef __cplusplus
188 }
189 #endif
190 #endif  // WEBRTC_MODULES_AUDIO_PROCESSING_NS_NS_CORE_H_
191