1 /* 2 * Copyright (c) 2011 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 /****************************************************************** 12 13 iLBC Speech Coder ANSI-C Source Code 14 15 WebRtcIlbcfix_EnhUpsample.c 16 17 ******************************************************************/ 18 19 #include "modules/audio_coding/codecs/ilbc/defines.h" 20 #include "modules/audio_coding/codecs/ilbc/constants.h" 21 22 /*----------------------------------------------------------------* 23 * upsample finite array assuming zeros outside bounds 24 *---------------------------------------------------------------*/ 25 WebRtcIlbcfix_EnhUpsample(int32_t * useq1,int16_t * seq1)26void WebRtcIlbcfix_EnhUpsample( 27 int32_t *useq1, /* (o) upsampled output sequence */ 28 int16_t *seq1 /* (i) unupsampled sequence */ 29 ){ 30 int j; 31 int32_t *pu1, *pu11; 32 int16_t *ps, *w16tmp; 33 const int16_t *pp; 34 35 /* filtering: filter overhangs left side of sequence */ 36 pu1=useq1; 37 for (j=0;j<ENH_UPS0; j++) { 38 pu11=pu1; 39 /* i = 2 */ 40 pp=WebRtcIlbcfix_kEnhPolyPhaser[j]+1; 41 ps=seq1+2; 42 *pu11 = (*ps--) * *pp++; 43 *pu11 += (*ps--) * *pp++; 44 *pu11 += (*ps--) * *pp++; 45 pu11+=ENH_UPS0; 46 /* i = 3 */ 47 pp=WebRtcIlbcfix_kEnhPolyPhaser[j]+1; 48 ps=seq1+3; 49 *pu11 = (*ps--) * *pp++; 50 *pu11 += (*ps--) * *pp++; 51 *pu11 += (*ps--) * *pp++; 52 *pu11 += (*ps--) * *pp++; 53 pu11+=ENH_UPS0; 54 /* i = 4 */ 55 pp=WebRtcIlbcfix_kEnhPolyPhaser[j]+1; 56 ps=seq1+4; 57 *pu11 = (*ps--) * *pp++; 58 *pu11 += (*ps--) * *pp++; 59 *pu11 += (*ps--) * *pp++; 60 *pu11 += (*ps--) * *pp++; 61 *pu11 += (*ps--) * *pp++; 62 pu1++; 63 } 64 65 /* filtering: simple convolution=inner products 66 (not needed since the sequence is so short) 67 */ 68 69 /* filtering: filter overhangs right side of sequence */ 70 71 /* Code with loops, which is equivivalent to the expanded version below 72 73 filterlength = 5; 74 hf1 = 2; 75 for(j=0;j<ENH_UPS0; j++){ 76 pu = useq1 + (filterlength-hfl)*ENH_UPS0 + j; 77 for(i=1; i<=hfl; i++){ 78 *pu=0; 79 pp = polyp[j]+i; 80 ps = seq1+dim1-1; 81 for(k=0;k<filterlength-i;k++) { 82 *pu += (*ps--) * *pp++; 83 } 84 pu+=ENH_UPS0; 85 } 86 } 87 */ 88 pu1 = useq1 + 12; 89 w16tmp = seq1+4; 90 for (j=0;j<ENH_UPS0; j++) { 91 pu11 = pu1; 92 /* i = 1 */ 93 pp = WebRtcIlbcfix_kEnhPolyPhaser[j]+2; 94 ps = w16tmp; 95 *pu11 = (*ps--) * *pp++; 96 *pu11 += (*ps--) * *pp++; 97 *pu11 += (*ps--) * *pp++; 98 *pu11 += (*ps--) * *pp++; 99 pu11+=ENH_UPS0; 100 /* i = 2 */ 101 pp = WebRtcIlbcfix_kEnhPolyPhaser[j]+3; 102 ps = w16tmp; 103 *pu11 = (*ps--) * *pp++; 104 *pu11 += (*ps--) * *pp++; 105 *pu11 += (*ps--) * *pp++; 106 pu11+=ENH_UPS0; 107 108 pu1++; 109 } 110 } 111