1b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 2b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 4b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Use of this source code is governed by a BSD-style license 5b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * that can be found in the LICENSE file in the root of the source 6b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * tree. An additional intellectual property rights grant can be found 7b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * in the file PATENTS. All contributing project authors may 8b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * be found in the AUTHORS file in the root of the source tree. 9b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 10b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 11b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 12b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * decode_plc.c 13b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 14b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Packet Loss Concealment. 15b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * 16b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 17b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 18b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include <string.h> 19b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 20b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "settings.h" 21b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "entropy_coding.h" 22b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "pitch_estimator.h" 23b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "bandwidth_estimator.h" 24b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "structs.h" 25b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#include "codec.h" 26b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 27b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 28b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define NO_OF_PRIMES 8 29b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org#define NOISE_FILTER_LEN 30 30b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 31b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 32b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * function to decode the bitstream 33b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * returns the total number of bytes in the stream 34b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 35b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 36fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.orgstatic int16_t plc_filterma_Fast( 37fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t *In, /* (i) Vector to be filtered. InOut[-orderCoef+1] 38b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org to InOut[-1] contains state */ 39fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t *Out, /* (o) Filtered vector */ 40fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t *B, /* (i) The filter coefficients (in Q0) */ 41fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t Blen, /* (i) Number of B coefficients */ 42fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t len, /* (i) Number of samples to be filtered */ 43fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t reduceDecay, 44fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t decay, 45fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t rshift ) 46b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 47b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int i, j; 48fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int32_t o; 49fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int32_t lim; 50b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 51fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org lim = WEBRTC_SPL_LSHIFT_W32( (int32_t)1, 15 + rshift )-1; 52b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 53b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (i = 0; i < len; i++) 54b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 5545a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.org const int16_t *b_ptr = &B[0]; 5645a3434299d78b2084a2d765c51c76c165b410cepbos@webrtc.org const int16_t *x_ptr = &In[i]; 57b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 58fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org o = (int32_t)0; 59b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 60b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (j = 0;j < Blen; j++) 61b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 62347671c843ed5c93d25bf1a23f9295d35ce3df4abjornv@webrtc.org o = WebRtcSpl_AddSatW32(o, WEBRTC_SPL_MUL_16_16(*b_ptr, *x_ptr)); 63b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org b_ptr++; 64b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org x_ptr--; 65b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 66b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 67b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* to round off correctly */ 68347671c843ed5c93d25bf1a23f9295d35ce3df4abjornv@webrtc.org o = WebRtcSpl_AddSatW32(o, 1 << (rshift - 1)); 69b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 70b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* saturate according to the domain of the filter coefficients */ 71fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org o = WEBRTC_SPL_SAT((int32_t)lim, o, (int32_t)-lim); 72b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 73fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org /* o should be in the range of int16_t */ 74b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org o = WEBRTC_SPL_RSHIFT_W32( o, rshift ); 75b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 76b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* decay the output signal; this is specific to plc */ 77fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org *Out++ = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( (int16_t)o, decay, 15); // ((o + (int32_t)2048) >> 12); 78b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 79b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* change the decay */ 80b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org decay -= reduceDecay; 81b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( decay < 0 ) 82b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org decay = 0; 83b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 84b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return( decay ); 85b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 86b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 87b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 88b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 89b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 90b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 91b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 92b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 93b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 94fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.orgstatic __inline int32_t log2_Q8_T( uint32_t x ) { 95b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 96fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int32_t zeros, lg2; 97fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t frac; 98b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 99b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org zeros=WebRtcSpl_NormU32(x); 100fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org frac=(int16_t)WEBRTC_SPL_RSHIFT_W32(((uint32_t)WEBRTC_SPL_LSHIFT_W32(x, zeros)&0x7FFFFFFF), 23); 101b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* log2(magn(i)) */ 102b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 103b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org lg2= (WEBRTC_SPL_LSHIFT_W16((31-zeros), 8)+frac); 104b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return lg2; 105b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 106b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 107b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 108fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.orgstatic __inline int16_t exp2_Q10_T(int16_t x) { // Both in and out in Q10 109b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 110fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t tmp16_1, tmp16_2; 111b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 112fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org tmp16_2=(int16_t)(0x0400|(x&0x03FF)); 113fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org tmp16_1=-(int16_t)WEBRTC_SPL_RSHIFT_W16(x,10); 114b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if(tmp16_1>0) 115fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org return (int16_t) WEBRTC_SPL_RSHIFT_W16(tmp16_2, tmp16_1); 116b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 117fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org return (int16_t) WEBRTC_SPL_LSHIFT_W16(tmp16_2, -tmp16_1); 118b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 119b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 120b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 121b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 122b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org/* 123b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org This is a fixed-point version of the above code with limLow = 700 and limHigh = 5000, 124b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org hard-coded. The values 700 and 5000 were experimentally obtained. 125b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 126b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org The function implements membership values for two sets. The mebership functions are 127b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org of second orders corresponding to half-bell-shapped pulses. 128b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org*/ 129fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.orgstatic void MemshipValQ15( int16_t in, int16_t *A, int16_t *B ) 130b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 131fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t x; 132b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 133b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org in -= 700; /* translate the lowLim to 0, limHigh = 5000 - 700, M = 2150 */ 134b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 135b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( in <= 2150 ) 136b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 137b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( in > 0 ) 138b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 139b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* b = in^2 / (2 * M^2), a = 1 - b in Q0. 140b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org We have to compute in Q15 */ 141b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 142b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* x = in / 2150 {in Q15} = x * 15.2409 {in Q15} = 143b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org x*15 + (x*983)/(2^12); note that 983/2^12 = 0.23999 */ 144b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 145fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org /* we are sure that x is in the range of int16_t */ 146fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org x = (int16_t)( WEBRTC_SPL_MUL_16_16( in, 15 ) + 147b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_SPL_MUL_16_16_RSFT( in, 983, 12) ); 148b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* b = x^2 / 2 {in Q15} so a shift of 16 is required to 149b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org be in correct domain and one more for the division by 2 */ 150fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org *B = (int16_t)WEBRTC_SPL_RSHIFT_W32( WEBRTC_SPL_MUL_16_16( x, x ) + 0x00010000, 17 ); 151b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *A = WEBRTC_SPL_WORD16_MAX - *B; 152b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 153b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 154b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 155b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *B = 0; 156b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *A = WEBRTC_SPL_WORD16_MAX; 157b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 158b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 159b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 160b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 161b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( in < 4300 ) 162b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 163b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* This is a mirror case of the above */ 164b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org in = 4300 - in; 165fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org x = (int16_t)( WEBRTC_SPL_MUL_16_16( in, 15 ) + 166b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_SPL_MUL_16_16_RSFT( in, 983, 12) ); 167b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* b = x^2 / 2 {in Q15} so a shift of 16 is required to 168b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org be in correct domain and one more for the division by 2 */ 169fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org *A = (int16_t)WEBRTC_SPL_RSHIFT_W32( WEBRTC_SPL_MUL_16_16( x, x ) + 0x00010000, 17 ); 170b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *B = WEBRTC_SPL_WORD16_MAX - *A; 171b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 172b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 173b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 174b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 175b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *A = 0; 176b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *B = WEBRTC_SPL_WORD16_MAX; 177b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 178b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 179b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 180b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 181b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 182b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 183b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 184fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.orgstatic void LinearResampler( int16_t *in, int16_t *out, int16_t lenIn, int16_t lenOut ) 185b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 186fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int32_t n; 187fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t resOut, i, j, relativePos, diff; /* */ 188fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org uint16_t udiff; 189b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 190b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( lenIn == lenOut ) 191b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 192b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_SPL_MEMCPY_W16( out, in, lenIn ); 193b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return; 194b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 195b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 196fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org n = WEBRTC_SPL_MUL_16_16( (int16_t)(lenIn-1), RESAMP_RES ); 197fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org resOut = WebRtcSpl_DivW32W16ResW16( n, (int16_t)(lenOut-1) ); 198b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 199b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org out[0] = in[0]; 200b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for( i = 1, j = 0, relativePos = 0; i < lenOut; i++ ) 201b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 202b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 203b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org relativePos += resOut; 204b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org while( relativePos > RESAMP_RES ) 205b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 206b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org j++; 207b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org relativePos -= RESAMP_RES; 208b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 209b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 210b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 211b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* an overflow may happen and the differce in sample values may 212b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * require more than 16 bits. We like to avoid 32 bit arithmatic 213b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * as much as possible */ 214b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 215b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( (in[ j ] > 0) && (in[j + 1] < 0) ) 216b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 217fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org udiff = (uint16_t)(in[ j ] - in[j + 1]); 218fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org out[ i ] = in[ j ] - (uint16_t)( ((int32_t)( udiff * relativePos )) >> RESAMP_RES_BIT); 219b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 220b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 221b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 222b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( (in[j] < 0) && (in[j+1] > 0) ) 223b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 224fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org udiff = (uint16_t)( in[j + 1] - in[ j ] ); 225fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org out[ i ] = in[ j ] + (uint16_t)( ((int32_t)( udiff * relativePos )) >> RESAMP_RES_BIT); 226b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 227b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 228b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 229b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org diff = in[ j + 1 ] - in[ j ]; 230fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org out[ i ] = in[ j ] + (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( diff, relativePos, RESAMP_RES_BIT ); 231b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 232b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 233b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 234b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 235b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 236b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 237b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 238b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 239b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 240fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.orgint16_t WebRtcIsacfix_DecodePlcImpl(int16_t *signal_out16, 241fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org ISACFIX_DecInst_t *ISACdec_obj, 242fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t *current_framesamples ) 243b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org{ 244b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int subframecnt; 245fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t len = 0; 246b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 247fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t* Vector_Word16_1; 248fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t Vector_Word16_Extended_1[FRAMESAMPLES_HALF + NOISE_FILTER_LEN]; 249fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t* Vector_Word16_2; 250fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t Vector_Word16_Extended_2[FRAMESAMPLES_HALF + NOISE_FILTER_LEN]; 251b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 252fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int32_t Vector_Word32_1[FRAMESAMPLES_HALF]; 253fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int32_t Vector_Word32_2[FRAMESAMPLES_HALF]; 254b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 255fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t lofilt_coefQ15[ORDERLO*SUBFRAMES]; //refl. coeffs 256fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t hifilt_coefQ15[ORDERHI*SUBFRAMES]; //refl. coeffs 257b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 258fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t pitchLags_Q7[PITCH_SUBFRAMES]; 259fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t pitchGains_Q12[PITCH_SUBFRAMES]; 260b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 261fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t tmp_1, tmp_2; 262fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int32_t tmp32a, tmp32b; 263fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t gainQ13; 264b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 265fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t myDecayRate; 266b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 267b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* ---------- PLC variables ------------ */ 268fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t lag0, i, k, noiseIndex; 269fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t stretchPitchLP[PITCH_MAX_LAG + 10], stretchPitchLP1[PITCH_MAX_LAG + 10]; 270b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 271fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int32_t gain_lo_hiQ17[2*SUBFRAMES]; 272b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 273fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t nLP, pLP, wNoisyLP, wPriodicLP, tmp16, minIdx; 274fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int32_t nHP, pHP, wNoisyHP, wPriodicHP, corr, minCorr, maxCoeff; 275fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t noise1, rshift; 276b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 277b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 278fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int16_t ltpGain, pitchGain, myVoiceIndicator, myAbs, maxAbs; 279fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org int32_t varIn, varOut, logVarIn, logVarOut, Q, logMaxAbs; 280b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org int rightShiftIn, rightShiftOut; 281b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 282b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 283b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* ------------------------------------- */ 284b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 285b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 286b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org myDecayRate = (DECAY_RATE); 287b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word16_1 = &Vector_Word16_Extended_1[NOISE_FILTER_LEN]; 288b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word16_2 = &Vector_Word16_Extended_2[NOISE_FILTER_LEN]; 289b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 290b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 291b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* ----- Simply Copy Previous LPC parameters ------ */ 292b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for( subframecnt = 0; subframecnt < SUBFRAMES; subframecnt++ ) 293b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 294b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* lower Band */ 295b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_SPL_MEMCPY_W16(&lofilt_coefQ15[ subframecnt * ORDERLO ], 296b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).lofilt_coefQ15, ORDERLO); 297b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org gain_lo_hiQ17[2*subframecnt] = (ISACdec_obj->plcstr_obj).gain_lo_hiQ17[0]; 298b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 299b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* Upper Band */ 300b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_SPL_MEMCPY_W16(&hifilt_coefQ15[ subframecnt * ORDERHI ], 301b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).hifilt_coefQ15, ORDERHI); 302b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org gain_lo_hiQ17[2*subframecnt + 1] = (ISACdec_obj->plcstr_obj).gain_lo_hiQ17[1]; 303b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 304b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 305b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 306b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 307b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 308b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org lag0 = WEBRTC_SPL_RSHIFT_W16( 309b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).lastPitchLag_Q7 + 64, 7 ) + 1; 310b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 311b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 312b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( (ISACdec_obj->plcstr_obj).used != PLC_WAS_USED ) 313b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 314b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).pitchCycles = 0; 315b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 316b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).lastPitchLP = 317b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org &((ISACdec_obj->plcstr_obj).prevPitchInvIn[FRAMESAMPLES_HALF - lag0]); 318b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org minCorr = WEBRTC_SPL_WORD32_MAX; 319b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 320b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if ( (FRAMESAMPLES_HALF - 2*lag0 - 10) > 0 ) 321b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 322b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org minIdx = 11; 323b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for( i = 0; i < 21; i++ ) 324b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 325b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org corr = 0; 326b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for( k = 0; k < lag0; k++ ) 327b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 328347671c843ed5c93d25bf1a23f9295d35ce3df4abjornv@webrtc.org corr = WebRtcSpl_AddSatW32(corr, WEBRTC_SPL_ABS_W32( 329f4d24ed22c636315fa1336c10636a300d941d6b5bjornv@webrtc.org WebRtcSpl_SubSatW16( 330b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).lastPitchLP[k], 331b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).prevPitchInvIn[ 332b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org FRAMESAMPLES_HALF - 2*lag0 - 10 + i + k ] ) ) ); 333b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 334b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( corr < minCorr ) 335b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 336b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org minCorr = corr; 337b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org minIdx = i; 338b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 339b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 340b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).prevPitchLP = 341b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org &( (ISACdec_obj->plcstr_obj).prevPitchInvIn[ 342b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org FRAMESAMPLES_HALF - lag0*2 - 10 + minIdx] ); 343b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 344b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 345b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 346b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).prevPitchLP = 347b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).lastPitchLP; 348b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 349b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org pitchGain = (ISACdec_obj->plcstr_obj).lastPitchGain_Q12; 350b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 351b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WebRtcSpl_AutoCorrelation( 352b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org &(ISACdec_obj->plcstr_obj).prevPitchInvIn[FRAMESAMPLES_HALF - lag0], 353b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org lag0, 0, &varIn, &rightShiftIn); 354b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WebRtcSpl_AutoCorrelation( 355b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org &(ISACdec_obj->plcstr_obj).prevPitchInvOut[PITCH_MAX_LAG + 10 - lag0], 356b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org lag0, 0, &varOut, &rightShiftOut); 357b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 358b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org maxAbs = 0; 359b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for( i = 0; i< lag0; i++) 360b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 361b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org myAbs = WEBRTC_SPL_ABS_W16( 362b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).prevPitchInvOut[ 363b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org PITCH_MAX_LAG + 10 - lag0 + i] ); 364b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org maxAbs = (myAbs > maxAbs)? myAbs:maxAbs; 365b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 366fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org logVarIn = log2_Q8_T( (uint32_t)( varIn ) ) + 367fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int32_t)(rightShiftIn << 8); 368fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org logVarOut = log2_Q8_T( (uint32_t)( varOut ) ) + 369fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int32_t)(rightShiftOut << 8); 370fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org logMaxAbs = log2_Q8_T( (uint32_t)( maxAbs ) ); 371b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 372fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org ltpGain = (int16_t)(logVarOut - logVarIn); 373b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Q = 2 * logMaxAbs - ( logVarOut - 1512 ); 374b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 375b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* 376b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * --- 377b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * We are computing sqrt( (VarIn/lag0) / var( noise ) ) 378b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * var( noise ) is almost 256. we have already computed log2( VarIn ) in Q8 379b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * so we actually compute 2^( 0.5*(log2( VarIn ) - log2( lag0 ) - log2( var(noise ) ) ). 380b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * Note that put log function is in Q8 but the exponential function is in Q10. 381b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org * -- 382b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org */ 383b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 384fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org logVarIn -= log2_Q8_T( (uint32_t)( lag0 ) ); 385fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org tmp16 = (int16_t)((logVarIn<<1) - (4<<10) ); 386b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rightShiftIn = 0; 387b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( tmp16 > 4096 ) 388b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 389b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tmp16 -= 4096; 390b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tmp16 = exp2_Q10_T( tmp16 ); 391b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tmp16 >>= 6; 392b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 393b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 394b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tmp16 = exp2_Q10_T( tmp16 )>>10; 395b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 396b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).std = tmp16 - 4; 397b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 398b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( (ltpGain < 110) || (ltpGain > 230) ) 399b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 400b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( ltpGain < 100 && (pitchGain < 1800) ) 401b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 402b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).A = WEBRTC_SPL_WORD16_MAX; 403b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 404b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 405b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 406b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).A = ((ltpGain < 110) && (Q < 800) 407b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org )? WEBRTC_SPL_WORD16_MAX:0; 408b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 409b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).B = WEBRTC_SPL_WORD16_MAX - 410b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).A; 411b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 412b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 413b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 414b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( (pitchGain < 450) || (pitchGain > 1600) ) 415b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 416b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).A = ((pitchGain < 450) 417b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org )? WEBRTC_SPL_WORD16_MAX:0; 418b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).B = WEBRTC_SPL_WORD16_MAX - 419b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).A; 420b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 421b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 422b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 423b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org myVoiceIndicator = ltpGain * 2 + pitchGain; 424b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org MemshipValQ15( myVoiceIndicator, 425b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org &(ISACdec_obj->plcstr_obj).A, &(ISACdec_obj->plcstr_obj).B ); 426b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 427b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 428b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 429b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 430b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 431b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org myVoiceIndicator = ltpGain * 16 + pitchGain * 2 + (pitchGain >> 8); 432b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org MemshipValQ15( myVoiceIndicator, 433b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org &(ISACdec_obj->plcstr_obj).A, &(ISACdec_obj->plcstr_obj).B ); 434b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 435b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 436b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 437b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).stretchLag = lag0; 438b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).pitchIndex = 0; 439b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 440b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 441b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 442b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 443b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org myDecayRate = (DECAY_RATE<<2); 444b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 445b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 446b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( (ISACdec_obj->plcstr_obj).B < 1000 ) 447b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 448b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org myDecayRate += (DECAY_RATE<<3); 449b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 450b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 451b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* ------------ reconstructing the residual signal ------------------ */ 452b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 453b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LinearResampler( (ISACdec_obj->plcstr_obj).lastPitchLP, 454b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org stretchPitchLP, lag0, (ISACdec_obj->plcstr_obj).stretchLag ); 455b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* inverse pitch filter */ 456b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 457b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org pitchLags_Q7[0] = pitchLags_Q7[1] = pitchLags_Q7[2] = pitchLags_Q7[3] = 458b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org ((ISACdec_obj->plcstr_obj).stretchLag<<7); 459b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org pitchGains_Q12[3] = ( (ISACdec_obj->plcstr_obj).lastPitchGain_Q12); 460fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org pitchGains_Q12[2] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( 461b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org pitchGains_Q12[3], 1010, 10 ); 462fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org pitchGains_Q12[1] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( 463b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org pitchGains_Q12[2], 1010, 10 ); 464fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org pitchGains_Q12[0] = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( 465b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org pitchGains_Q12[1], 1010, 10 ); 466b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 467b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 468b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* most of the time either B or A are zero so seperating */ 469b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( (ISACdec_obj->plcstr_obj).B == 0 ) 470b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 471b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for( i = 0; i < FRAMESAMPLES_HALF; i++ ) 472b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 473b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* --- Low Pass */ 474b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).seed = WEBRTC_SPL_RAND( 475b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).seed ); 476b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word16_1[i] = WEBRTC_SPL_RSHIFT_W16( 477b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).seed, 10 ) - 16; 478b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 479b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* --- Highpass */ 480b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).seed = WEBRTC_SPL_RAND( 481b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).seed ); 482b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word16_2[i] = WEBRTC_SPL_RSHIFT_W16( 483b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).seed, 10 ) - 16; 484b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 485b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 486b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for( i = 1; i < NOISE_FILTER_LEN; i++ ) 487b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 488b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).seed = WEBRTC_SPL_RAND( 489b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).seed ); 490b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word16_Extended_1[ i ] = WEBRTC_SPL_RSHIFT_W16( 491b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).seed, 10 ) - 16; 492b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 493b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).seed = WEBRTC_SPL_RAND( 494b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).seed ); 495b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word16_Extended_2[ i ] = WEBRTC_SPL_RSHIFT_W16( 496b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).seed, 10 ) - 16; 497b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 498b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org plc_filterma_Fast(Vector_Word16_1, Vector_Word16_Extended_1, 499b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org &(ISACdec_obj->plcstr_obj).prevPitchInvIn[FRAMESAMPLES_HALF - 500fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org NOISE_FILTER_LEN], (int16_t) NOISE_FILTER_LEN, 501fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int16_t) FRAMESAMPLES_HALF, (int16_t)(5), 502fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (ISACdec_obj->plcstr_obj).decayCoeffNoise, (int16_t)(6)); 503b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 504b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org maxCoeff = WebRtcSpl_MaxAbsValueW32( 505b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org &(ISACdec_obj->plcstr_obj).prevHP[ 506b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org PITCH_MAX_LAG + 10 - NOISE_FILTER_LEN], NOISE_FILTER_LEN ); 507b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 508b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rshift = 0; 509b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org while( maxCoeff > WEBRTC_SPL_WORD16_MAX ) 510b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 511b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org maxCoeff = WEBRTC_SPL_RSHIFT_W32(maxCoeff, 1); 512b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org rshift++; 513b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 514b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for( i = 0; i < NOISE_FILTER_LEN; i++ ) { 515b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word16_1[ FRAMESAMPLES_HALF - NOISE_FILTER_LEN + i] = 516fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int16_t)WEBRTC_SPL_RSHIFT_W32( 517b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).prevHP[ 518b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org PITCH_MAX_LAG + 10 - NOISE_FILTER_LEN + i], rshift); 519b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 520b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).decayCoeffNoise = plc_filterma_Fast( 521b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word16_2, 522b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word16_Extended_2, 523b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org &Vector_Word16_1[FRAMESAMPLES_HALF - NOISE_FILTER_LEN], 524fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int16_t) NOISE_FILTER_LEN, 525fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int16_t) FRAMESAMPLES_HALF, 526fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int16_t) (5), 527b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).decayCoeffNoise, 528fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int16_t) (7) ); 529b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 530b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for( i = 0; i < FRAMESAMPLES_HALF; i++ ) 531b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word32_2[i] = WEBRTC_SPL_LSHIFT_W32( 532fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int32_t)Vector_Word16_Extended_2[i], rshift ); 533b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 534b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word16_1 = Vector_Word16_Extended_1; 535b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 536b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 537b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 538b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( (ISACdec_obj->plcstr_obj).A == 0 ) 539b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 540b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* ------ Periodic Vector --- */ 541b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for( i = 0, noiseIndex = 0; i < FRAMESAMPLES_HALF; i++, noiseIndex++ ) 542b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 543b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* --- Lowpass */ 544fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org pLP = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( 545b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org stretchPitchLP[(ISACdec_obj->plcstr_obj).pitchIndex], 546b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).decayCoeffPriodic, 15 ); 547b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 548b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* --- Highpass */ 549fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org pHP = (int32_t)WEBRTC_SPL_MUL_16_32_RSFT15( 550b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).decayCoeffPriodic, 551b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).prevHP[PITCH_MAX_LAG + 10 - 552b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).stretchLag + 553b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).pitchIndex] ); 554b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 555b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* --- lower the muliplier (more decay at next sample) --- */ 556b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).decayCoeffPriodic -= (myDecayRate); 557b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( (ISACdec_obj->plcstr_obj).decayCoeffPriodic < 0 ) 558b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).decayCoeffPriodic = 0; 559b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 560b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).pitchIndex++; 561b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 562b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( (ISACdec_obj->plcstr_obj).pitchIndex == 563b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).stretchLag ) 564b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 565b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).pitchIndex = 0; 566b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).pitchCycles++; 567b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 568b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( (ISACdec_obj->plcstr_obj).stretchLag != (lag0 + 1) ) 569b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 570b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).stretchLag = lag0 + 1; 571b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 572b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 573b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 574b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).stretchLag = lag0; 575b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 576b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 577b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).stretchLag = ( 578b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).stretchLag > PITCH_MAX_LAG 579b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org )? (PITCH_MAX_LAG):(ISACdec_obj->plcstr_obj).stretchLag; 580b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 581b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LinearResampler( (ISACdec_obj->plcstr_obj).lastPitchLP, 582b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org stretchPitchLP, lag0, (ISACdec_obj->plcstr_obj).stretchLag ); 583b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 584b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LinearResampler( (ISACdec_obj->plcstr_obj).prevPitchLP, 585b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org stretchPitchLP1, lag0, (ISACdec_obj->plcstr_obj).stretchLag ); 586b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 587b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org switch( (ISACdec_obj->plcstr_obj).pitchCycles ) 588b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 589b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case 1: 590b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 591b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for( k=0; k<(ISACdec_obj->plcstr_obj).stretchLag; k++ ) 592b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 593fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org stretchPitchLP[k] = (int16_t)(( 594fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int32_t)stretchPitchLP[k]* 3 + 595fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int32_t)stretchPitchLP1[k])>>2); 596b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 597b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 598b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 599b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case 2: 600b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 601b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for( k=0; k<(ISACdec_obj->plcstr_obj).stretchLag; k++ ) 602b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 603fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org stretchPitchLP[k] = (int16_t)(( 604fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int32_t)stretchPitchLP[k] + 605fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int32_t)stretchPitchLP1[k] )>>1); 606b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 607b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 608b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 609b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case 3: 610b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 611b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for( k=0; k<(ISACdec_obj->plcstr_obj).stretchLag; k++ ) 612b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 613fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org stretchPitchLP[k] = (int16_t)((stretchPitchLP[k] + 614fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int32_t)stretchPitchLP1[k]*3 )>>2); 615b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 616b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 617b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 618b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 619b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 620b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( (ISACdec_obj->plcstr_obj).pitchCycles == 3 ) 621b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 622b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org myDecayRate += 35; //(myDecayRate>>1); 623b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).pitchCycles = 0; 624b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 625b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 626b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 627b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 628b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* ------ Sum the noisy and periodic signals ------ */ 629b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word16_1[i] = pLP; 630b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word32_2[i] = pHP; 631b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 632b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 633b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 634b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 635b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for( i = 0, noiseIndex = 0; i < FRAMESAMPLES_HALF; i++, noiseIndex++ ) 636b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 637b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 638b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).seed = WEBRTC_SPL_RAND( 639b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).seed ); 640b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 641b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org noise1 = WEBRTC_SPL_RSHIFT_W16( 642b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).seed, 10 ) - 16; 643b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 644fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org nLP = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( 645fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int16_t)((noise1)*(ISACdec_obj->plcstr_obj).std), 646b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).decayCoeffNoise, 15 ); 647b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 648b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* --- Highpass */ 649b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).seed = WEBRTC_SPL_RAND( 650b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).seed ); 651b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org noise1 = WEBRTC_SPL_RSHIFT_W16( 652b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).seed, 11 ) - 8; 653b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 654fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org nHP = (int32_t)WEBRTC_SPL_MUL_16_32_RSFT15( 655b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).decayCoeffNoise, 656fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int32_t)(noise1*(ISACdec_obj->plcstr_obj).std) ); 657b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 658b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* --- lower the muliplier (more decay at next sample) --- */ 659b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).decayCoeffNoise -= (myDecayRate); 660b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( (ISACdec_obj->plcstr_obj).decayCoeffNoise < 0 ) 661b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).decayCoeffNoise = 0; 662b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 663b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* ------ Periodic Vector --- */ 664b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* --- Lowpass */ 665fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org pLP = (int16_t)WEBRTC_SPL_MUL_16_16_RSFT( 666b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org stretchPitchLP[(ISACdec_obj->plcstr_obj).pitchIndex], 667b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).decayCoeffPriodic, 15 ); 668b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 669b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* --- Highpass */ 670fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org pHP = (int32_t)WEBRTC_SPL_MUL_16_32_RSFT15( 671b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).decayCoeffPriodic, 672b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).prevHP[PITCH_MAX_LAG + 10 - 673b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).stretchLag + 674b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).pitchIndex] ); 675b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 676b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* --- lower the muliplier (more decay at next sample) --- */ 677b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).decayCoeffPriodic -= (myDecayRate); 678b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( (ISACdec_obj->plcstr_obj).decayCoeffPriodic < 0 ) 679b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 680b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).decayCoeffPriodic = 0; 681b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 682b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 683b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* ------ Weighting the noisy and periodic vectors ------- */ 684fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org wNoisyLP = (int16_t)(WEBRTC_SPL_MUL_16_16_RSFT( 685b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).A, nLP, 15 ) ); 686fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org wNoisyHP = (int32_t)(WEBRTC_SPL_MUL_16_32_RSFT15( 687b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).A, (nHP) ) ); 688b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 689fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org wPriodicLP = (int16_t)(WEBRTC_SPL_MUL_16_16_RSFT( 690b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).B, pLP, 15)); 691fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org wPriodicHP = (int32_t)(WEBRTC_SPL_MUL_16_32_RSFT15( 692b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).B, pHP)); 693b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 694b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).pitchIndex++; 695b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 696b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if((ISACdec_obj->plcstr_obj).pitchIndex == 697b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).stretchLag) 698b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 699b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).pitchIndex = 0; 700b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).pitchCycles++; 701b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 702b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( (ISACdec_obj->plcstr_obj).stretchLag != (lag0 + 1) ) 703b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).stretchLag = lag0 + 1; 704b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org else 705b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).stretchLag = lag0; 706b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 707b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).stretchLag = ( 708b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).stretchLag > PITCH_MAX_LAG 709b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org )? (PITCH_MAX_LAG):(ISACdec_obj->plcstr_obj).stretchLag; 710b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LinearResampler( 711b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).lastPitchLP, 712b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org stretchPitchLP, lag0, (ISACdec_obj->plcstr_obj).stretchLag ); 713b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 714b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org LinearResampler((ISACdec_obj->plcstr_obj).prevPitchLP, 715b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org stretchPitchLP1, lag0, (ISACdec_obj->plcstr_obj).stretchLag ); 716b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 717b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org switch((ISACdec_obj->plcstr_obj).pitchCycles) 718b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 719b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case 1: 720b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 721b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for( k=0; k<(ISACdec_obj->plcstr_obj).stretchLag; k++ ) 722b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 723fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org stretchPitchLP[k] = (int16_t)(( 724fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int32_t)stretchPitchLP[k]* 3 + 725fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int32_t)stretchPitchLP1[k] )>>2); 726b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 727b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 728b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 729b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case 2: 730b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 731b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for( k=0; k<(ISACdec_obj->plcstr_obj).stretchLag; k++ ) 732b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 733fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org stretchPitchLP[k] = (int16_t)(( 734fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int32_t)stretchPitchLP[k] + 735fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int32_t)stretchPitchLP1[k])>>1); 736b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 737b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 738b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 739b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org case 3: 740b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 741b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for( k=0; k<(ISACdec_obj->plcstr_obj).stretchLag; k++ ) 742b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 743fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org stretchPitchLP[k] = (int16_t)( 744b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (stretchPitchLP[k] + 745fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (int32_t)stretchPitchLP1[k]*3 )>>2); 746b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 747b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org break; 748b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 749b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 750b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 751b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org if( (ISACdec_obj->plcstr_obj).pitchCycles == 3 ) 752b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 753b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org myDecayRate += 55; //(myDecayRate>>1); 754b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).pitchCycles = 0; 755b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 756b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 757b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 758b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* ------ Sum the noisy and periodic signals ------ */ 759347671c843ed5c93d25bf1a23f9295d35ce3df4abjornv@webrtc.org Vector_Word16_1[i] = WebRtcSpl_AddSatW16(wNoisyLP, wPriodicLP); 760347671c843ed5c93d25bf1a23f9295d35ce3df4abjornv@webrtc.org Vector_Word32_2[i] = WebRtcSpl_AddSatW32(wNoisyHP, wPriodicHP); 761b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 762b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 763b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 764b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* ----------------- residual signal is reconstructed ------------------ */ 765b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 766b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org k = (ISACdec_obj->plcstr_obj).pitchIndex; 767b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* --- Write one pitch cycle for recovery block --- */ 768b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 769b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for( i = 0; i < RECOVERY_OVERLAP; i++ ) 770b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 771fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org (ISACdec_obj->plcstr_obj).overlapLP[i] = (int16_t)( 772b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WEBRTC_SPL_MUL_16_16_RSFT(stretchPitchLP[k], 773b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).decayCoeffPriodic, 15) ); 774b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org k = ( k < ((ISACdec_obj->plcstr_obj).stretchLag - 1) )? (k+1):0; 775b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 776b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 777b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).lastPitchLag_Q7 = (ISACdec_obj->plcstr_obj).stretchLag << 7; 778b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 779b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 780b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* --- Inverse Pitch Filter --- */ 781b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WebRtcIsacfix_PitchFilter(Vector_Word16_1, Vector_Word16_2, 782b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org &ISACdec_obj->pitchfiltstr_obj, pitchLags_Q7, pitchGains_Q12, 4); 783b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 784b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* reduce gain to compensate for pitch enhancer */ 785b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* gain = 1.0f - 0.45f * AvgPitchGain; */ 786b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tmp32a = WEBRTC_SPL_MUL_16_16_RSFT((ISACdec_obj->plcstr_obj).AvgPitchGain_Q12, 787b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 29, 0); // Q18 788b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org tmp32b = 262144 - tmp32a; // Q18 789fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org gainQ13 = (int16_t) (tmp32b >> 5); // Q13 790b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 791b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* perceptual post-filtering (using normalized lattice filter) */ 792b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (k = 0; k < FRAMESAMPLES_HALF; k++) 793fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org Vector_Word32_1[k] = (int32_t) WEBRTC_SPL_MUL_16_16( 794b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word16_2[k], gainQ13) << 3; // Q25 795b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 796b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 797b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WebRtcIsacfix_NormLatticeFilterAr(ORDERLO, 798b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->maskfiltstr_obj).PostStateLoGQ0, 799b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word32_1, lofilt_coefQ15, gain_lo_hiQ17, 0, Vector_Word16_1); 800b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 801b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WebRtcIsacfix_NormLatticeFilterAr(ORDERHI, 802b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->maskfiltstr_obj).PostStateHiGQ0, 803b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word32_2, hifilt_coefQ15, gain_lo_hiQ17, 1, Vector_Word16_2); 804b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 805b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* recombine the 2 bands */ 806b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 807b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* Form the polyphase signals, and compensate for DC offset */ 808b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org for (k=0;k<FRAMESAMPLES_HALF;k++) 809b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org { 810b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* Construct a new upper channel signal*/ 811fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org tmp_1 = (int16_t)WebRtcSpl_SatW32ToW16( 812fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org ((int32_t)Vector_Word16_1[k]+Vector_Word16_2[k] + 1)); 813b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org /* Construct a new lower channel signal*/ 814fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org tmp_2 = (int16_t)WebRtcSpl_SatW32ToW16( 815fbda0fcf2f9e82c82bcaac138f44d4e5144f6e0dpbos@webrtc.org ((int32_t)Vector_Word16_1[k]-Vector_Word16_2[k])); 816b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word16_1[k] = tmp_1; 817b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word16_2[k] = tmp_2; 818b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org } 819b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 820b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 821b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org WebRtcIsacfix_FilterAndCombine1(Vector_Word16_1, 822b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org Vector_Word16_2, signal_out16, &ISACdec_obj->postfiltbankstr_obj); 823b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 824b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org (ISACdec_obj->plcstr_obj).used = PLC_WAS_USED; 825b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org *current_framesamples = 480; 826b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org 827b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org return len; 828b015cbede88899f67a53fbbe581b02ce8e32794andrew@webrtc.org} 829