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