mirror of
https://github.com/oxen-io/session-android.git
synced 2024-12-27 18:27:43 +00:00
d83a3d71bc
Merge in RedPhone // FREEBIE
111 lines
3.2 KiB
C
111 lines
3.2 KiB
C
/*
|
|
* 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++;
|
|
}
|
|
}
|