94 lines
2.9 KiB
C
94 lines
2.9 KiB
C
/*
|
|
* downsample.c
|
|
*
|
|
* This file contains the function WebRtcSpl_Downsample().
|
|
* The description header can be found in signal_processing_library.h
|
|
*
|
|
*/
|
|
|
|
#include "signal_processing_library.h"
|
|
|
|
int WebRtcSpl_Downsample(G_CONST WebRtc_Word16 *b, int b_length,
|
|
G_CONST WebRtc_Word16 *signal_in, int signal_length,
|
|
WebRtc_Word16 *state, int state_length,
|
|
WebRtc_Word16 *signal_downsampled, int max_length, int factor,
|
|
int delay)
|
|
{
|
|
WebRtc_Word32 o;
|
|
int i, j, stop;
|
|
|
|
WebRtc_Word16 *signal_downsampled_ptr = signal_downsampled;
|
|
G_CONST WebRtc_Word16 *b_ptr;
|
|
G_CONST WebRtc_Word16 *signal_in_ptr;
|
|
WebRtc_Word16 *state_ptr;
|
|
WebRtc_Word16 inc = 1 << factor;
|
|
|
|
// Unused input variable
|
|
max_length = max_length;
|
|
|
|
for (i = delay; i < signal_length; i += inc)
|
|
{
|
|
b_ptr = &b[0];
|
|
signal_in_ptr = &signal_in[i];
|
|
state_ptr = &state[state_length - 1];
|
|
|
|
o = (WebRtc_Word32)0;
|
|
stop = (i < b_length) ? i + 1 : b_length;
|
|
|
|
for (j = 0; j < stop; j++)
|
|
{
|
|
o += WEBRTC_SPL_MUL_16_16(*b_ptr++, *signal_in_ptr--);
|
|
}
|
|
for (j = i + 1; j < b_length; j++)
|
|
{
|
|
o += WEBRTC_SPL_MUL_16_16(*b_ptr++, *state_ptr--);
|
|
}
|
|
|
|
// If output is higher than 32768, saturate it. Same with negative side
|
|
// 2^27 = 134217728, which corresponds to 32768
|
|
if (o < (WebRtc_Word32)-134217728)
|
|
o = (WebRtc_Word32)-134217728;
|
|
|
|
if (o > (WebRtc_Word32)(134217727 - 2048))
|
|
o = (WebRtc_Word32)(134217727 - 2048);
|
|
|
|
*signal_downsampled_ptr++ = (WebRtc_Word16)((o + (WebRtc_Word32)2048) >> 12); //Q12 ops
|
|
}
|
|
|
|
// Get the last delay part.
|
|
for (i = ((signal_length >> factor) << factor) + inc; i < signal_length + delay; i += inc)
|
|
{
|
|
o = 0;
|
|
if (i < signal_length)
|
|
{
|
|
b_ptr = &b[0];
|
|
signal_in_ptr = &signal_in[i];
|
|
for (j = 0; j < b_length; j++)
|
|
{
|
|
o += WEBRTC_SPL_MUL_16_16(*b_ptr++, *signal_in_ptr--);
|
|
}
|
|
} else
|
|
{
|
|
b_ptr = &b[i - signal_length];
|
|
signal_in_ptr = &signal_in[signal_length - 1];
|
|
for (j = 0; j < b_length - (i - signal_length); j++)
|
|
{
|
|
o += WEBRTC_SPL_MUL_16_16(*b_ptr++, *signal_in_ptr--);
|
|
}
|
|
}
|
|
|
|
/* If output is higher than 32768, saturate it. Same with negative side
|
|
2^27 = 134217728, which corresponds to 32768
|
|
*/
|
|
if (o < (WebRtc_Word32)-134217728)
|
|
o = (WebRtc_Word32)-134217728;
|
|
|
|
if (o > (WebRtc_Word32)(134217727 - 2048))
|
|
o = (WebRtc_Word32)(134217727 - 2048);
|
|
|
|
*signal_downsampled_ptr++ = (WebRtc_Word16)((o + (WebRtc_Word32)2048) >> 12); //Q12 ops
|
|
}
|
|
|
|
return (signal_length >> factor);
|
|
}
|