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