| /* |
| * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. |
| * |
| * Use of this source code is governed by a BSD-style license |
| * that can be found in the LICENSE file in the root of the source |
| * tree. An additional intellectual property rights grant can be found |
| * in the file PATENTS. All contributing project authors may |
| * be found in the AUTHORS file in the root of the source tree. |
| */ |
| |
| #ifndef WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_CORE_H_ |
| #define WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_CORE_H_ |
| |
| #include "typedefs.h" |
| #include "signal_processing_library.h" |
| |
| #include "nsx_defines.h" |
| |
| #ifdef NS_FILEDEBUG |
| #include <stdio.h> |
| #endif |
| |
| typedef struct NsxInst_t_ { |
| WebRtc_UWord32 fs; |
| |
| const WebRtc_Word16* window; |
| WebRtc_Word16 analysisBuffer[ANAL_BLOCKL_MAX]; |
| WebRtc_Word16 synthesisBuffer[ANAL_BLOCKL_MAX]; |
| WebRtc_UWord16 noiseSupFilter[HALF_ANAL_BLOCKL]; |
| WebRtc_UWord16 overdrive; /* Q8 */ |
| WebRtc_UWord16 denoiseBound; /* Q14 */ |
| const WebRtc_Word16* factor2Table; |
| WebRtc_Word16 noiseEstLogQuantile[SIMULT* HALF_ANAL_BLOCKL]; |
| WebRtc_Word16 noiseEstDensity[SIMULT* HALF_ANAL_BLOCKL]; |
| WebRtc_Word16 noiseEstCounter[SIMULT]; |
| WebRtc_Word16 noiseEstQuantile[HALF_ANAL_BLOCKL]; |
| |
| WebRtc_Word16 anaLen; |
| int anaLen2; |
| int magnLen; |
| int aggrMode; |
| int stages; |
| int initFlag; |
| int gainMap; |
| |
| WebRtc_Word32 maxLrt; |
| WebRtc_Word32 minLrt; |
| WebRtc_Word32 logLrtTimeAvgW32[HALF_ANAL_BLOCKL]; //log lrt factor with time-smoothing in Q8 |
| WebRtc_Word32 featureLogLrt; |
| WebRtc_Word32 thresholdLogLrt; |
| WebRtc_Word16 weightLogLrt; |
| |
| WebRtc_UWord32 featureSpecDiff; |
| WebRtc_UWord32 thresholdSpecDiff; |
| WebRtc_Word16 weightSpecDiff; |
| |
| WebRtc_UWord32 featureSpecFlat; |
| WebRtc_UWord32 thresholdSpecFlat; |
| WebRtc_Word16 weightSpecFlat; |
| |
| WebRtc_Word32 avgMagnPause[HALF_ANAL_BLOCKL]; //conservative estimate of noise spectrum |
| WebRtc_UWord32 magnEnergy; |
| WebRtc_UWord32 sumMagn; |
| WebRtc_UWord32 curAvgMagnEnergy; |
| WebRtc_UWord32 timeAvgMagnEnergy; |
| WebRtc_UWord32 timeAvgMagnEnergyTmp; |
| |
| WebRtc_UWord32 whiteNoiseLevel; //initial noise estimate |
| WebRtc_UWord32 initMagnEst[HALF_ANAL_BLOCKL];//initial magnitude spectrum estimate |
| WebRtc_Word32 pinkNoiseNumerator; //pink noise parameter: numerator |
| WebRtc_Word32 pinkNoiseExp; //pink noise parameter: power of freq |
| int minNorm; //smallest normalization factor |
| int zeroInputSignal; //zero input signal flag |
| |
| WebRtc_UWord32 prevNoiseU32[HALF_ANAL_BLOCKL]; //noise spectrum from previous frame |
| WebRtc_UWord16 prevMagnU16[HALF_ANAL_BLOCKL]; //magnitude spectrum from previous frame |
| WebRtc_Word16 priorNonSpeechProb; //prior speech/noise probability // Q14 |
| |
| int blockIndex; //frame index counter |
| int modelUpdate; //parameter for updating or estimating thresholds/weights for prior model |
| int cntThresUpdate; |
| |
| //histograms for parameter estimation |
| WebRtc_Word16 histLrt[HIST_PAR_EST]; |
| WebRtc_Word16 histSpecFlat[HIST_PAR_EST]; |
| WebRtc_Word16 histSpecDiff[HIST_PAR_EST]; |
| |
| //quantities for high band estimate |
| WebRtc_Word16 dataBufHBFX[ANAL_BLOCKL_MAX]; /* Q0 */ |
| |
| int qNoise; |
| int prevQNoise; |
| int prevQMagn; |
| int blockLen10ms; |
| |
| WebRtc_Word16 real[ANAL_BLOCKL_MAX]; |
| WebRtc_Word16 imag[ANAL_BLOCKL_MAX]; |
| WebRtc_Word32 energyIn; |
| int scaleEnergyIn; |
| int normData; |
| |
| } NsxInst_t; |
| |
| #ifdef __cplusplus |
| extern "C" |
| { |
| #endif |
| |
| /**************************************************************************** |
| * WebRtcNsx_InitCore(...) |
| * |
| * This function initializes a noise suppression instance |
| * |
| * Input: |
| * - inst : Instance that should be initialized |
| * - fs : Sampling frequency |
| * |
| * Output: |
| * - inst : Initialized instance |
| * |
| * Return value : 0 - Ok |
| * -1 - Error |
| */ |
| WebRtc_Word32 WebRtcNsx_InitCore(NsxInst_t* inst, WebRtc_UWord32 fs); |
| |
| /**************************************************************************** |
| * WebRtcNsx_set_policy_core(...) |
| * |
| * This changes the aggressiveness of the noise suppression method. |
| * |
| * Input: |
| * - inst : Instance that should be initialized |
| * - mode : 0: Mild (6 dB), 1: Medium (10 dB), 2: Aggressive (15 dB) |
| * |
| * Output: |
| * - inst : Initialized instance |
| * |
| * Return value : 0 - Ok |
| * -1 - Error |
| */ |
| int WebRtcNsx_set_policy_core(NsxInst_t* inst, int mode); |
| |
| /**************************************************************************** |
| * WebRtcNsx_ProcessCore |
| * |
| * Do noise suppression. |
| * |
| * Input: |
| * - inst : Instance that should be initialized |
| * - inFrameLow : Input speech frame for lower band |
| * - inFrameHigh : Input speech frame for higher band |
| * |
| * Output: |
| * - inst : Updated instance |
| * - outFrameLow : Output speech frame for lower band |
| * - outFrameHigh : Output speech frame for higher band |
| * |
| * Return value : 0 - OK |
| * -1 - Error |
| */ |
| int WebRtcNsx_ProcessCore(NsxInst_t* inst, |
| short* inFrameLow, |
| short* inFrameHigh, |
| short* outFrameLow, |
| short* outFrameHigh); |
| |
| /**************************************************************************** |
| * Some function pointers, for internal functions shared by ARM NEON and |
| * generic C code. |
| */ |
| // Noise Estimation. |
| typedef void (*NoiseEstimation)(NsxInst_t* inst, |
| uint16_t* magn, |
| uint32_t* noise, |
| int16_t* q_noise); |
| extern NoiseEstimation WebRtcNsx_NoiseEstimation; |
| |
| // Filter the data in the frequency domain, and create spectrum. |
| typedef void (*PrepareSpectrum)(NsxInst_t* inst, |
| int16_t* freq_buff); |
| extern PrepareSpectrum WebRtcNsx_PrepareSpectrum; |
| |
| // For the noise supression process, synthesis, read out fully processed |
| // segment, and update synthesis buffer. |
| typedef void (*SynthesisUpdate)(NsxInst_t* inst, |
| int16_t* out_frame, |
| int16_t gain_factor); |
| extern SynthesisUpdate WebRtcNsx_SynthesisUpdate; |
| |
| // Update analysis buffer for lower band, and window data before FFT. |
| typedef void (*AnalysisUpdate)(NsxInst_t* inst, |
| int16_t* out, |
| int16_t* new_speech); |
| extern AnalysisUpdate WebRtcNsx_AnalysisUpdate; |
| |
| // Denormalize the input buffer. |
| typedef void (*Denormalize)(NsxInst_t* inst, |
| int16_t* in, |
| int factor); |
| extern Denormalize WebRtcNsx_Denormalize; |
| |
| // Create a complex number buffer, as the intput interleaved with zeros, |
| // and normalize it. |
| typedef void (*CreateComplexBuffer)(NsxInst_t* inst, |
| int16_t* in, |
| int16_t* out); |
| extern CreateComplexBuffer WebRtcNsx_CreateComplexBuffer; |
| |
| /**************************************************************************** |
| * Initialization of the above function pointers for ARM Neon. |
| */ |
| void WebRtcNsx_InitNeon(void); |
| |
| extern const WebRtc_Word16 WebRtcNsx_kLogTable[9]; |
| extern const WebRtc_Word16 WebRtcNsx_kLogTableFrac[256]; |
| extern const WebRtc_Word16 WebRtcNsx_kCounterDiv[201]; |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif // WEBRTC_MODULES_AUDIO_PROCESSING_NS_MAIN_SOURCE_NSX_CORE_H_ |