bl_mcu_sdk/examples/dsp/BasicMathFunctions_part2/scale.c

50 lines
1.3 KiB
C

#include "ref.h"
void ref_scale_f32(float32_t *pSrc, float32_t scale, float32_t *pDst,
uint32_t blockSize)
{
uint32_t i;
for (i = 0; i < blockSize; i++) {
pDst[i] = pSrc[i] * scale;
}
}
void ref_scale_q31(q31_t *pSrc, q31_t scaleFract, int8_t shift, q31_t *pDst,
uint32_t blockSize)
{
uint32_t i;
int8_t kShift = shift + 1; /* Shift to apply after scaling */
int8_t sign = (kShift & 0x80);
q63_t temp;
for (i = 0; i < blockSize; i++) {
temp = ((q63_t)pSrc[i] * scaleFract) >> 32;
if (sign)
pDst[i] = temp >> -kShift;
else
pDst[i] = ref_sat_q31((q63_t)temp << kShift);
}
}
void ref_scale_q15(q15_t *pSrc, q15_t scaleFract, int8_t shift, q15_t *pDst,
uint32_t blockSize)
{
uint32_t i;
int8_t kShift = 15 - shift; /* Shift to apply after scaling */
for (i = 0; i < blockSize; i++) {
pDst[i] = ref_sat_q15(((q31_t)pSrc[i] * scaleFract) >> kShift);
}
}
void ref_scale_q7(q7_t *pSrc, q7_t scaleFract, int8_t shift, q7_t *pDst,
uint32_t blockSize)
{
uint32_t i;
int8_t kShift = 7 - shift; /* Shift to apply after scaling */
for (i = 0; i < blockSize; i++) {
pDst[i] = ref_sat_q7(((q15_t)pSrc[i] * scaleFract) >> kShift);
}
}