1470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/*
2470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  Copyright (c) 2011 The WebRTC project authors. All Rights Reserved.
3470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
4470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  Use of this source code is governed by a BSD-style license
5470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  that can be found in the LICENSE file in the root of the source
6470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  tree. An additional intellectual property rights grant can be found
7470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  in the file PATENTS.  All contributing project authors may
8470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *  be found in the AUTHORS file in the root of the source tree.
9470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
10470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
11bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org#ifndef WEBRTC_MODULES_AUDIO_PROCESSING_NS_NS_CORE_H_
12bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org#define WEBRTC_MODULES_AUDIO_PROCESSING_NS_NS_CORE_H_
13470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
147fad4b8c9f1e9a6e3de9962fb74d4953b4f1bb03pbos@webrtc.org#include "webrtc/modules/audio_processing/ns/defines.h"
15470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
16e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.orgtypedef struct NSParaExtract_ {
1728b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Bin size of histogram.
18af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org  float binSizeLrt;
19af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org  float binSizeSpecFlat;
20af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org  float binSizeSpecDiff;
2128b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Range of histogram over which LRT threshold is computed.
22af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org  float rangeAvgHistLrt;
2328b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Scale parameters: multiply dominant peaks of the histograms by scale factor
2428b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // to obtain thresholds for prior model.
2528b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  float factor1ModelPars;  // For LRT and spectral difference.
2628b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  float factor2ModelPars;  // For spectral_flatness: used when noise is flatter
2728b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org                           // than speech.
2828b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Peak limit for spectral flatness (varies between 0 and 1).
29af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org  float thresPosSpecFlat;
3028b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Limit on spacing of two highest peaks in histogram: spacing determined by
3128b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // bin size.
32af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org  float limitPeakSpacingSpecFlat;
33af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org  float limitPeakSpacingSpecDiff;
3428b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Limit on relevance of second peak.
35af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org  float limitPeakWeightsSpecFlat;
36af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org  float limitPeakWeightsSpecDiff;
3728b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Limit on fluctuation of LRT feature.
38af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org  float thresFluctLrt;
3928b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Limit on the max and min values for the feature thresholds.
40af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org  float maxLrt;
41af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org  float minLrt;
42af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org  float maxSpecFlat;
43af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org  float minSpecFlat;
44af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org  float maxSpecDiff;
45af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org  float minSpecDiff;
4628b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Criteria of weight of histogram peak to accept/reject feature.
47af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org  int thresWeightSpecFlat;
48af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org  int thresWeightSpecDiff;
49470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
50e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.org} NSParaExtract;
51470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
52e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.orgtypedef struct NoiseSuppressionC_ {
53bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  uint32_t fs;
54dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  size_t blockLen;
55dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  size_t windShift;
56dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  size_t anaLen;
57dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  size_t magnLen;
58bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  int aggrMode;
59bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  const float* window;
60bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  float analyzeBuf[ANAL_BLOCKL_MAX];
61bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  float dataBuf[ANAL_BLOCKL_MAX];
62bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  float syntBuf[ANAL_BLOCKL_MAX];
63bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org
64bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  int initFlag;
6528b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Parameters for quantile noise estimation.
66bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  float density[SIMULT * HALF_ANAL_BLOCKL];
67bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  float lquantile[SIMULT * HALF_ANAL_BLOCKL];
68bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  float quantile[HALF_ANAL_BLOCKL];
69bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  int counter[SIMULT];
70bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  int updates;
7128b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Parameters for Wiener filter.
72bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  float smooth[HALF_ANAL_BLOCKL];
73bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  float overdrive;
74bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  float denoiseBound;
75bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  int gainmap;
7628b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // FFT work arrays.
77dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting  size_t ip[IP_LENGTH];
78bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  float wfft[W_LENGTH];
79af57de006ac9dbb7b25bf83e1bae2d8da4359923kma@webrtc.org
8028b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Parameters for new method: some not needed, will reduce/cleanup later.
8128b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  int32_t blockInd;  // Frame index counter.
8228b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  int modelUpdatePars[4];  // Parameters for updating or estimating.
8328b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Thresholds/weights for prior model.
8428b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  float priorModelPars[7];  // Parameters for prior model.
8528b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  float noise[HALF_ANAL_BLOCKL];  // Noise spectrum from current frame.
8628b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  float noisePrev[HALF_ANAL_BLOCKL];  // Noise spectrum from previous frame.
8728b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Magnitude spectrum of previous analyze frame.
88b6af4283ca11a639f54d3475bf2a654097f8d287aluebs@webrtc.org  float magnPrevAnalyze[HALF_ANAL_BLOCKL];
8928b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Magnitude spectrum of previous process frame.
90b6af4283ca11a639f54d3475bf2a654097f8d287aluebs@webrtc.org  float magnPrevProcess[HALF_ANAL_BLOCKL];
9128b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  float logLrtTimeAvg[HALF_ANAL_BLOCKL];  // Log LRT factor with time-smoothing.
9228b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  float priorSpeechProb;  // Prior speech/noise probability.
9328b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  float featureData[7];
9428b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Conservative noise spectrum estimate.
9528b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  float magnAvgPause[HALF_ANAL_BLOCKL];
9628b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  float signalEnergy;  // Energy of |magn|.
9728b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  float sumMagn;
9828b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  float whiteNoiseLevel;  // Initial noise estimate.
9928b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  float initMagnEst[HALF_ANAL_BLOCKL];  // Initial magnitude spectrum estimate.
10028b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  float pinkNoiseNumerator;  // Pink noise parameter: numerator.
10128b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  float pinkNoiseExp;  // Pink noise parameter: power of frequencies.
102275dac2c1d3e8333a200e34e277d3061ba845d3ealuebs@webrtc.org  float parametricNoise[HALF_ANAL_BLOCKL];
10328b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Parameters for feature extraction.
104e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.org  NSParaExtract featureExtractionParams;
10528b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Histograms for parameter estimation.
106bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  int histLrt[HIST_PAR_EST];
107bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  int histSpecFlat[HIST_PAR_EST];
108bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org  int histSpecDiff[HIST_PAR_EST];
10928b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  // Quantities for high band estimate.
11028b54671cbb066b9b82301a015441491f6c95318aluebs@webrtc.org  float speechProb[HALF_ANAL_BLOCKL];  // Final speech/noise prob: prior + LRT.
111c5ebbd98f5996db0defbbfc14f5ca41e620bd7e4aluebs@webrtc.org  // Buffering data for HB.
112c5ebbd98f5996db0defbbfc14f5ca41e620bd7e4aluebs@webrtc.org  float dataBufHB[NUM_HIGH_BANDS_MAX][ANAL_BLOCKL_MAX];
113470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
114e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.org} NoiseSuppressionC;
115470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
116470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef __cplusplus
117470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.comextern "C" {
118470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
119470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
120470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
121470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcNs_InitCore(...)
122470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
123470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This function initializes a noise suppression instance
124470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
125470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
126ffeaeed8c1cd41f4bd107218b0f60b40cfb10252aluebs@webrtc.org *      - self          : Instance that should be initialized
127470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *      - fs            : Sampling frequency
128470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
129470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Output:
130ffeaeed8c1cd41f4bd107218b0f60b40cfb10252aluebs@webrtc.org *      - self          : Initialized instance
131470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
132470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value         :  0 - Ok
133470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                        -1 - Error
134470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
135e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.orgint WebRtcNs_InitCore(NoiseSuppressionC* self, uint32_t fs);
136470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
137470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
138470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcNs_set_policy_core(...)
139470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
140470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * This changes the aggressiveness of the noise suppression method.
141470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
142470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
143ffeaeed8c1cd41f4bd107218b0f60b40cfb10252aluebs@webrtc.org *      - self          : Instance that should be initialized
144bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org *      - mode          : 0: Mild (6dB), 1: Medium (10dB), 2: Aggressive (15dB)
145470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
146470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Output:
147ffeaeed8c1cd41f4bd107218b0f60b40cfb10252aluebs@webrtc.org *      - self          : Initialized instance
148470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
149470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Return value         :  0 - Ok
150470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *                        -1 - Error
151470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
152e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.orgint WebRtcNs_set_policy_core(NoiseSuppressionC* self, int mode);
153470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
154470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com/****************************************************************************
155fda2c2e810a815d98fe8b03e8c6687d14227b3ffaluebs@webrtc.org * WebRtcNs_AnalyzeCore
156fda2c2e810a815d98fe8b03e8c6687d14227b3ffaluebs@webrtc.org *
157fda2c2e810a815d98fe8b03e8c6687d14227b3ffaluebs@webrtc.org * Estimate the background noise.
158fda2c2e810a815d98fe8b03e8c6687d14227b3ffaluebs@webrtc.org *
159fda2c2e810a815d98fe8b03e8c6687d14227b3ffaluebs@webrtc.org * Input:
160ffeaeed8c1cd41f4bd107218b0f60b40cfb10252aluebs@webrtc.org *      - self          : Instance that should be initialized
161fbf3bfe1722b0af73dd77b2dcfa888597b3a1085aluebs@webrtc.org *      - speechFrame   : Input speech frame for lower band
162fda2c2e810a815d98fe8b03e8c6687d14227b3ffaluebs@webrtc.org *
163fda2c2e810a815d98fe8b03e8c6687d14227b3ffaluebs@webrtc.org * Output:
164ffeaeed8c1cd41f4bd107218b0f60b40cfb10252aluebs@webrtc.org *      - self          : Updated instance
165fda2c2e810a815d98fe8b03e8c6687d14227b3ffaluebs@webrtc.org */
166e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.orgvoid WebRtcNs_AnalyzeCore(NoiseSuppressionC* self, const float* speechFrame);
167fda2c2e810a815d98fe8b03e8c6687d14227b3ffaluebs@webrtc.org
168fda2c2e810a815d98fe8b03e8c6687d14227b3ffaluebs@webrtc.org/****************************************************************************
169470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * WebRtcNs_ProcessCore
170470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
171470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Do noise suppression.
172470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
173470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Input:
174ffeaeed8c1cd41f4bd107218b0f60b40cfb10252aluebs@webrtc.org *      - self          : Instance that should be initialized
175c5ebbd98f5996db0defbbfc14f5ca41e620bd7e4aluebs@webrtc.org *      - inFrame       : Input speech frame for each band
176c5ebbd98f5996db0defbbfc14f5ca41e620bd7e4aluebs@webrtc.org *      - num_bands     : Number of bands
177470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com *
178470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com * Output:
179ffeaeed8c1cd41f4bd107218b0f60b40cfb10252aluebs@webrtc.org *      - self          : Updated instance
180c5ebbd98f5996db0defbbfc14f5ca41e620bd7e4aluebs@webrtc.org *      - outFrame      : Output speech frame for each band
181470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com */
182e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.orgvoid WebRtcNs_ProcessCore(NoiseSuppressionC* self,
183e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.org                          const float* const* inFrame,
184dce40cf804019a9898b6ab8d8262466b697c56e0Peter Kasting                          size_t num_bands,
185e468bc9e604213054e5fc73431ee127ebe0211a8pbos@webrtc.org                          float* const* outFrame);
186470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com
187470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#ifdef __cplusplus
188470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com}
189470e71d3649f6cac4688e83819640b012b5d38bbniklase@google.com#endif
190bdfdc96b22bd3ae19dd4d18e17148c69aa1c7285aluebs@webrtc.org#endif  // WEBRTC_MODULES_AUDIO_PROCESSING_NS_NS_CORE_H_
191