/* * 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. */ /* * This file contains some DSP initialization functions, * constant table definitions and other parameters. * Also contains definitions of all DSP-side data structures. */ #ifndef DSP_H #define DSP_H #include "typedefs.h" #include "webrtc_cng.h" #include "codec_db_defines.h" #include "neteq_defines.h" #include "neteq_statistics.h" #ifdef NETEQ_ATEVENT_DECODE #include "dtmf_tonegen.h" #endif /*****************************/ /* Pre-processor definitions */ /*****************************/ /* FSMULT is the sample rate divided by 8000 */ #if defined(NETEQ_48KHZ_WIDEBAND) #define FSMULT 6 #elif defined(NETEQ_32KHZ_WIDEBAND) #define FSMULT 4 #elif defined(NETEQ_WIDEBAND) #define FSMULT 2 #else #define FSMULT 1 #endif /* Size of the speech buffer (or synchronization buffer). */ /* 60 ms decoding + 10 ms syncbuff + 0.625ms lookahead */ #define SPEECH_BUF_SIZE (565 * FSMULT) /* Misc definitions */ #define BGN_LPC_ORDER (4 + FSMULT) /* 5, 6, 8, or 10 */ #define UNVOICED_LPC_ORDER 6 #define RANDVEC_NO_OF_SAMPLES 256 /* Number of milliseconds to remove/add during accelerate/pre-emptive expand under BGNonly operation */ #define DEFAULT_TIME_ADJUST 8 /* Number of RecOut calls without CNG/SID before re-enabling post-decode VAD */ #define POST_DECODE_VAD_AUTO_ENABLE 3000 /* 8kHz windowing in Q15 (over 5 samples) */ #define NETEQ_OVERLAP_WINMUTE_8KHZ_START 27307 #define NETEQ_OVERLAP_WINMUTE_8KHZ_INC -5461 #define NETEQ_OVERLAP_WINUNMUTE_8KHZ_START 5461 #define NETEQ_OVERLAP_WINUNMUTE_8KHZ_INC 5461 /* 16kHz windowing in Q15 (over 10 samples) */ #define NETEQ_OVERLAP_WINMUTE_16KHZ_START 29789 #define NETEQ_OVERLAP_WINMUTE_16KHZ_INC -2979 #define NETEQ_OVERLAP_WINUNMUTE_16KHZ_START 2979 #define NETEQ_OVERLAP_WINUNMUTE_16KHZ_INC 2979 /* 32kHz windowing in Q15 (over 20 samples) */ #define NETEQ_OVERLAP_WINMUTE_32KHZ_START 31208 #define NETEQ_OVERLAP_WINMUTE_32KHZ_INC -1560 #define NETEQ_OVERLAP_WINUNMUTE_32KHZ_START 1560 #define NETEQ_OVERLAP_WINUNMUTE_32KHZ_INC 1560 /* 48kHz windowing in Q15 (over 30 samples) */ #define NETEQ_OVERLAP_WINMUTE_48KHZ_START 31711 #define NETEQ_OVERLAP_WINMUTE_48KHZ_INC -1057 #define NETEQ_OVERLAP_WINUNMUTE_48KHZ_START 1057 #define NETEQ_OVERLAP_WINUNMUTE_48KHZ_INC 1057 /* Fade BGN towards zero after this many Expand calls */ #define FADE_BGN_TIME 200 /*******************/ /* Constant tables */ /*******************/ extern const WebRtc_Word16 WebRtcNetEQ_kDownsample8kHzTbl[]; extern const WebRtc_Word16 WebRtcNetEQ_kDownsample16kHzTbl[]; extern const WebRtc_Word16 WebRtcNetEQ_kDownsample32kHzTbl[]; extern const WebRtc_Word16 WebRtcNetEQ_kDownsample48kHzTbl[]; extern const WebRtc_Word16 WebRtcNetEQ_kRandnTbl[]; extern const WebRtc_Word16 WebRtcNetEQ_kMixFractionFuncTbl[]; extern const WebRtc_Word16 WebRtcNetEQ_k1049div[]; extern const WebRtc_Word16 WebRtcNetEQ_k2097div[]; extern const WebRtc_Word16 WebRtcNetEQ_k5243div[]; /************/ /* Typedefs */ /************/ enum BGNMode { BGN_ON, /* default "normal" behavior with eternal noise */ BGN_FADE, /* noise fades to zero after some time */ BGN_OFF /* background noise is always zero */ }; #ifdef NETEQ_STEREO enum MasterSlaveMode { NETEQ_MONO, /* stand-alone instance */ NETEQ_MASTER, /* master instance in a spatial/stereo configuration */ NETEQ_SLAVE /* slave instance in a spatial/stereo configuration */ }; enum MasterSlaveExtraInfo { NO_INFO, /* no info to convey */ ACC_FAIL, /* signal that accelerate failed */ PE_EXP_FAIL, /* signal that pre-emptive expand failed */ DTMF_OVERDUB, /* signal that DTMF overdub is generated */ DTMF_ONLY /* signal that DTMF only is played */ }; #endif /****************************/ /* DSP-side data structures */ /****************************/ /* Background noise (BGN) instance for storing BGN parameters (sub-instance of NETEQDSP_inst) */ typedef struct BGNInst_t_ { WebRtc_Word32 w32_energy; WebRtc_Word32 w32_energyMax; WebRtc_Word32 w32_energyUpdate; WebRtc_Word32 w32_energyUpdateLow; WebRtc_Word16 pw16_filterState[BGN_LPC_ORDER]; WebRtc_Word16 pw16_filter[BGN_LPC_ORDER + 1]; WebRtc_Word16 w16_mutefactor; WebRtc_Word16 w16_scale; WebRtc_Word16 w16_scaleShift; WebRtc_Word16 w16_initialized; enum BGNMode bgnMode; } BGNInst_t; /* Expansion instance (sub-instance of NETEQDSP_inst) */ typedef struct ExpandInst_t_ { WebRtc_Word16 w16_overlap; /* Constant, 5 for NB and 10 for WB */ WebRtc_Word16 w16_consecExp; /* Number of consecutive expand calls */ WebRtc_Word16 *pw16_arFilter; /* length [UNVOICED_LPC_ORDER+1] */ WebRtc_Word16 *pw16_arState; /* length [UNVOICED_LPC_ORDER] */ WebRtc_Word16 w16_arGain; WebRtc_Word16 w16_arGainScale; WebRtc_Word16 w16_vFraction; /* Q14 */ WebRtc_Word16 w16_currentVFraction; /* Q14 */ WebRtc_Word16 *pw16_expVecs[2]; WebRtc_Word16 w16_lags[3]; WebRtc_Word16 w16_maxLag; WebRtc_Word16 *pw16_overlapVec; /* last samples of speech history */ WebRtc_Word16 w16_lagsDirection; WebRtc_Word16 w16_lagsPosition; WebRtc_Word16 w16_expandMuteFactor; /* Q14 */ WebRtc_Word16 w16_stopMuting; WebRtc_Word16 w16_onset; WebRtc_Word16 w16_muteSlope; /* Q20 */ } ExpandInst_t; #ifdef NETEQ_VAD /* * VAD function pointer types, replicating the typedefs in webrtc_neteq_internal.h. * These function pointers match the definitions of WebRtc VAD functions WebRtcVad_Init, * WebRtcVad_set_mode and WebRtcVad_Process, respectively, all found in webrtc_vad.h. */ typedef WebRtc_Word16 (*VADInitFunction)(void *VAD_inst); typedef WebRtc_Word16 (*VADSetmodeFunction)(void *VAD_inst, WebRtc_Word16 mode); typedef WebRtc_Word16 (*VADFunction)(void *VAD_inst, WebRtc_Word16 fs, WebRtc_Word16 *frame, WebRtc_Word16 frameLen); /* Post-decode VAD instance (sub-instance of NETEQDSP_inst) */ typedef struct PostDecodeVAD_t_ { void *VADState; /* pointer to a VAD instance */ WebRtc_Word16 VADEnabled; /* 1 if enabled, 0 if disabled */ WebRtc_Word16 VADMode; /* mode parameter to pass to the VAD function */ WebRtc_Word16 VADDecision; /* 1 for active, 0 for passive */ WebRtc_Word16 SIDintervalCounter; /* reset when decoding CNG/SID frame, increment for each recout call */ /* Function pointers */ VADInitFunction initFunction; /* VAD init function */ VADSetmodeFunction setmodeFunction; /* VAD setmode function */ VADFunction VADFunction; /* VAD function */ } PostDecodeVAD_t; #endif /* NETEQ_VAD */ #ifdef NETEQ_STEREO #define MAX_MS_DECODES 10 typedef struct { /* Stand-alone, master, or slave */ enum MasterSlaveMode msMode; enum MasterSlaveExtraInfo extraInfo; WebRtc_UWord16 instruction; WebRtc_Word16 distLag; WebRtc_Word16 corrLag; WebRtc_Word16 bestIndex; WebRtc_UWord32 endTimestamp; WebRtc_UWord16 samplesLeftWithOverlap; } MasterSlaveInfo; #endif /* "Main" NetEQ DSP instance */ typedef struct DSPInst_t_ { /* MCU/DSP Communication layer */ WebRtc_Word16 *pw16_readAddress; WebRtc_Word16 *pw16_writeAddress; void *main_inst; /* Output frame size in ms and samples */ WebRtc_Word16 millisecondsPerCall; WebRtc_Word16 timestampsPerCall; /* * Example of speech buffer * * ----------------------------------------------------------- * | History T-60 to T | Future | * ----------------------------------------------------------- * ^ ^ * | | * curPosition endPosition * * History is gradually shifted out to the left when inserting * new data at the end. */ WebRtc_Word16 speechBuffer[SPEECH_BUF_SIZE]; /* History/future speech buffer */ int curPosition; /* Next sample to play */ int endPosition; /* Position that ends future data */ WebRtc_UWord32 endTimestamp; /* Timestamp value at end of future data */ WebRtc_UWord32 videoSyncTimestamp; /* (Estimated) timestamp of the last played sample (usually same as endTimestamp-(endPosition-curPosition) except during Expand and CNG) */ WebRtc_UWord16 fs; /* sample rate in Hz */ WebRtc_Word16 w16_frameLen; /* decoder frame length in samples */ WebRtc_Word16 w16_mode; /* operation used during last RecOut call */ WebRtc_Word16 w16_muteFactor; /* speech mute factor in Q14 */ WebRtc_Word16 *pw16_speechHistory; /* beginning of speech history during Expand */ WebRtc_Word16 w16_speechHistoryLen; /* 256 for NB and 512 for WB */ /* random noise seed parameters */ WebRtc_Word16 w16_seedInc; WebRtc_UWord32 uw16_seed; /* VQmon related variable */ WebRtc_Word16 w16_concealedTS; /*****************/ /* Sub-instances */ /*****************/ /* Decoder data */ CodecFuncInst_t codec_ptr_inst; #ifdef NETEQ_CNG_CODEC /* CNG "decoder" instance */ CNG_dec_inst *CNG_Codec_inst; #endif /* NETEQ_CNG_CODEC */ #ifdef NETEQ_ATEVENT_DECODE /* DTMF generator instance */ dtmf_tone_inst_t DTMFInst; #endif /* NETEQ_CNG_CODEC */ #ifdef NETEQ_VAD /* Post-decode VAD instance */ PostDecodeVAD_t VADInst; #endif /* NETEQ_VAD */ /* Expand instance (defined above) */ ExpandInst_t ExpandInst; /* Background noise instance (defined above) */ BGNInst_t BGNInst; /* Internal statistics instance */ DSPStats_t statInst; #ifdef NETEQ_STEREO /* Pointer to Master/Slave info */ MasterSlaveInfo *msInfo; #endif } DSPInst_t; /*************************/ /* Function declarations */ /*************************/ /**************************************************************************** * WebRtcNetEQ_DSPInit(...) * * Initializes DSP side of NetEQ. * * Input: * - inst : NetEq DSP instance * - fs : Initial sample rate (may change when decoding data) * * Output: * - inst : Updated instance * * Return value : 0 - ok * : non-zero - error */ int WebRtcNetEQ_DSPInit(DSPInst_t *inst, WebRtc_UWord16 fs); /**************************************************************************** * WebRtcNetEQ_AddressInit(...) * * Initializes the shared-memory communication on the DSP side. * * Input: * - inst : NetEQ DSP instance * - data2McuAddress : Pointer to memory where DSP writes / MCU reads * - data2DspAddress : Pointer to memory where MCU writes / DSP reads * - mainInst : NetEQ main instance * * Output: * - inst : Updated instance * * Return value : 0 - ok */ int WebRtcNetEQ_AddressInit(DSPInst_t *inst, const void *data2McuAddress, const void *data2DspAddress, const void *mainInst); /**************************************************************************** * WebRtcNetEQ_ClearInCallStats(...) * * Reset in-call statistics variables on DSP side. * * Input: * - inst : NetEQ DSP instance * * Output: * - inst : Updated instance * * Return value : 0 - ok */ int WebRtcNetEQ_ClearInCallStats(DSPInst_t *inst); /**************************************************************************** * WebRtcNetEQ_ClearPostCallStats(...) * * Reset post-call statistics variables on DSP side. * * Input: * - inst : NetEQ DSP instance * * Output: * - inst : Updated instance * * Return value : 0 - ok */ int WebRtcNetEQ_ClearPostCallStats(DSPInst_t *inst); /**************************************************************************** * WebRtcNetEQ_RecOutInternal(...) * * This function asks NetEQ for more speech/audio data. * * Input: * - inst : NetEQ instance, i.e. the user that requests more * speech/audio data. * - outdata : Pointer to a memory space where the output data * should be stored. * - BGNonly : If non-zero, RecOut will only produce background * noise. It will still draw packets from the packet * buffer, but they will never be decoded. * * Output: * - inst : Updated user information * - len : Number of samples that were outputted from NetEq * * Return value : 0 - Ok * -1 - Error */ int WebRtcNetEQ_RecOutInternal(DSPInst_t *inst, WebRtc_Word16 *pw16_outData, WebRtc_Word16 *pw16_len, WebRtc_Word16 BGNonly); /**************************************************************************** * WebRtcNetEQ_Normal(...) * * This function has the possibility to modify data that is played out in Normal * mode, for example adjust the gain of the signal. The length of the signal * can not be changed. * * Input: * - inst : NetEQ DSP instance * - scratchPtr : Pointer to scratch vector * - decoded : Pointer to vector of new data from decoder * - len : Number of input samples * * Output: * - inst : Updated user information * - pw16_len : Pointer to varibale where the number of samples * produced will be written * * Return value : >=0 - Number of samples written to outData * -1 - Error */ int WebRtcNetEQ_Normal(DSPInst_t *inst, #ifdef SCRATCH WebRtc_Word16 *pw16_scratchPtr, #endif WebRtc_Word16 *pw16_decoded, WebRtc_Word16 len, WebRtc_Word16 *pw16_outData, WebRtc_Word16 *pw16_len); /**************************************************************************** * WebRtcNetEQ_Expand(...) * * This function produces one "chunk" of expansion data (PLC audio). The * lenght of the produced audio depends on the speech history. * * Input: * - inst : NetEQ DSP instance * - scratchPtr : Pointer to scratch vector * - BGNonly : If non-zero, Expand will only produce background * noise. * - pw16_len : Desired number of samples (only for BGN mode). * * Output: * - inst : Updated user information * - outdata : Pointer to a memory space where the output data * should be stored * - pw16_len : Number of samples that were outputted from NetEq * * Return value : 0 - Ok * <0 - Error */ int WebRtcNetEQ_Expand(DSPInst_t *inst, #ifdef SCRATCH WebRtc_Word16 *pw16_scratchPtr, #endif WebRtc_Word16 *pw16_outData, WebRtc_Word16 *pw16_len, WebRtc_Word16 BGNonly); /**************************************************************************** * WebRtcNetEQ_GenerateBGN(...) * * This function generates and writes len samples of background noise to the * output vector. The Expand function will be called repeteadly until the * correct number of samples is produced. * * Input: * - inst : NetEQ DSP instance * - scratchPtr : Pointer to scratch vector * - len : Desired length of produced BGN. * * * Output: * - pw16_outData : Pointer to a memory space where the output data * should be stored * * Return value : >=0 - Number of noise samples produced and written * to output * -1 - Error */ int WebRtcNetEQ_GenerateBGN(DSPInst_t *inst, #ifdef SCRATCH WebRtc_Word16 *pw16_scratchPtr, #endif WebRtc_Word16 *pw16_outData, WebRtc_Word16 len); /**************************************************************************** * WebRtcNetEQ_PreEmptiveExpand(...) * * This function tries to extend the audio data by repeating one or several * pitch periods. The operation is only carried out if the correlation is * strong or if the signal energy is very low. The algorithm is the * reciprocal of the Accelerate algorithm. * * Input: * - inst : NetEQ DSP instance * - scratchPtr : Pointer to scratch vector. * - decoded : Pointer to newly decoded speech. * - len : Length of decoded speech. * - oldDataLen : Length of the part of decoded that has already been played out. * - BGNonly : If non-zero, Pre-emptive Expand will only copy * the first DEFAULT_TIME_ADJUST seconds of the * input and append to the end. No signal matching is * done. * * Output: * - inst : Updated instance * - outData : Pointer to a memory space where the output data * should be stored. The vector must be at least * min(len + 120*fs/8000, NETEQ_MAX_OUTPUT_SIZE) * elements long. * - pw16_len : Number of samples written to outData. * * Return value : 0 - Ok * <0 - Error */ int WebRtcNetEQ_PreEmptiveExpand(DSPInst_t *inst, #ifdef SCRATCH WebRtc_Word16 *pw16_scratchPtr, #endif const WebRtc_Word16 *pw16_decoded, int len, int oldDataLen, WebRtc_Word16 *pw16_outData, WebRtc_Word16 *pw16_len, WebRtc_Word16 BGNonly); /**************************************************************************** * WebRtcNetEQ_Accelerate(...) * * This function tries to shorten the audio data by removing one or several * pitch periods. The operation is only carried out if the correlation is * strong or if the signal energy is very low. * * Input: * - inst : NetEQ DSP instance * - scratchPtr : Pointer to scratch vector. * - decoded : Pointer to newly decoded speech. * - len : Length of decoded speech. * - BGNonly : If non-zero, Accelerate will only remove the last * DEFAULT_TIME_ADJUST seconds of the intput. * No signal matching is done. * * * Output: * - inst : Updated instance * - outData : Pointer to a memory space where the output data * should be stored * - pw16_len : Number of samples written to outData. * * Return value : 0 - Ok * <0 - Error */ int WebRtcNetEQ_Accelerate(DSPInst_t *inst, #ifdef SCRATCH WebRtc_Word16 *pw16_scratchPtr, #endif const WebRtc_Word16 *pw16_decoded, int len, WebRtc_Word16 *pw16_outData, WebRtc_Word16 *pw16_len, WebRtc_Word16 BGNonly); /**************************************************************************** * WebRtcNetEQ_Merge(...) * * This function is used to merge new data from the decoder to the exisiting * stream in the synchronization buffer. The merge operation is typically * done after a packet loss, where the end of the expanded data does not * fit naturally with the new decoded data. * * Input: * - inst : NetEQ DSP instance * - scratchPtr : Pointer to scratch vector. * - decoded : Pointer to new decoded speech. * - len : Number of samples in pw16_decoded. * * * Output: * - inst : Updated user information * - outData : Pointer to a memory space where the output data * should be stored * - pw16_len : Number of samples written to pw16_outData * * Return value : 0 - Ok * <0 - Error */ int WebRtcNetEQ_Merge(DSPInst_t *inst, #ifdef SCRATCH WebRtc_Word16 *pw16_scratchPtr, #endif WebRtc_Word16 *pw16_decoded, int len, WebRtc_Word16 *pw16_outData, WebRtc_Word16 *pw16_len); /**************************************************************************** * WebRtcNetEQ_Cng(...) * * This function produces CNG according to RFC 3389 * * Input: * - inst : NetEQ DSP instance * - len : Number of samples to produce * * Output: * - pw16_outData : Output CNG * * Return value : 0 - Ok * <0 - Error */ #ifdef NETEQ_CNG_CODEC /* Must compile NetEQ with CNG support to enable this function */ int WebRtcNetEQ_Cng(DSPInst_t *inst, WebRtc_Word16 *pw16_outData, int len); #endif /* NETEQ_CNG_CODEC */ /**************************************************************************** * WebRtcNetEQ_BGNUpdate(...) * * This function updates the background noise parameter estimates. * * Input: * - inst : NetEQ instance, where the speech history is stored. * - scratchPtr : Pointer to scratch vector. * * Output: * - inst : Updated information about the BGN characteristics. * * Return value : No return value */ void WebRtcNetEQ_BGNUpdate( #ifdef SCRATCH DSPInst_t *inst, WebRtc_Word16 *pw16_scratchPtr #else DSPInst_t *inst #endif ); #ifdef NETEQ_VAD /* Functions used by post-decode VAD */ /**************************************************************************** * WebRtcNetEQ_InitVAD(...) * * Initializes post-decode VAD instance. * * Input: * - VADinst : PostDecodeVAD instance * - fs : Initial sample rate * * Output: * - VADinst : Updated instance * * Return value : 0 - Ok * -1 - Error */ int WebRtcNetEQ_InitVAD(PostDecodeVAD_t *VADInst, WebRtc_UWord16 fs); /**************************************************************************** * WebRtcNetEQ_SetVADModeInternal(...) * * Set the VAD mode in the VAD struct, and communicate it to the VAD instance * if it exists. * * Input: * - VADinst : PostDecodeVAD instance * - mode : Mode number passed on to the VAD function * * Output: * - VADinst : Updated instance * * Return value : 0 - Ok * -1 - Error */ int WebRtcNetEQ_SetVADModeInternal(PostDecodeVAD_t *VADInst, WebRtc_Word16 mode); #endif /* NETEQ_VAD */ /**************************************************************************** * WebRtcNetEQ_FlushSpeechBuffer(...) * * Flush the speech buffer. * * Input: * - inst : NetEq DSP instance * * Output: * - inst : Updated instance * * Return value : 0 - ok * : non-zero - error */ int WebRtcNetEQ_FlushSpeechBuffer(DSPInst_t *inst); #ifndef WEBRTC_NETEQ_40BITACC_TEST #include "signal_processing_library.h" /* Map to regular SPL functions */ #define WebRtcNetEQ_CrossCorr WebRtcSpl_CrossCorrelation #define WebRtcNetEQ_DotW16W16 WebRtcSpl_DotProductWithScale #else /* WEBRTC_NETEQ_40BITACC_TEST defined */ /* Run NetEQ with simulated 40-bit accumulator to run bit-exact to a DSP implementation where the main (splib and NetEQ) functions have been 40-bit optimized. */ /* Map to special 40-bit optimized functions, defined below */ #define WebRtcNetEQ_CrossCorr WebRtcNetEQ_40BitAccCrossCorr #define WebRtcNetEQ_DotW16W16 WebRtcNetEQ_40BitAccDotW16W16 /**************************************************************************** * WebRtcNetEQ_40BitAccCrossCorr(...) * * Calculates the Cross correlation between two sequences seq1 and seq2. Seq1 * is fixed and seq2 slides as the pointer is increased with step * * Input: * - seq1 : First sequence (fixed throughout the correlation) * - seq2 : Second sequence (slided step_seq2 for each * new correlation) * - dimSeq : Number of samples to use in the cross correlation. * Should be no larger than 1024 to avoid overflow. * - dimCrossCorr : Number of CrossCorrelations to calculate (start * position for seq2 is updated for each new one) * - rShift : Number of right shifts to use * - step_seq2 : How many (positive or negative) steps the seq2 * pointer should be updated for each new cross * correlation value * * Output: * - crossCorr : The cross correlation in Q-rShift */ void WebRtcNetEQ_40BitAccCrossCorr(WebRtc_Word32 *crossCorr, WebRtc_Word16 *seq1, WebRtc_Word16 *seq2, WebRtc_Word16 dimSeq, WebRtc_Word16 dimCrossCorr, WebRtc_Word16 rShift, WebRtc_Word16 step_seq2); /**************************************************************************** * WebRtcNetEQ_40BitAccDotW16W16(...) * * Calculates the dot product between two vectors (WebRtc_Word16) * * Input: * - vector1 : Vector 1 * - vector2 : Vector 2 * - len : Number of samples in vector * Should be no larger than 1024 to avoid overflow. * - scaling : The number of right shifts (after multiplication) * required to avoid overflow in the dot product. * Return value : The dot product */ WebRtc_Word32 WebRtcNetEQ_40BitAccDotW16W16(WebRtc_Word16 *vector1, WebRtc_Word16 *vector2, int len, int scaling); #endif /* WEBRTC_NETEQ_40BITACC_TEST */ #endif /* DSP_H */