221 lines
7.1 KiB
C
221 lines
7.1 KiB
C
|
/*
|
||
|
* 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.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* Various help functions used by the DSP functions.
|
||
|
*/
|
||
|
|
||
|
#ifndef DSP_HELPFUNCTIONS_H
|
||
|
#define DSP_HELPFUNCTIONS_H
|
||
|
|
||
|
#include "typedefs.h"
|
||
|
|
||
|
#include "dsp.h"
|
||
|
|
||
|
/****************************************************************************
|
||
|
* WebRtcNetEQ_Correlator(...)
|
||
|
*
|
||
|
* Calculate signal correlation.
|
||
|
*
|
||
|
* Input:
|
||
|
* - inst : DSP instance
|
||
|
* - data : Speech history to do expand from (older history in data[-4..-1])
|
||
|
* - dataLen : Length of data
|
||
|
*
|
||
|
* Output:
|
||
|
* - corrOut : CC of downsampled signal
|
||
|
* - corrScale : Scale factor for correlation (-Qdomain)
|
||
|
*
|
||
|
* Return value : Length of correlated data
|
||
|
*/
|
||
|
|
||
|
WebRtc_Word16 WebRtcNetEQ_Correlator(DSPInst_t *inst,
|
||
|
#ifdef SCRATCH
|
||
|
WebRtc_Word16 *pw16_scratchPtr,
|
||
|
#endif
|
||
|
WebRtc_Word16 *pw16_data, WebRtc_Word16 w16_dataLen,
|
||
|
WebRtc_Word16 *pw16_corrOut,
|
||
|
WebRtc_Word16 *pw16_corrScale);
|
||
|
|
||
|
/****************************************************************************
|
||
|
* WebRtcNetEQ_PeakDetection(...)
|
||
|
*
|
||
|
* Peak detection with parabolic fit.
|
||
|
*
|
||
|
* Input:
|
||
|
* - data : Data sequence for peak detection
|
||
|
* - dataLen : Length of data
|
||
|
* - nmbPeaks : Number of peaks to detect
|
||
|
* - fs_mult : Sample rate multiplier
|
||
|
*
|
||
|
* Output:
|
||
|
* - corrIndex : Index of the peak
|
||
|
* - winner : Value of the peak
|
||
|
*
|
||
|
* Return value : 0 for ok
|
||
|
*/
|
||
|
|
||
|
WebRtc_Word16 WebRtcNetEQ_PeakDetection(WebRtc_Word16 *pw16_data, WebRtc_Word16 w16_dataLen,
|
||
|
WebRtc_Word16 w16_nmbPeaks, WebRtc_Word16 fs_mult,
|
||
|
WebRtc_Word16 *pw16_corrIndex,
|
||
|
WebRtc_Word16 *pw16_winners);
|
||
|
|
||
|
/****************************************************************************
|
||
|
* WebRtcNetEQ_PrblFit(...)
|
||
|
*
|
||
|
* Three-point parbola fit.
|
||
|
*
|
||
|
* Input:
|
||
|
* - 3pts : Three input samples
|
||
|
* - fs_mult : Sample rate multiplier
|
||
|
*
|
||
|
* Output:
|
||
|
* - Ind : Index of the peak
|
||
|
* - outVal : Value of the peak
|
||
|
*
|
||
|
* Return value : 0 for ok
|
||
|
*/
|
||
|
|
||
|
WebRtc_Word16 WebRtcNetEQ_PrblFit(WebRtc_Word16 *pw16_3pts, WebRtc_Word16 *pw16_Ind,
|
||
|
WebRtc_Word16 *pw16_outVal, WebRtc_Word16 fs_mult);
|
||
|
|
||
|
/****************************************************************************
|
||
|
* WebRtcNetEQ_MinDistortion(...)
|
||
|
*
|
||
|
* Find the lag that results in minimum distortion.
|
||
|
*
|
||
|
* Input:
|
||
|
* - data : Start of speech to perform distortion on, second vector is assumed
|
||
|
* to be data[-Lag]
|
||
|
* - minLag : Start lag
|
||
|
* - maxLag : End lag
|
||
|
* - len : Length to correlate
|
||
|
*
|
||
|
* Output:
|
||
|
* - dist : Distorion value
|
||
|
*
|
||
|
* Return value : Lag for minimum distortion
|
||
|
*/
|
||
|
|
||
|
WebRtc_Word16 WebRtcNetEQ_MinDistortion(const WebRtc_Word16 *pw16_data,
|
||
|
WebRtc_Word16 w16_minLag, WebRtc_Word16 w16_maxLag,
|
||
|
WebRtc_Word16 len, WebRtc_Word32 *pw16_dist);
|
||
|
|
||
|
/****************************************************************************
|
||
|
* WebRtcNetEQ_RandomVec(...)
|
||
|
*
|
||
|
* Generate random vector.
|
||
|
*
|
||
|
* Input:
|
||
|
* - seed : Current seed (input/output)
|
||
|
* - len : Number of samples to generate
|
||
|
* - incVal : Jump step
|
||
|
*
|
||
|
* Output:
|
||
|
* - randVec : Generated random vector
|
||
|
*/
|
||
|
|
||
|
void WebRtcNetEQ_RandomVec(WebRtc_UWord32 *w32_seed, WebRtc_Word16 *pw16_randVec,
|
||
|
WebRtc_Word16 w16_len, WebRtc_Word16 w16_incval);
|
||
|
|
||
|
/****************************************************************************
|
||
|
* WebRtcNetEQ_MixVoiceUnvoice(...)
|
||
|
*
|
||
|
* Mix voiced and unvoiced signal.
|
||
|
*
|
||
|
* Input:
|
||
|
* - voicedVec : Voiced input signal
|
||
|
* - unvoicedVec : Unvoiced input signal
|
||
|
* - current_vfraction : Current mixing factor
|
||
|
* - vfraction_change : Mixing factor change per sample
|
||
|
* - N : Number of samples
|
||
|
*
|
||
|
* Output:
|
||
|
* - outData : Mixed signal
|
||
|
*/
|
||
|
|
||
|
void WebRtcNetEQ_MixVoiceUnvoice(WebRtc_Word16 *pw16_outData, WebRtc_Word16 *pw16_voicedVec,
|
||
|
WebRtc_Word16 *pw16_unvoicedVec,
|
||
|
WebRtc_Word16 *w16_current_vfraction,
|
||
|
WebRtc_Word16 w16_vfraction_change, WebRtc_Word16 N);
|
||
|
|
||
|
/****************************************************************************
|
||
|
* WebRtcNetEQ_UnmuteSignal(...)
|
||
|
*
|
||
|
* Gradually reduce attenuation.
|
||
|
*
|
||
|
* Input:
|
||
|
* - inVec : Input signal
|
||
|
* - startMuteFact : Starting attenuation
|
||
|
* - unmuteFact : Factor to "unmute" with (Q20)
|
||
|
* - N : Number of samples
|
||
|
*
|
||
|
* Output:
|
||
|
* - outVec : Output signal
|
||
|
*/
|
||
|
|
||
|
void WebRtcNetEQ_UnmuteSignal(WebRtc_Word16 *pw16_inVec, WebRtc_Word16 *startMuteFact,
|
||
|
WebRtc_Word16 *pw16_outVec, WebRtc_Word16 unmuteFact,
|
||
|
WebRtc_Word16 N);
|
||
|
|
||
|
/****************************************************************************
|
||
|
* WebRtcNetEQ_MuteSignal(...)
|
||
|
*
|
||
|
* Gradually increase attenuation.
|
||
|
*
|
||
|
* Input:
|
||
|
* - inout : Input/output signal
|
||
|
* - muteSlope : Slope of muting
|
||
|
* - N : Number of samples
|
||
|
*/
|
||
|
|
||
|
void WebRtcNetEQ_MuteSignal(WebRtc_Word16 *pw16_inout, WebRtc_Word16 muteSlope,
|
||
|
WebRtc_Word16 N);
|
||
|
|
||
|
/****************************************************************************
|
||
|
* WebRtcNetEQ_CalcFsMult(...)
|
||
|
*
|
||
|
* Calculate the sample rate divided by 8000.
|
||
|
*
|
||
|
* Input:
|
||
|
* - fsHz : Sample rate in Hz in {8000, 16000, 32000, 48000}.
|
||
|
*
|
||
|
* Return value : fsHz/8000 for the valid values, 1 for other inputs
|
||
|
*/
|
||
|
|
||
|
WebRtc_Word16 WebRtcNetEQ_CalcFsMult(WebRtc_UWord16 fsHz);
|
||
|
|
||
|
/****************************************************************************
|
||
|
* WebRtcNetEQ_DownSampleTo4kHz(...)
|
||
|
*
|
||
|
* Lowpass filter and downsample a signal to 4 kHz sample rate.
|
||
|
*
|
||
|
* Input:
|
||
|
* - in : Input signal samples.
|
||
|
* - inLen : Number of input samples.
|
||
|
* - inFsHz : Input sample rate in Hz.
|
||
|
* - outLen : Desired number of samples in decimated signal.
|
||
|
* - compensateDelay : If non-zero, compensate for the phase delay of
|
||
|
* of the anti-alias filter.
|
||
|
*
|
||
|
* Output:
|
||
|
* - out : Output signal samples.
|
||
|
*
|
||
|
* Return value : 0 - Ok
|
||
|
* -1 - Error
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
int WebRtcNetEQ_DownSampleTo4kHz(const WebRtc_Word16 *in, int inLen, WebRtc_UWord16 inFsHz,
|
||
|
WebRtc_Word16 *out, int outLen, int compensateDelay);
|
||
|
|
||
|
#endif
|
||
|
|