|  | /* | 
|  | *  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 help functions that did not fit elsewhere. | 
|  | */ | 
|  |  | 
|  | #include "dsp_helpfunctions.h" | 
|  |  | 
|  |  | 
|  | WebRtc_Word16 WebRtcNetEQ_CalcFsMult(WebRtc_UWord16 fsHz) | 
|  | { | 
|  | switch (fsHz) | 
|  | { | 
|  | case 8000: | 
|  | { | 
|  | return 1; | 
|  | } | 
|  | case 16000: | 
|  | { | 
|  | return 2; | 
|  | } | 
|  | case 32000: | 
|  | { | 
|  | return 4; | 
|  | } | 
|  | case 48000: | 
|  | { | 
|  | return 6; | 
|  | } | 
|  | default: | 
|  | { | 
|  | return 1; | 
|  | } | 
|  | } | 
|  | } | 
|  |  | 
|  |  | 
|  | int WebRtcNetEQ_DownSampleTo4kHz(const WebRtc_Word16 *in, int inLen, WebRtc_UWord16 inFsHz, | 
|  | WebRtc_Word16 *out, int outLen, int compensateDelay) | 
|  | { | 
|  | WebRtc_Word16 *B; /* filter coefficients */ | 
|  | WebRtc_Word16 Blen; /* number of coefficients */ | 
|  | WebRtc_Word16 filterDelay; /* phase delay in samples */ | 
|  | WebRtc_Word16 factor; /* conversion rate (inFsHz/8000) */ | 
|  | int ok; | 
|  |  | 
|  | /* Set constants depending on frequency used */ | 
|  | /* NOTE: The phase delay values are wrong compared to the true phase delay | 
|  | of the filters. However, the error is preserved (through the +1 term) | 
|  | for consistency. */ | 
|  | switch (inFsHz) | 
|  | { | 
|  | case 8000: | 
|  | { | 
|  | Blen = 3; | 
|  | factor = 2; | 
|  | B = (WebRtc_Word16*) WebRtcNetEQ_kDownsample8kHzTbl; | 
|  | filterDelay = 1 + 1; | 
|  | break; | 
|  | } | 
|  | #ifdef NETEQ_WIDEBAND | 
|  | case 16000: | 
|  | { | 
|  | Blen = 5; | 
|  | factor = 4; | 
|  | B = (WebRtc_Word16*) WebRtcNetEQ_kDownsample16kHzTbl; | 
|  | filterDelay = 2 + 1; | 
|  | break; | 
|  | } | 
|  | #endif | 
|  | #ifdef NETEQ_32KHZ_WIDEBAND | 
|  | case 32000: | 
|  | { | 
|  | Blen = 7; | 
|  | factor = 8; | 
|  | B = (WebRtc_Word16*) WebRtcNetEQ_kDownsample32kHzTbl; | 
|  | filterDelay = 3 + 1; | 
|  | break; | 
|  | } | 
|  | #endif | 
|  | #ifdef NETEQ_48KHZ_WIDEBAND | 
|  | case 48000: | 
|  | { | 
|  | Blen = 7; | 
|  | factor = 12; | 
|  | B = (WebRtc_Word16*) WebRtcNetEQ_kDownsample48kHzTbl; | 
|  | filterDelay = 3 + 1; | 
|  | break; | 
|  | } | 
|  | #endif | 
|  | default: | 
|  | { | 
|  | /* unsupported or wrong sample rate */ | 
|  | return -1; | 
|  | } | 
|  | } | 
|  |  | 
|  | if (!compensateDelay) | 
|  | { | 
|  | /* disregard delay compensation */ | 
|  | filterDelay = 0; | 
|  | } | 
|  |  | 
|  | ok = WebRtcSpl_DownsampleFast((WebRtc_Word16*) &in[Blen - 1], | 
|  | (WebRtc_Word16) (inLen - (Blen - 1)), /* number of input samples */ | 
|  | out, (WebRtc_Word16) outLen, /* number of output samples to produce */ | 
|  | B, Blen, factor, filterDelay); /* filter parameters */ | 
|  |  | 
|  | return ok; /* return value is -1 if input signal is too short */ | 
|  |  | 
|  | } | 
|  |  |