/*
|
* Copyright (c) 2019-2023 Beijing Hanwei Innovation Technology Ltd. Co. and
|
* its subsidiaries and affiliates (collectly called MKSEMI).
|
*
|
* All rights reserved.
|
*
|
* Redistribution and use in source and binary forms, with or without
|
* modification, are permitted provided that the following conditions are met:
|
*
|
* 1. Redistributions of source code must retain the above copyright notice,
|
* this list of conditions and the following disclaimer.
|
*
|
* 2. Redistributions in binary form, except as embedded into an MKSEMI
|
* integrated circuit in a product or a software update for such product,
|
* must reproduce the above copyright notice, this list of conditions and
|
* the following disclaimer in the documentation and/or other materials
|
* provided with the distribution.
|
*
|
* 3. Neither the name of MKSEMI nor the names of its contributors may be used
|
* to endorse or promote products derived from this software without
|
* specific prior written permission.
|
*
|
* 4. This software, with or without modification, must only be used with a
|
* MKSEMI integrated circuit.
|
*
|
* 5. Any software provided in binary form under this license must not be
|
* reverse engineered, decompiled, modified and/or disassembled.
|
*
|
* THIS SOFTWARE IS PROVIDED BY MKSEMI "AS IS" AND ANY EXPRESS OR IMPLIED
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
* MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
* DISCLAIMED. IN NO EVENT SHALL MKSEMI OR CONTRIBUTORS BE LIABLE FOR ANY
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
*/
|
|
#include "mk_trace.h"
|
#include "mk_wdt.h"
|
#include "mk_reset.h"
|
#include "mk_calib.h"
|
#include "mk_lsp.h"
|
#include "libc_rom.h"
|
#include "board.h"
|
#include "stdio.h"
|
|
static float test_buf_a[256];
|
static float test_buf_b[256];
|
static float test_buf_c[256];
|
|
static int32_t test_buf_e[256];
|
static int32_t test_buf_f[256];
|
|
static void lsp_test(void)
|
{
|
lsp_open(0, NULL);
|
|
float *a = (float *)&test_buf_a[0];
|
float *b = (float *)&test_buf_b[0];
|
float *c = (float *)&test_buf_c[0];
|
|
int8_t *x = (int8_t *)&test_buf_e[0];
|
int8_t *y = (int8_t *)&test_buf_f[0];
|
int16_t *zz = (int16_t *)&test_buf_c[0];
|
|
int16_t *xx = (int16_t *)&test_buf_e[0];
|
int16_t *yy = (int16_t *)&test_buf_f[0];
|
int32_t *zzz = (int32_t *)&test_buf_c[0];
|
|
for (uint32_t i = 0; i < 100; i++)
|
{
|
*a++ = 1.23f + ((float)i / 100.0f);
|
*b++ = 0.45f + ((float)i / 100.0f);
|
*c++ = 0;
|
}
|
mk_printf("\r\n ---- lsp_add_f32 ---- \r\n");
|
|
// c[i] = a[i] + b[i]
|
a = (float *)&test_buf_a[0];
|
b = (float *)&test_buf_b[0];
|
c = (float *)&test_buf_c[0];
|
|
lsp_add_f32(a, b, c, 3);
|
|
mk_printf("%f + %f = %f\r\n", a[0], b[0], c[0]);
|
mk_printf("%f + %f = %f\r\n", a[1], b[1], c[1]);
|
mk_printf("%f + %f = %f\r\n", a[2], b[2], c[2]);
|
|
mk_printf("\r\n ---- lsp_sub_f32 ---- \r\n");
|
// c[i] = a[i] - b[i]
|
a = (float *)&test_buf_a[0];
|
b = (float *)&test_buf_b[0];
|
c = (float *)&test_buf_c[0];
|
lsp_sub_f32(a, b, c, 3);
|
|
mk_printf("%f - %f = %f\r\n", *a++, *b++, *c++);
|
mk_printf("%f - %f = %f\r\n", *a++, *b++, *c++);
|
mk_printf("%f - %f = %f\r\n", *a++, *b++, *c++);
|
|
mk_printf("\r\n ---- lsp_mult_f32 ---- \r\n");
|
// c[i] = a[i] * b[i]
|
a = (float *)&test_buf_a[0];
|
b = (float *)&test_buf_b[0];
|
c = (float *)&test_buf_c[0];
|
lsp_mult_f32(a, b, c, 3);
|
|
mk_printf("%f * %f = %f\r\n", *a++, *b++, *c++);
|
mk_printf("%f * %f = %f\r\n", *a++, *b++, *c++);
|
mk_printf("%f * %f = %f\r\n", *a++, *b++, *c++);
|
|
mk_printf("\r\n ---- lsp_vinverse_f32 ---- \r\n");
|
// c[i] = 1.0 / a[i]
|
a = (float *)&test_buf_a[0];
|
c = (float *)&test_buf_c[0];
|
lsp_vinverse_f32(a, c, 3);
|
|
mk_printf("1.0 / %f = %f\r\n", *a++, *c++);
|
mk_printf("1.0 / %f = %f\r\n", *a++, *c++);
|
mk_printf("1.0 / %f = %f\r\n", *a++, *c++);
|
|
mk_printf("\r\n ---- lsp_inner_product_f32 ---- \r\n");
|
// c = sum ( a[i] * b[i] )
|
a = (float *)&test_buf_a[0];
|
b = (float *)&test_buf_b[0];
|
c = (float *)&test_buf_c[0];
|
lsp_inner_product_f32(a, b, c, 3);
|
|
mk_printf("%f * %f + %f * %f + %f * %f = %f\r\n", *a, *b, *(a + 1), *(b + 1), *(a + 2), *(b + 2), *c++);
|
|
c = (float *)&test_buf_c[0];
|
for (uint32_t i = 0; i < 100; i++)
|
{
|
*c++ = 0;
|
}
|
|
mk_printf("\r\n ---- lsp_scale_f32 ---- \r\n");
|
// c[i] = scale * a[i]
|
a = (float *)&test_buf_a[0];
|
float scale = 0.5f;
|
c = (float *)&test_buf_c[0];
|
lsp_scale_f32(a, scale, c, 3);
|
|
mk_printf("%f * %f = %f\r\n", *a++, scale, *c++);
|
mk_printf("%f * %f = %f\r\n", *a++, scale, *c++);
|
mk_printf("%f * %f = %f\r\n", *a++, scale, *c++);
|
|
c = (float *)&test_buf_c[0];
|
for (uint32_t i = 0; i < 100; i++)
|
{
|
*c++ = 0;
|
}
|
|
mk_printf("\r\n ---- lsp_cmplx_mult_cmplx_int8 ---- \r\n");
|
// c[(2*n)+0] = a[(2*n)+0] * b[(2*n)+0] - a[(2*n)+1] * b[(2*n)+1];
|
// c[(2*n)+1] = a[(2*n)+0] * b[(2*n)+1] + a[(2*n)+1] * b[(2*n)+0];
|
for (int8_t i = 0; i < 100; i++)
|
{
|
*x++ = i;
|
*y++ = i;
|
}
|
|
x = (int8_t *)&test_buf_e[0];
|
y = (int8_t *)&test_buf_f[0];
|
zz = (int16_t *)&test_buf_c[0];
|
lsp_cmplx_mult_cmplx_int8(x, y, zz, 16, 0);
|
|
for (int i = 0; i < 16; i++)
|
{
|
mk_printf("(%d + %di) * (%d + %di) = %d + %di\r\n", x[2 * i], x[2 * i + 1], y[2 * i], y[2 * i + 1], zz[2 * i], zz[2 * i + 1]);
|
}
|
|
c = (float *)&test_buf_c[0];
|
for (uint32_t i = 0; i < 100; i++)
|
{
|
*c++ = 0;
|
}
|
|
mk_printf("\r\n ---- lsp_cmplx_mult_cmplx_int16 ---- \r\n");
|
// c[(2*n)+0] = a[(2*n)+0] * b[(2*n)+0] - a[(2*n)+1] * b[(2*n)+1];
|
// c[(2*n)+1] = a[(2*n)+0] * b[(2*n)+1] + a[(2*n)+1] * b[(2*n)+0];
|
for (int16_t i = 0; i < 100; i++)
|
{
|
*xx++ = i;
|
*yy++ = i;
|
}
|
|
xx = (int16_t *)&test_buf_e[0];
|
yy = (int16_t *)&test_buf_f[0];
|
zzz = (int32_t *)&test_buf_c[0];
|
lsp_cmplx_mult_cmplx_int16(xx, yy, zzz, 16, 0);
|
|
for (int i = 0; i < 16; i++)
|
{
|
mk_printf("(%d + %di) * (%d + %di) = %d + %di\r\n", xx[2 * i], xx[2 * i + 1], yy[2 * i], yy[2 * i + 1], zzz[2 * i], zzz[2 * i + 1]);
|
}
|
|
c = (float *)&test_buf_c[0];
|
for (uint32_t i = 0; i < 100; i++)
|
{
|
*c++ = 0;
|
}
|
|
mk_printf("\r\n ---- lsp_cmplx_mult_cmplx_f32 ---- \r\n");
|
// c[(2*n)+0] = a[(2*n)+0] * b[(2*n)+0] - a[(2*n)+1] * b[(2*n)+1];
|
// c[(2*n)+1] = a[(2*n)+0] * b[(2*n)+1] + a[(2*n)+1] * b[(2*n)+0];
|
a = (float *)&test_buf_a[0];
|
b = (float *)&test_buf_b[0];
|
c = (float *)&test_buf_c[0];
|
lsp_cmplx_mult_cmplx_f32(a, b, c, 3, 0);
|
mk_printf("(%f + %fi) * (%f + %fi) = %f + %fi\r\n", *a, *(a + 1), *b, *(b + 1), *c, *(c + 1));
|
mk_printf("(%f + %fi) * (%f + %fi) = %f + %fi\r\n", *(a + 2), *(a + 3), *(b + 2), *(b + 3), *(c + 2), *(c + 3));
|
mk_printf("(%f + %fi) * (%f + %fi) = %f + %fi\r\n", *(a + 4), *(a + 5), *(b + 4), *(b + 5), *(c + 4), *(c + 5));
|
|
c = (float *)&test_buf_c[0];
|
for (uint32_t i = 0; i < 100; i++)
|
{
|
*c++ = 0;
|
}
|
|
mk_printf("\r\n ---- lsp_cmplx_inner_product_int8 ---- \r\n");
|
// z = sum ( x[i] * y[i] )
|
for (int8_t i = 0; i < 10; i++)
|
{
|
*x++ = i;
|
*y++ = i;
|
}
|
|
x = (int8_t *)&test_buf_e[0];
|
y = (int8_t *)&test_buf_f[0];
|
zzz = (int32_t *)&test_buf_c[0];
|
|
lsp_cmplx_inner_product_int8(x, y, zzz, 4, 0);
|
|
mk_printf("(%d + %di) * (%d + %di) + ", x[0], x[1], y[0], y[1]);
|
mk_printf("(%d + %di) * (%d + %di) + ", x[2], x[3], y[2], y[3]);
|
mk_printf("(%d + %di) * (%d + %di) + ", x[4], x[5], y[4], y[5]);
|
mk_printf("(%d + %di) * (%d + %di) = ", x[6], x[7], y[6], y[7]);
|
mk_printf("%d + %di\r\n", zzz[0], zzz[1]);
|
|
c = (float *)&test_buf_c[0];
|
for (uint32_t i = 0; i < 100; i++)
|
{
|
*c++ = 0;
|
}
|
|
mk_printf("\r\n ---- lsp_cmplx_inner_product_int16 ---- \r\n");
|
// c = sum ( x[i] * y[i] )
|
for (int8_t i = 0; i < 10; i++)
|
{
|
*xx++ = i;
|
*yy++ = i;
|
}
|
|
xx = (int16_t *)&test_buf_e[0];
|
yy = (int16_t *)&test_buf_f[0];
|
c = (float *)&test_buf_c[0];
|
lsp_cmplx_inner_product_int16(xx, yy, c, 4, 0);
|
|
mk_printf("(%d + %di) * (%d + %di) + ", x[0], x[1], y[0], y[1]);
|
mk_printf("(%d + %di) * (%d + %di) + ", x[2], x[3], y[2], y[3]);
|
mk_printf("(%d + %di) * (%d + %di) + ", x[4], x[5], y[4], y[5]);
|
mk_printf("(%d + %di) * (%d + %di) = ", x[6], x[7], y[6], y[7]);
|
mk_printf("%f + %fi\r\n", c[0], c[1]);
|
|
c = (float *)&test_buf_c[0];
|
for (uint32_t i = 0; i < 100; i++)
|
{
|
*c++ = 0;
|
}
|
|
mk_printf("\r\n ---- lsp_cmplx_inner_product_f32 ---- \r\n");
|
// c = sum ( a[i] * b[i] )
|
a = (float *)&test_buf_a[0];
|
b = (float *)&test_buf_b[0];
|
c = (float *)&test_buf_c[0];
|
lsp_cmplx_inner_product_f32(a, b, c, 3, 0);
|
|
mk_printf("(%f + %fi) * (%f + %fi) + ", a[0], a[1], b[0], b[1]);
|
mk_printf("(%f + %fi) * (%f + %fi) + ", a[2], a[3], b[2], b[3]);
|
mk_printf("(%f + %fi) * (%f + %fi) = ", a[4], a[5], b[4], b[5]);
|
mk_printf("%f + %fi\r\n", c[0], c[1]);
|
|
c = (float *)&test_buf_c[0];
|
for (uint32_t i = 0; i < 100; i++)
|
{
|
*c++ = 0;
|
}
|
|
mk_printf("\r\n ---- lsp_cmplx_scale_f32 ---- \r\n");
|
// c[i] = scale * a[i]
|
a = (float *)&test_buf_a[0];
|
float re_scale = 0.5f;
|
float im_scale = 0.1f;
|
c = (float *)&test_buf_c[0];
|
lsp_cmplx_scale_f32(a, re_scale, im_scale, c, 3, 0);
|
|
mk_printf("(%f + %fi) * (%f + %fi) = %f + %fi\r\n", *a, *(a + 1), re_scale, im_scale, *c, *(c + 1));
|
mk_printf("(%f + %fi) * (%f + %fi) = %f + %fi\r\n", *(a + 2), *(a + 3), re_scale, im_scale, *(c + 2), *(c + 3));
|
mk_printf("(%f + %fi) * (%f + %fi) = %f + %fi\r\n", *(a + 4), *(a + 5), re_scale, im_scale, *(c + 4), *(c + 5));
|
}
|
|
int main(void)
|
{
|
board_clock_run();
|
board_pins_config();
|
board_debug_console_open(TRACE_PORT_UART0);
|
// Reset reason
|
reset_cause_get();
|
reset_cause_clear();
|
|
// Chip calibration
|
calib_chip();
|
|
// Disable watchdog timer
|
wdt_close(WDT_ID0);
|
LOG_INFO(TRACE_MODULE_APP, "LSP example start\r\n");
|
|
gpio_open();
|
board_configure();
|
|
lsp_test();
|
|
LOG_INFO(TRACE_MODULE_APP, "LSP example end\r\n");
|
while (1)
|
{
|
}
|
}
|