mirror of
https://github.com/Fishwaldo/bl_mcu_sdk.git
synced 2025-07-13 16:28:35 +00:00
272 lines
9.1 KiB
C
272 lines
9.1 KiB
C
#include "ref.h"
|
|
|
|
void ref_conv_f32(float32_t *pSrcA, uint32_t srcALen, float32_t *pSrcB,
|
|
uint32_t srcBLen, float32_t *pDst)
|
|
{
|
|
float32_t sum; /* Accumulator */
|
|
uint32_t i, j; /* loop counters */
|
|
|
|
/* Loop to calculate convolution for output length number of times */
|
|
for (i = 0; i < srcALen + srcBLen - 1; i++) {
|
|
/* Initialize sum with zero to carry out MAC operations */
|
|
sum = 0.0f;
|
|
|
|
/* Loop to perform MAC operations according to convolution equation */
|
|
for (j = 0; j <= i; j++) {
|
|
/* Check the array limitations */
|
|
if ((i - j < srcBLen) && (j < srcALen)) {
|
|
/* z[i] += x[i-j] * y[j] */
|
|
sum += pSrcB[i - j] * pSrcA[j];
|
|
}
|
|
}
|
|
/* Store the output in the destination buffer */
|
|
pDst[i] = sum;
|
|
}
|
|
}
|
|
|
|
riscv_status ref_conv_partial_f32(float32_t *pSrcA, uint32_t srcALen,
|
|
float32_t *pSrcB, uint32_t srcBLen,
|
|
float32_t *pDst, uint32_t firstIndex,
|
|
uint32_t numPoints)
|
|
{
|
|
ref_conv_f32(pSrcA, srcALen, pSrcB, srcBLen, pDst);
|
|
|
|
return RISCV_MATH_SUCCESS;
|
|
}
|
|
|
|
void ref_conv_q31(q31_t *pSrcA, uint32_t srcALen, q31_t *pSrcB,
|
|
uint32_t srcBLen, q31_t *pDst)
|
|
{
|
|
q63_t sum; /* Accumulator */
|
|
uint32_t i, j; /* loop counter */
|
|
|
|
/* Loop to calculate output of convolution for output length number of times
|
|
*/
|
|
for (i = 0; i < srcALen + srcBLen - 1; i++) {
|
|
/* Initialize sum with zero to carry on MAC operations */
|
|
sum = 0;
|
|
|
|
/* Loop to perform MAC operations according to convolution equation */
|
|
for (j = 0; j <= i; j++) {
|
|
/* Check the array limitations */
|
|
if ((i - j < srcBLen) && (j < srcALen)) {
|
|
/* z[i] += x[i-j] * y[j] */
|
|
sum += (q63_t)pSrcA[j] * (pSrcB[i - j]);
|
|
}
|
|
}
|
|
|
|
/* Store the output in the destination buffer */
|
|
pDst[i] = (q31_t)(sum >> 31U);
|
|
}
|
|
}
|
|
|
|
void ref_conv_fast_q31(q31_t *pSrcA, uint32_t srcALen, q31_t *pSrcB,
|
|
uint32_t srcBLen, q31_t *pDst)
|
|
{
|
|
q31_t sum; /* Accumulator */
|
|
uint32_t i, j; /* loop counter */
|
|
|
|
/* Loop to calculate output of convolution for output length number of times
|
|
*/
|
|
for (i = 0; i < srcALen + srcBLen - 1; i++) {
|
|
/* Initialize sum with zero to carry on MAC operations */
|
|
sum = 0;
|
|
|
|
/* Loop to perform MAC operations according to convolution equation */
|
|
for (j = 0; j <= i; j++) {
|
|
/* Check the array limitations */
|
|
if ((i - j < srcBLen) && (j < srcALen)) {
|
|
/* z[i] += x[i-j] * y[j] */
|
|
sum = (q31_t)(
|
|
(((q63_t)sum << 32) + ((q63_t)pSrcA[j] * pSrcB[i - j])) >>
|
|
32);
|
|
}
|
|
}
|
|
|
|
/* Store the output in the destination buffer */
|
|
pDst[i] = (q31_t)(sum << 1U);
|
|
}
|
|
}
|
|
|
|
riscv_status ref_conv_partial_q31(q31_t *pSrcA, uint32_t srcALen, q31_t *pSrcB,
|
|
uint32_t srcBLen, q31_t *pDst,
|
|
uint32_t firstIndex, uint32_t numPoints)
|
|
{
|
|
ref_conv_q31(pSrcA, srcALen, pSrcB, srcBLen, pDst);
|
|
|
|
return RISCV_MATH_SUCCESS;
|
|
}
|
|
|
|
riscv_status ref_conv_partial_fast_q31(q31_t *pSrcA, uint32_t srcALen,
|
|
q31_t *pSrcB, uint32_t srcBLen,
|
|
q31_t *pDst, uint32_t firstIndex,
|
|
uint32_t numPoints)
|
|
{
|
|
ref_conv_fast_q31(pSrcA, srcALen, pSrcB, srcBLen, pDst);
|
|
|
|
return RISCV_MATH_SUCCESS;
|
|
}
|
|
|
|
void ref_conv_q15(q15_t *pSrcA, uint32_t srcALen, q15_t *pSrcB,
|
|
uint32_t srcBLen, q15_t *pDst)
|
|
{
|
|
q63_t sum; /* Accumulator */
|
|
uint32_t i, j; /* loop counter */
|
|
|
|
/* Loop to calculate output of convolution for output length number of times
|
|
*/
|
|
for (i = 0; i < srcALen + srcBLen - 1; i++) {
|
|
/* Initialize sum with zero to carry on MAC operations */
|
|
sum = 0;
|
|
|
|
/* Loop to perform MAC operations according to convolution equation */
|
|
for (j = 0; j <= i; j++) {
|
|
/* Check the array limitations */
|
|
if ((i - j < srcBLen) && (j < srcALen)) {
|
|
/* z[i] += x[i-j] * y[j] */
|
|
sum += (q31_t)pSrcA[j] * pSrcB[i - j];
|
|
}
|
|
}
|
|
|
|
/* Store the output in the destination buffer */
|
|
pDst[i] = ref_sat_q15(sum >> 15U);
|
|
}
|
|
}
|
|
|
|
riscv_status ref_conv_partial_fast_opt_q15(q15_t *pSrcA, uint32_t srcALen,
|
|
q15_t *pSrcB, uint32_t srcBLen,
|
|
q15_t *pDst, uint32_t firstIndex,
|
|
uint32_t numPoints, q15_t *pScratch1,
|
|
q15_t *pScratch2)
|
|
{
|
|
q31_t sum; /* Accumulator */
|
|
uint32_t i, j; /* loop counter */
|
|
|
|
/* Loop to calculate output of convolution for output length number of times
|
|
*/
|
|
for (i = 0; i < srcALen + srcBLen - 1; i++) {
|
|
/* Initialize sum with zero to carry on MAC operations */
|
|
sum = 0;
|
|
|
|
/* Loop to perform MAC operations according to convolution equation */
|
|
for (j = 0; j <= i; j++) {
|
|
/* Check the array limitations */
|
|
if ((i - j < srcBLen) && (j < srcALen)) {
|
|
/* z[i] += x[i-j] * y[j] */
|
|
sum += (q31_t)pSrcA[j] * pSrcB[i - j];
|
|
}
|
|
}
|
|
|
|
/* Store the output in the destination buffer */
|
|
pDst[i] = ref_sat_q15(sum >> 15U);
|
|
}
|
|
|
|
return RISCV_MATH_SUCCESS;
|
|
}
|
|
|
|
void ref_conv_fast_q15(q15_t *pSrcA, uint32_t srcALen, q15_t *pSrcB,
|
|
uint32_t srcBLen, q15_t *pDst)
|
|
{
|
|
q31_t sum; /* Accumulator */
|
|
uint32_t i, j; /* loop counter */
|
|
|
|
/* Loop to calculate output of convolution for output length number of times
|
|
*/
|
|
for (i = 0; i < srcALen + srcBLen - 1; i++) {
|
|
/* Initialize sum with zero to carry on MAC operations */
|
|
sum = 0;
|
|
|
|
/* Loop to perform MAC operations according to convolution equation */
|
|
for (j = 0; j <= i; j++) {
|
|
/* Check the array limitations */
|
|
if ((i - j < srcBLen) && (j < srcALen)) {
|
|
/* z[i] += x[i-j] * y[j] */
|
|
sum += (q31_t)pSrcA[j] * pSrcB[i - j];
|
|
}
|
|
}
|
|
|
|
/* Store the output in the destination buffer */
|
|
pDst[i] = sum >> 15U;
|
|
}
|
|
}
|
|
|
|
void ref_conv_fast_opt_q15(q15_t *pSrcA, uint32_t srcALen, q15_t *pSrcB,
|
|
uint32_t srcBLen, q15_t *pDst, q15_t *pScratch1,
|
|
q15_t *pScratch2)
|
|
{
|
|
q31_t sum; /* Accumulator */
|
|
uint32_t i, j; /* loop counter */
|
|
|
|
/* Loop to calculate output of convolution for output length number of times
|
|
*/
|
|
for (i = 0; i < srcALen + srcBLen - 1; i++) {
|
|
/* Initialize sum with zero to carry on MAC operations */
|
|
sum = 0;
|
|
|
|
/* Loop to perform MAC operations according to convolution equation */
|
|
for (j = 0; j <= i; j++) {
|
|
/* Check the array limitations */
|
|
if ((i - j < srcBLen) && (j < srcALen)) {
|
|
/* z[i] += x[i-j] * y[j] */
|
|
sum += (q31_t)pSrcA[j] * pSrcB[i - j];
|
|
}
|
|
}
|
|
|
|
/* Store the output in the destination buffer */
|
|
pDst[i] = ref_sat_q15(sum >> 15U);
|
|
}
|
|
}
|
|
|
|
riscv_status ref_conv_partial_q15(q15_t *pSrcA, uint32_t srcALen, q15_t *pSrcB,
|
|
uint32_t srcBLen, q15_t *pDst,
|
|
uint32_t firstIndex, uint32_t numPoints)
|
|
{
|
|
ref_conv_q15(pSrcA, srcALen, pSrcB, srcBLen, pDst);
|
|
|
|
return RISCV_MATH_SUCCESS;
|
|
}
|
|
|
|
riscv_status ref_conv_partial_fast_q15(q15_t *pSrcA, uint32_t srcALen,
|
|
q15_t *pSrcB, uint32_t srcBLen,
|
|
q15_t *pDst, uint32_t firstIndex,
|
|
uint32_t numPoints)
|
|
{
|
|
ref_conv_fast_q15(pSrcA, srcALen, pSrcB, srcBLen, pDst);
|
|
|
|
return RISCV_MATH_SUCCESS;
|
|
}
|
|
|
|
void ref_conv_q7(q7_t *pSrcA, uint32_t srcALen, q7_t *pSrcB, uint32_t srcBLen,
|
|
q7_t *pDst)
|
|
{
|
|
q31_t sum; /* Accumulator */
|
|
uint32_t i, j; /* loop counter */
|
|
|
|
/* Loop to calculate output of convolution for output length number of times
|
|
*/
|
|
for (i = 0; i < srcALen + srcBLen - 1; i++) {
|
|
/* Initialize sum with zero to carry on MAC operations */
|
|
sum = 0;
|
|
|
|
/* Loop to perform MAC operations according to convolution equation */
|
|
for (j = 0; j <= i; j++) {
|
|
/* Check the array limitations */
|
|
if ((i - j < srcBLen) && (j < srcALen)) {
|
|
/* z[i] += x[i-j] * y[j] */
|
|
sum += (q15_t)pSrcA[j] * pSrcB[i - j];
|
|
}
|
|
}
|
|
|
|
/* Store the output in the destination buffer */
|
|
pDst[i] = (q7_t)ref_sat_q7(sum >> 7);
|
|
}
|
|
}
|
|
|
|
riscv_status ref_conv_partial_q7(q7_t *pSrcA, uint32_t srcALen, q7_t *pSrcB,
|
|
uint32_t srcBLen, q7_t *pDst,
|
|
uint32_t firstIndex, uint32_t numPoints)
|
|
{
|
|
ref_conv_q7(pSrcA, srcALen, pSrcB, srcBLen, pDst);
|
|
|
|
return RISCV_MATH_SUCCESS;
|
|
}
|