aboutsummaryrefslogtreecommitdiff
path: root/webrtc/modules/audio_coding/codecs/ilbc/enh_upsample.c
blob: 91f3970ead2b4649b9e0ee55d46bc774031f2a3c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/*
 *  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.
 */

/******************************************************************

 iLBC Speech Coder ANSI-C Source Code

 WebRtcIlbcfix_EnhUpsample.c

******************************************************************/

#include "defines.h"
#include "constants.h"

/*----------------------------------------------------------------*
 * upsample finite array assuming zeros outside bounds
 *---------------------------------------------------------------*/

void WebRtcIlbcfix_EnhUpsample(
    int32_t *useq1, /* (o) upsampled output sequence */
    int16_t *seq1 /* (i) unupsampled sequence */
                                ){
  int j;
  int32_t *pu1, *pu11;
  int16_t *ps, *w16tmp;
  const int16_t *pp;

  /* filtering: filter overhangs left side of sequence */
  pu1=useq1;
  for (j=0;j<ENH_UPS0; j++) {
    pu11=pu1;
    /* i = 2 */
    pp=WebRtcIlbcfix_kEnhPolyPhaser[j]+1;
    ps=seq1+2;
    (*pu11) = WEBRTC_SPL_MUL_16_16(*ps--,*pp++);
    (*pu11) += WEBRTC_SPL_MUL_16_16(*ps--,*pp++);
    (*pu11) += WEBRTC_SPL_MUL_16_16(*ps--,*pp++);
    pu11+=ENH_UPS0;
    /* i = 3 */
    pp=WebRtcIlbcfix_kEnhPolyPhaser[j]+1;
    ps=seq1+3;
    (*pu11) = WEBRTC_SPL_MUL_16_16(*ps--,*pp++);
    (*pu11) += WEBRTC_SPL_MUL_16_16(*ps--,*pp++);
    (*pu11) += WEBRTC_SPL_MUL_16_16(*ps--,*pp++);
    (*pu11) += WEBRTC_SPL_MUL_16_16(*ps--,*pp++);
    pu11+=ENH_UPS0;
    /* i = 4 */
    pp=WebRtcIlbcfix_kEnhPolyPhaser[j]+1;
    ps=seq1+4;
    (*pu11) = WEBRTC_SPL_MUL_16_16(*ps--,*pp++);
    (*pu11) += WEBRTC_SPL_MUL_16_16(*ps--,*pp++);
    (*pu11) += WEBRTC_SPL_MUL_16_16(*ps--,*pp++);
    (*pu11) += WEBRTC_SPL_MUL_16_16(*ps--,*pp++);
    (*pu11) += WEBRTC_SPL_MUL_16_16(*ps--,*pp++);
    pu1++;
  }

  /* filtering: simple convolution=inner products
     (not needed since the sequence is so short)
  */

  /* filtering: filter overhangs right side of sequence */

  /* Code with loops, which is equivivalent to the expanded version below

     filterlength = 5;
     hf1 = 2;
     for(j=0;j<ENH_UPS0; j++){
     pu = useq1 + (filterlength-hfl)*ENH_UPS0 + j;
     for(i=1; i<=hfl; i++){
     *pu=0;
     pp = polyp[j]+i;
     ps = seq1+dim1-1;
     for(k=0;k<filterlength-i;k++) {
     *pu += WEBRTC_SPL_MUL_16_16(*ps--, *pp++);
     }
     pu+=ENH_UPS0;
     }
     }
  */
  pu1 = useq1 + 12;
  w16tmp = seq1+4;
  for (j=0;j<ENH_UPS0; j++) {
    pu11 = pu1;
    /* i = 1 */
    pp = WebRtcIlbcfix_kEnhPolyPhaser[j]+2;
    ps = w16tmp;
    (*pu11) = WEBRTC_SPL_MUL_16_16(*ps--, *pp++);
    (*pu11) += WEBRTC_SPL_MUL_16_16(*ps--, *pp++);
    (*pu11) += WEBRTC_SPL_MUL_16_16(*ps--, *pp++);
    (*pu11) += WEBRTC_SPL_MUL_16_16(*ps--, *pp++);
    pu11+=ENH_UPS0;
    /* i = 2 */
    pp = WebRtcIlbcfix_kEnhPolyPhaser[j]+3;
    ps = w16tmp;
    (*pu11) = WEBRTC_SPL_MUL_16_16(*ps--, *pp++);
    (*pu11) += WEBRTC_SPL_MUL_16_16(*ps--, *pp++);
    (*pu11) += WEBRTC_SPL_MUL_16_16(*ps--, *pp++);
    pu11+=ENH_UPS0;

    pu1++;
  }
}