/* * 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