191 lines
9.4 KiB
C
191 lines
9.4 KiB
C
|
|
// Copyright 2018-2019 Espressif Systems (Shanghai) PTE LTD
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
|
|
#ifndef _dspi_dotprod_H_
|
|
#define _dspi_dotprod_H_
|
|
|
|
#include "esp_log.h"
|
|
#include "dsp_err.h"
|
|
#include "dsp_types.h"
|
|
#include "dspi_dotprod_platform.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
/**@{*/
|
|
/**
|
|
* @brief dot product of two images
|
|
* Dot product calculation for two floating point images: *out_value += image[i*...] * src2[i*...]); i= [0..count_x*count_y)
|
|
* The extension (_ansi) use ANSI C and could be compiled and run on any platform.
|
|
* The extension (_ae32) is optimized for ESP32 chip.
|
|
*
|
|
* @param[in] in_image descriptor of the image
|
|
* @param[in] filter descriptor of the filter
|
|
* @param[out] out_value pointer to the output value
|
|
* @param[in] count_x amount of samples by X axis (count_x*step_X <= widdth)
|
|
* @param[in] count_y amount of samples by Y axis (count_y*step_Y <= height)
|
|
* @return
|
|
* - ESP_OK on success
|
|
* - One of the error codes from DSP library
|
|
*/
|
|
esp_err_t dspi_dotprod_f32_ansi(image2d_t *in_image, image2d_t *filter, float *out_value, int count_x, int count_y);
|
|
/**@}*/
|
|
|
|
/**@{*/
|
|
/**
|
|
* @brief dot product of two images
|
|
* Dot product calculation for two floating point images: *out_value += image[i*...] * src2[i*...]); i= [0..count_x*count_y)
|
|
* The extension (_ansi) use ANSI C and could be compiled and run on any platform.
|
|
* The extension (_ae32) is optimized for ESP32 chip.
|
|
*
|
|
* @param[in] in_image descriptor of the image
|
|
* @param[in] filter descriptor of the filter
|
|
* @param[out] out_value pointer to the output value
|
|
* @param[in] count_x amount of samples by X axis (count_x*step_X <= widdth)
|
|
* @param[in] count_y amount of samples by Y axis (count_y*step_Y <= height)
|
|
* @param[in] shift - result shift to right, by default must be 15 for int16_t or 7 for int8_t
|
|
* @return
|
|
* - ESP_OK on success
|
|
* - One of the error codes from DSP library
|
|
*/
|
|
esp_err_t dspi_dotprod_s16_ansi(image2d_t *in_image, image2d_t *filter, int16_t *out_value, int count_x, int count_y, int shift);
|
|
esp_err_t dspi_dotprod_u16_ansi(image2d_t *in_image, image2d_t *filter, uint16_t *out_value, int count_x, int count_y, int shift);
|
|
esp_err_t dspi_dotprod_s8_ansi(image2d_t *in_image, image2d_t *filter, int8_t *out_value, int count_x, int count_y, int shift);
|
|
esp_err_t dspi_dotprod_u8_ansi(image2d_t *in_image, image2d_t *filter, uint8_t *out_value, int count_x, int count_y, int shift);
|
|
|
|
esp_err_t dspi_dotprod_s16_aes3(image2d_t *in_image, image2d_t *filter, int16_t *out_value, int count_x, int count_y, int shift);
|
|
esp_err_t dspi_dotprod_u16_aes3(image2d_t *in_image, image2d_t *filter, uint16_t *out_value, int count_x, int count_y, int shift);
|
|
esp_err_t dspi_dotprod_s8_aes3(image2d_t *in_image, image2d_t *filter, int8_t *out_value, int count_x, int count_y, int shift);
|
|
esp_err_t dspi_dotprod_u8_aes3(image2d_t *in_image, image2d_t *filter, uint8_t *out_value, int count_x, int count_y, int shift);
|
|
|
|
esp_err_t dspi_dotprod_s16_arp4(image2d_t *in_image, image2d_t *filter, int16_t *out_value, int count_x, int count_y, int shift);
|
|
esp_err_t dspi_dotprod_s8_arp4(image2d_t *in_image, image2d_t *filter, int8_t *out_value, int count_x, int count_y, int shift);
|
|
esp_err_t dspi_dotprod_u16_arp4(image2d_t *in_image, image2d_t *filter, uint16_t *out_value, int count_x, int count_y, int shift);
|
|
esp_err_t dspi_dotprod_u8_arp4(image2d_t *in_image, image2d_t *filter, uint8_t *out_value, int count_x, int count_y, int shift);
|
|
|
|
|
|
/**@}*/
|
|
|
|
/**@{*/
|
|
/**
|
|
* @brief dot product of two images with input offset
|
|
* Dot product calculation for two floating point images: *out_value += (image[i*...] + offset) * src2[i*...]); i= [0..count_x*count_y)
|
|
* The extension (_ansi) use ANSI C and could be compiled and run on any platform.
|
|
* The extension (_ae32) is optimized for ESP32 chip.
|
|
*
|
|
* @param[in] in_image descriptor of the image
|
|
* @param[in] filter descriptor of the filter
|
|
* @param[out] out_value pointer to the output value
|
|
* @param[in] count_x amount of samples by X axis (count_x*step_X <= widdth)
|
|
* @param[in] count_y amount of samples by Y axis (count_y*step_Y <= height)
|
|
* @param[in] offset - input offset value.
|
|
* @return
|
|
* - ESP_OK on success
|
|
* - One of the error codes from DSP library
|
|
*/
|
|
esp_err_t dspi_dotprod_off_f32_ansi(image2d_t *in_image, image2d_t *filter, float *out_value, int count_x, int count_y, float offset);
|
|
/**@}*/
|
|
|
|
/**@{*/
|
|
/**
|
|
* @brief dot product of two images with input offset
|
|
* Dot product calculation for two floating point images: *out_value += (image[i*...] + offset) * src2[i*...]); i= [0..count_x*count_y)
|
|
* The extension (_ansi) use ANSI C and could be compiled and run on any platform.
|
|
* The extension (_ae32) is optimized for ESP32 chip.
|
|
*
|
|
* @param[in] in_image descriptor of the image
|
|
* @param[in] filter descriptor of the filter
|
|
* @param[out] out_value pointer to the output value
|
|
* @param[in] count_x amount of samples by X axis (count_x*step_X <= widdth)
|
|
* @param[in] count_y amount of samples by Y axis (count_y*step_Y <= height)
|
|
* @param[in] shift - result shift to right, by default must be 15 for int16_t or 7 for int8_t
|
|
* @param[in] offset - input offset value.
|
|
* @return
|
|
* - ESP_OK on success
|
|
* - One of the error codes from DSP library
|
|
*/
|
|
esp_err_t dspi_dotprod_off_s16_ansi(image2d_t *in_image, image2d_t *filter, int16_t *out_value, int count_x, int count_y, int shift, int16_t offset);
|
|
esp_err_t dspi_dotprod_off_u16_ansi(image2d_t *in_image, image2d_t *filter, uint16_t *out_value, int count_x, int count_y, int shift, uint16_t offset);
|
|
esp_err_t dspi_dotprod_off_s8_ansi(image2d_t *in_image, image2d_t *filter, int8_t *out_value, int count_x, int count_y, int shift, int8_t offset);
|
|
esp_err_t dspi_dotprod_off_u8_ansi(image2d_t *in_image, image2d_t *filter, uint8_t *out_value, int count_x, int count_y, int shift, uint8_t offset);
|
|
|
|
esp_err_t dspi_dotprod_off_s16_aes3(image2d_t *in_image, image2d_t *filter, int16_t *out_value, int count_x, int count_y, int shift, int16_t offset);
|
|
esp_err_t dspi_dotprod_off_u16_aes3(image2d_t *in_image, image2d_t *filter, uint16_t *out_value, int count_x, int count_y, int shift, uint16_t offset);
|
|
esp_err_t dspi_dotprod_off_s8_aes3(image2d_t *in_image, image2d_t *filter, int8_t *out_value, int count_x, int count_y, int shift, int8_t offset);
|
|
esp_err_t dspi_dotprod_off_u8_aes3(image2d_t *in_image, image2d_t *filter, uint8_t *out_value, int count_x, int count_y, int shift, uint8_t offset);
|
|
|
|
esp_err_t dspi_dotprod_off_s16_arp4(image2d_t *in_image, image2d_t *filter, int16_t *out_value, int count_x, int count_y, int shift, int16_t offset);
|
|
esp_err_t dspi_dotprod_off_u16_arp4(image2d_t *in_image, image2d_t *filter, uint16_t *out_value, int count_x, int count_y, int shift, uint16_t offset);
|
|
esp_err_t dspi_dotprod_off_s8_arp4(image2d_t *in_image, image2d_t *filter, int8_t *out_value, int count_x, int count_y, int shift, int8_t offset);
|
|
esp_err_t dspi_dotprod_off_u8_arp4(image2d_t *in_image, image2d_t *filter, uint8_t *out_value, int count_x, int count_y, int shift, uint8_t offset);
|
|
|
|
/**@}*/
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|
|
#ifdef CONFIG_DSP_OPTIMIZED
|
|
#define dspi_dotprod_f32 dspi_dotprod_f32_ansi
|
|
#define dspi_dotprod_off_f32 dspi_dotprod_off_f32_ansi
|
|
#if (dspi_dotprod_aes3_enabled == 1)
|
|
#define dspi_dotprod_s16 dspi_dotprod_s16_aes3
|
|
#define dspi_dotprod_u16 dspi_dotprod_u16_aes3
|
|
#define dspi_dotprod_s8 dspi_dotprod_s8_aes3
|
|
#define dspi_dotprod_u8 dspi_dotprod_u8_aes3
|
|
#define dspi_dotprod_off_s16 dspi_dotprod_off_s16_aes3
|
|
#define dspi_dotprod_off_s8 dspi_dotprod_off_s8_aes3
|
|
#define dspi_dotprod_off_u16 dspi_dotprod_off_u16_aes3
|
|
#define dspi_dotprod_off_u8 dspi_dotprod_off_u8_aes3
|
|
#elif (dspi_dotprod_arp4_enabled == 1)
|
|
#define dspi_dotprod_s16 dspi_dotprod_s16_arp4
|
|
#define dspi_dotprod_s8 dspi_dotprod_s8_arp4
|
|
#define dspi_dotprod_u16 dspi_dotprod_u16_arp4
|
|
#define dspi_dotprod_u8 dspi_dotprod_u8_arp4
|
|
#define dspi_dotprod_off_s16 dspi_dotprod_off_s16_arp4
|
|
#define dspi_dotprod_off_s8 dspi_dotprod_off_s8_arp4
|
|
#define dspi_dotprod_off_u16 dspi_dotprod_off_u16_arp4
|
|
#define dspi_dotprod_off_u8 dspi_dotprod_off_u8_arp4
|
|
#else
|
|
#define dspi_dotprod_s16 dspi_dotprod_s16_ansi
|
|
#define dspi_dotprod_s8 dspi_dotprod_s8_ansi
|
|
#define dspi_dotprod_u16 dspi_dotprod_u16_ansi
|
|
#define dspi_dotprod_u8 dspi_dotprod_u8_ansi
|
|
#define dspi_dotprod_off_s16 dspi_dotprod_off_s16_ansi
|
|
#define dspi_dotprod_off_s8 dspi_dotprod_off_s8_ansi
|
|
#define dspi_dotprod_off_u16 dspi_dotprod_off_u16_ansi
|
|
#define dspi_dotprod_off_u8 dspi_dotprod_off_u8_ansi
|
|
#endif
|
|
#endif
|
|
#ifdef CONFIG_DSP_ANSI
|
|
#define dspi_dotprod_f32 dspi_dotprod_f32_ansi
|
|
#define dspi_dotprod_off_f32 dspi_dotprod_off_f32_ansi
|
|
#define dspi_dotprod_s16 dspi_dotprod_s16_ansi
|
|
#define dspi_dotprod_s8 dspi_dotprod_s8_ansi
|
|
#define dspi_dotprod_off_s16 dspi_dotprod_off_s16_ansi
|
|
#define dspi_dotprod_off_s8 dspi_dotprod_off_s8_ansi
|
|
#define dspi_dotprod_u16 dspi_dotprod_u16_ansi
|
|
#define dspi_dotprod_u8 dspi_dotprod_u8_ansi
|
|
#define dspi_dotprod_off_u16 dspi_dotprod_off_u16_ansi
|
|
#define dspi_dotprod_off_u8 dspi_dotprod_off_u8_ansi
|
|
#endif
|
|
|
|
|
|
#endif // _dspi_dotprod_H_
|