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