146 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			146 lines
		
	
	
		
			6.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /****************************************************************************
 | |
| 
 | |
| Copyright(c) 2019 by Aerospace C.Power (Chongqing) Microelectronics. ALL RIGHTS RESERVED.
 | |
| 
 | |
| This Information is proprietary to Aerospace C.Power (Chongqing) Microelectronics and MAY NOT
 | |
| be copied by any method or incorporated into another program without
 | |
| the express written consent of Aerospace C.Power. This Information or any portion
 | |
| thereof remains the property of Aerospace C.Power. The Information contained herein
 | |
| is believed to be accurate and Aerospace C.Power assumes no responsibility or
 | |
| liability for its use in any way and conveys no license or title under
 | |
| any patent or copyright and makes no representation or warranty that this
 | |
| Information is free from patent or copyright infringement.
 | |
| 
 | |
| ****************************************************************************/
 | |
| #ifndef QUANTIZE_AND_DEQUANTIZE_H
 | |
| #define QUANTIZE_AND_DEQUANTIZE_H
 | |
| /* os shim includes */
 | |
| #include "os_types_api.h"
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| /** \defgroup quantize_and_dequantize API
 | |
|   * @brief quantize_and_dequantize APIs
 | |
|   * These functions could be used for quantize float numbers to 8bit or 16bit numbers
 | |
|   *
 | |
|   */
 | |
| 
 | |
| /** @addtogroup quantize_and_dequantize_APIs
 | |
|   * @{
 | |
|   */
 | |
| 
 | |
| /* @brief quantize_to_int8() - to quantize a sequence of float number input to int8, output[i] = floor(clamp(input[i] * scale + bias, -128.0, 127.0)), 
 | |
|  * @param input: pointer to input float numbers
 | |
|  * @param out: pointer to output uint8 numbers
 | |
|  * @param length: the length of input number sequence, therefore, input occupies 4 * length bytes in ddr
 | |
|  * @param scale: constant
 | |
|  * @param bias: constant
 | |
|  * @return 0: success
 | |
|  * @return 1 -- input address is not a multiple of 32
 | |
|  * @return 2 -- out address is not a multiple of 32
 | |
|  * @return 3 -- length is not a multiple of 8
 | |
|  */
 | |
| uint8_t quantize_to_int8(float *input, int8_t *out, uint32_t length, float scale, float bias);
 | |
| 
 | |
| /* @brief quantize_to_uint8() - to quantize a sequence of float number input to uint8, output[i] = floor(clamp(input[i] * scale + bias, 0, 255.0)), 
 | |
|  * @param input: pointer to input float numbers
 | |
|  * @param out: pointer to output uint8 numbers
 | |
|  * @param length: the length of input number sequence, therefore, input occupies 4 * length bytes in ddr
 | |
|  * @param scale: constant
 | |
|  * @param bias: constant
 | |
|  * @return 0: success
 | |
|  * @return 1 -- input address is not a multiple of 32
 | |
|  * @return 2 -- out address is not a multiple of 32
 | |
|  * @return 3 -- length is not a multiple of 8
 | |
|  */
 | |
| uint8_t quantize_to_uint8(float *input, uint8_t *out, uint32_t length, float scale, float bias);
 | |
| 
 | |
| /* @brief quantize_to_int16() - to quantize a sequence of float number input to int16, output[i] = floor(clamp(input[i] * scale + bias, -32768.0, 32767.0)), 
 | |
|  * @param input: pointer to input float numbers
 | |
|  * @param out: pointer to output uint16 numbers
 | |
|  * @param length: the length of input number sequence, therefore, input occupies 4 * length bytes in ddr
 | |
|  * @param scale: constant
 | |
|  * @param bias: constant
 | |
|  * @return 0: success
 | |
|  * @return 1 -- input address is not a multiple of 32
 | |
|  * @return 2 -- out address is not a multiple of 32
 | |
|  * @return 3 -- length is not a multiple of 8
 | |
|  */
 | |
| uint8_t quantize_to_int16(float *input, int16_t *out, uint32_t length, float scale, float bias);
 | |
| 
 | |
| /* @brief quantize_to_uint16() - to quantize a sequence of float number input to uint16, output[i] = floor(clamp(input[i] * scale + bias, 0, 65535.0)), 
 | |
|  * @param input: pointer to input float numbers
 | |
|  * @param out: pointer to output uint16 numbers
 | |
|  * @param length: the length of input number sequence, therefore, input occupies 4 * length bytes in ddr
 | |
|  * @param scale: constant
 | |
|  * @param bias: constant
 | |
|  * @return 0: success
 | |
|  * @return 1 -- input address is not a multiple of 32
 | |
|  * @return 2 -- out address is not a multiple of 32
 | |
|  * @return 3 -- length is not a multiple of 8
 | |
|  */
 | |
| uint8_t quantize_to_uint16(float *input, uint16_t *out, uint32_t length, float scale, float bias);
 | |
| 
 | |
| /* @brief dequantize_from_int8() - to dequantize a sequence of int8 numbers to float, output[i] = (input[i] + bias) * scale
 | |
|  * @param input: pointer to input numbers
 | |
|  * @param out: pointer to output numbers
 | |
|  * @param length: the length of input number sequence, therefore, output occupies 4 * length bytes in ddr
 | |
|  * @param scale: constant
 | |
|  * @param bias: constant
 | |
|  * @return 0: success
 | |
|  * @return 1 -- input address is not a multiple of 32
 | |
|  * @return 2 -- out address is not a multiple of 32
 | |
|  * @return 3 -- length is not a multiple of 8
 | |
|  */
 | |
| uint8_t dequantize_from_int8(int8_t *input, float *output, uint32_t length, float scale, float bias);
 | |
| 
 | |
| /* @brief dequantize_from_uint8() - to dequantize a sequence of uint8 numbers to float, output[i] = (input[i] + bias) * scale
 | |
|  * @param input: pointer to input numbers
 | |
|  * @param out: pointer to output numbers
 | |
|  * @param length: the length of input number sequence, therefore, output occupies 4 * length bytes in ddr
 | |
|  * @param scale: constant
 | |
|  * @param bias: constant
 | |
|  * @return 0: success
 | |
|  * @return 1 -- input address is not a multiple of 32
 | |
|  * @return 2 -- out address is not a multiple of 32
 | |
|  * @return 3 -- length is not a multiple of 8
 | |
|  */
 | |
| uint8_t dequantize_from_uint8(uint8_t *input, float *output, uint32_t length, float scale, float bias);
 | |
| 
 | |
| /* @brief dequantize_from_int16() - to dequantize a sequence of int16 numbers to float, output[i] = (input[i] + bias) * scale
 | |
|  * @param input: pointer to input numbers
 | |
|  * @param out: pointer to output numbers
 | |
|  * @param length: the length of input number sequence, therefore, output occupies 4 * length bytes in ddr
 | |
|  * @param scale: constant
 | |
|  * @param bias: constant
 | |
|  * @return 0: success
 | |
|  * @return 1 -- input address is not a multiple of 32
 | |
|  * @return 2 -- out address is not a multiple of 32
 | |
|  * @return 3 -- length is not a multiple of 8
 | |
|  */
 | |
| uint8_t dequantize_from_int16(int16_t *input, float *output, uint32_t length, float scale, float bias);
 | |
| 
 | |
| /* @brief dequantize_from_uint16() - to dequantize a sequence of uint16 numbers to float, output[i] = (input[i] + bias) * scale
 | |
|  * @param input: pointer to input numbers
 | |
|  * @param out: pointer to output numbers
 | |
|  * @param length: the length of input number sequence, therefore, output occupies 4 * length bytes in ddr
 | |
|  * @param scale: constant
 | |
|  * @param bias: constant
 | |
|  * @return 0: success
 | |
|  * @return 1 -- input address is not a multiple of 32
 | |
|  * @return 2 -- out address is not a multiple of 32
 | |
|  * @return 3 -- length is not a multiple of 8
 | |
|  */
 | |
| uint8_t dequantize_from_uint16(uint16_t *input, float *output, uint32_t length, float scale, float bias);
 | |
| /**
 | |
|   * @}
 | |
|   */
 | |
|   
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif |