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);
}