MI SSL API
1. Overview¶
1.1. Algorithm Description¶
SSL (short for Sound Source Localization) is used to locate the direction of the sound.
1.2. Keyword¶
-
Direction
When the distance between the two microphones is 5cm, the following figure describes the definition of the sound direction:
1.3. Note¶
In order to facilitate debugging and confirm the effect of the algorithm, the user application needs to implement replacement algorithm parameter and grab audio data.
2. API Reference¶
2.1. API List¶
API name | Features |
---|---|
IaaSsl_GetBufferSize | Get the memory size required for Ssl algorithm running |
IaaSsl_Init | Initialize Ssl algorithm |
IaaSsl_Config | Configure Ssl algorithm |
IaaSsl_Get_Config | Get the current configuration parameter information of the Ssl algorithm |
IaaSsl_Run | Ssl algorithm processing |
IaaSsl_Get_Direction | Get the result of Ssl algorithm processing |
IaaSsl_Reset | Reinitialize Ssl algorithm |
IaaSsl_Free | Release Ssl algorithm resources |
2.2. IaaSsl_GetBufferSize¶
-
Features
Get the memory size required for Ssl algorithm running.
-
Syntax
unsigned int IaaSsl_GetBufferSize(void);
-
Return value
Return value is the memory size required for Ssl algorithm running.
-
Dependency
-
Header: AudioSslProcess.h
-
Library: libSSL_LINUX.so/ libSSL_LINUX.a
-
-
Note
The interface only returns the required memory size, and the application and release of memory need to be processed by the application.
-
Example
Please refer to IaaSsl_Run example.
2.3. IaaSsl_Init¶
-
Features
Initialize Ssl algorithm.
-
Syntax
SSL_HANDLE IaaSsl_Init(char* working_buffer, AudioSslInit* ssl_init);
-
Parameters
Parameter Name Description Input/Output working_buffer Memory address used by Ssl algorithm Input ssl_init Ssl algorithm initialization structure pointer Input -
Return value
Return value Result Not NULL Successful NULL Failed -
Dependency
-
Header: AudioSslProcess.h
-
Library: libSSL_LINUX.so/ libSSL_LINUX.a
-
-
Example
Please refer to IaaSsl_Run example.
2.4. IaaSsl_Config¶
-
Features
Configure Ssl algorithm.
-
Syntax
ALGO_SSL_RET IaaSsl_Config(SSL_HANDLE handle, AudioSslConfig* ssl_config);
-
Parameters
Parameter Name Description Input/Output handle Ssl algorithm handle Input ssl_config Ssl algorithm configuration parameter structure pointer Input -
Return value
Return value Result 0 Successful Non-zero Failed, refer to error code -
Dependency
-
Header: AudioSslProcess.h
-
Library: libSSL_LINUX.so/ libSSL_LINUX.a
-
-
Example
Please refer to IaaSsl_Run example.
2.5. IaaSsl_Get_Config¶
-
Features
Get the current configuration parameter information of the Ssl algorithm.
-
Syntax
ALGO_SSL_RET IaaSsl_Get_Config(SSL_HANDLE handle, AudioSslConfig *ssl_config);
-
Parameters
Parameter Name Description Input/Output handle Ssl algorithm handle Input ssl_config Ssl algorithm configuration parameter structure pointer Output -
Return value
Return value Result 0 Successful Non-zero Failed, refer to error code -
Dependency
-
Header: AudioSslProcess.h
-
Library: libSSL_LINUX.so/ libSSL_LINUX.a
-
-
Example
Please refer to IaaSsl_Run example.
2.6. IaaSsl_Run¶
-
Features
Ssl algorithm processing.
-
Syntax
ALGO_SSL_RET IaaSsl_Run(SSL_HANDLE handle,short* microphone_input, int *delay_sample);
-
Parameters
Parameter Name Description Input/Output handle Ssl algorithm handle Input microphone_input Data pointer for SSL Input delay_sample The number of delayed samples for microphone dual channel. It`s recommended to be used when bf_mode is enable. Output -
Return value
Return value Result 0 Successful Non-zero Failed, refer to error code -
Dependency
-
Header: AudioSslProcess.h
-
Library: libSSL_LINUX.so/ libSSL_LINUX.a
-
-
Note
The data pointed to by microphone_input should use the sampling point as the smallest unit and be placed in the format of L, R, L, R.... The length must correspond to the point_number (That is, how many sampling points do a SSL process) set in IaaSsl_Init. Assuming that the point number is set to 128, each frame needs to read 128*2 point samples, because the SSL microphone_input must be dual-channel.
-
Example
#include <stdio.h> #include <stdlib.h> #include "AudioSslProcess.h" /* 0:Fixed input file 1:User input file */ #define IN_PARAMETER 1 int main(int argc, char *argv[]) { AudioSslInit ssl_init; AudioSslConfig ssl_config; /**************User change section start**********************/ /* The user modifies as needed,for example:5, 6(Unit: cm) */ ssl_init.mic_distance = 5; /* The user modifies as needed,for example:128, ... */ ssl_init.point_number = 128; /* The user modifies as needed */ ssl_init.sample_rate = 48000; /* The user modifies as needed */ ssl_init.bf_mode = 0; /* The user modifies as needed */ ssl_config.temperature = 25; /* The user modifies as needed */ ssl_config.noise_gate_dbfs = -40; /* The user modifies as needed */ ssl_config.direction_frame_num = 100; /**************User change section end**********************/ unsigned int workingBufferSize; SSL_HANDLE handle; ALGO_SSL_RET ret = ALGO_SSL_RET_SUCCESS; int delay_sample = 0; int direction; int counter = 0; int frame_number = ssl_config.direction_frame_num; short input[1024]; char *workingBufferAddress = NULL; FILE* fpIn; //input file char src_file[128] = {0}; #if IN_PARAMETER if(argc < 2) { printf("Please enter the correct parameters!\n"); return -1; } sscanf(argv[1], "%s", src_file); #else sprintf(src_file, "%s", "./mic34_gain1_ssong_continue.wav"); #endif fpIn = fopen(src_file, "rb"); if(NULL == fpIn) { printf("fopen in_file failed !\n"); return -1; } printf("\nfopen in_file success !\n"); //(1)IaaSsl_GetBufferSize workingBufferSize = IaaSsl_GetBufferSize(); workingBufferAddress = (char *)malloc(sizeof(char) * workingBufferSize); if(NULL == workingBufferAddress) { printf("malloc SSL workingBuffer failed !\n"); return -1; } printf("malloc SSL workingBuffer success !\n"); //(2)IaaSsl_Init handle = IaaSsl_Init(workingBufferAddress, &ssl_init); if(NULL == handle) { printf("SSL:IaaSsl_Init failed !\n"); return -1; } printf("SSL:IaaSsl_Init success !\n"); //(3)IaaSsl_Config ret = IaaSsl_Config(handle, &ssl_config); if(ALGO_SSL_RET_SUCCESS != ret) { printf("SSL:IaaSsl_Config failed !, ret = %d\n", ret); return -1; } printf("SSL:IaaSsl_Config success !\n"); ret = IaaSsl_Get_Config(handle, &ssl_config); if(ALGO_SSL_RET_SUCCESS != ret) { printf("IaaSsl_Get_Config failed !, ret = %d\n", ret); } printf("IaaSsl_Get_Config succeed !\n"); printf("ssl_config.temperature = %u\n", ssl_config.temperature); printf("ssl_config.noise_gate_dbfs = %d\n", ssl_config.noise_gate_dbfs); printf("ssl_config.direction_frame_num = %d\n", ssl_config.direction_frame_num); #if 1 /*Consider whether the input file has a header*/ fread(input, sizeof(char), 44, fpIn); // Remove the 44 bytes header #endif while(1) { /*2 is the number of channels*/ ret = fread(input, sizeof(short), ssl_init.point_number * 2, fpIn); if(ret != ssl_init.point_number * 2) { printf("break:endReadSize = The remaining size = %d.\n", ret); break; } //(4)IaaSsl_Run ret = IaaSsl_Run(handle, input, &delay_sample); if(ALGO_SSL_RET_SUCCESS != ret) { printf("SSL:IaaSsl_Run failed !, ret = %d\n", ret); } counter ++; if(counter == frame_number && ssl_init.bf_mode == 0) { //(5)IaaSsl_Get_Direction ret = IaaSsl_Get_Direction(handle, &direction); if(ALGO_SSL_RET_SUCCESS != ret) { printf("SSL:IaaSsl_Get_Direction failed !, ret = %d\n", ret); } printf("The current direction:%d \n", direction); handle = IaaSsl_Reset(handle, &ssl_init); if(NULL == handle) { printf("SSL:IaaSsl_Reset failed !\n"); return -1; } ret = IaaSsl_Config(handle, &ssl_config); if(ALGO_SSL_RET_SUCCESS != ret) { printf("SSL:IaaSsl_Config failed !, ret = %d\n", ret); return -1; } counter = 0; } } printf("Explain:If the current direction is not \ in the -90~90 range, consult the API documentation.\n"); //(6)IaaSsl_Free ret = IaaSsl_Free(handle); if(ALGO_SSL_RET_SUCCESS != ret) { printf("IaaSsl_Free failed !, ret = %d\n", ret); } free(workingBufferAddress); fclose(fpIn); printf("SSL end !\n"); return 0; }
2.7. IaaSsl_Get_Direction¶
-
Features
Get the result of Ssl algorithm processing.
-
Syntax
ALGO_SSL_RET IaaSsl_Get_Direction(SSL_HANDLE handle, int* direction);
-
Parameters
Parameter Name Description Input/Output handle Ssl algorithm handle Input direction The value is between -90~90. When the value is -112, if the return value is success, there are two possibilities, one is that the volume is lower than noise_gate_dbfs, and the other is that the amount of data is not enough to calculate a credible direction. If the return value is not 0, correct it according to the error code. Output -
Return value
Return value Result 0 Successful Non-zero Failed, refer to error code -
Dependency
-
Header: AudioSslProcess.h
-
Library: libSSL_LINUX.so/ libSSL_LINUX.a
-
-
Example
Please refer to IaaSsl_Run example.
2.8. IaaSsl_Reset¶
-
Features
Reinitialize Ssl algorithm.
-
Syntax
SSL_HANDLE IaaSsl_Reset(SSL_HANDLE working_buffer,AudioSslInit* ssl_init);
-
Parameters
Parameter Name Description Input/Output working_buffer Memory address for Ssl algorithm running Input ssl_init Ssl algorithm initialization structure pointer Input -
Return value
Return value Result 0 Successful Non-zero Failed, refer to error code -
Dependency
-
Header: AudioSslProcess.h
-
Library: libSSL_LINUX.so/ libSSL_LINUX.a
-
-
Example
Please refer to IaaSsl_Run example.
2.9. IaaSsl_Free¶
-
Features
Release Ssl algorithm resources.
-
Syntax
ALGO_SSL_RET IaaSsl_Free(SSL_HANDLE handle);
-
Parameters
Parameter Name Description Input/Output handle Src algorithm handle Input -
Return value
Return value Result 0 Successful Non-zero Failed, refer to error code -
Dependency
-
Header: AudioSslProcess.h
-
Library: libSSL_LINUX.so/ libSSL_LINUX.a
-
-
Example
Please refer to IaaSsl_Run example.
3. SSL Data Type¶
3.1. SSL data type list¶
Data type | Definition |
---|---|
AudioSslInit | Ssl algorithm initialization parameter structure type |
AudioSslConfig | Ssl algorithm configuration parameter structure type |
SSL_HANDLE | Ssl algorithm handle type |
3.2. AudioSslInit¶
-
Description
Define Ssl algorithm initialization parameter structure type.
-
Definition
typedef struct { unsigned int point_number; unsigned int sample_rate; unsigned int mic_distance; unsigned int bf_mode; }AudioSslInit;
-
Member
Member name Description point_number The sampling points that Ssl algorithm processed once sample_rate Sampling rate, currently supports 8k/16k/32k/48k mic_distance The distance between two mics, unit: cm bf_mode Whether it is beamforming mode -
Note
If delay_sample is required, it is recommended to enable bf_mode.
-
Related data types and interfaces
3.3. AudioSslConfig¶
-
Description
Define Ssl algorithm configuration parameter structure type.
-
Definition
typedef struct { unsigned int temperature; int noise_gate_dbfs; int direction_frame_num; }AudioSslConfig;
-
Member
Member name Description temperature Ambient temperature (Celsius) Celsius = (5/9) * (Fahrenheit-32) Step size is 1 noise_gate_dbfs Noise gain threshold (dBfs) Note: Below this value, the frame will be treated as noise and will not enter the calculation of the direction. Step size is 1 direction_frame_num The number of frames detected by the SSL function. Step size is 50. Note: The number of frames for SSL detection must be a multiple of 50. One frame of data processed by SSL is 128 sampling points. Time of detection once = s32DirectionFrameNum * 128 / sampling rate. For example: :The current sampling rate is 48K, setting s32DirectionFrameNum to 300, detection time =300 * 128 / 48000 = 0.8(s) -
Related data types and interfaces
3.4. SSL_HANDLE¶
-
Description
Define Ssl algorithm handle type.
-
Definition
typedef void* SSL_HANDLE;
-
Related data types and interfaces
4. Error Code¶
SSL API error codes are shown as follow:
Error code | Definition | Description |
---|---|---|
0x00000000 | ALGO_ SSL _RET_SUCCESS | SSL runs successfully |
0x10000101 | ALGO_ SSL _RET_INIT_ERROR | SSL initialization error |
0x10000102 | ALGO_ SSL _RET_INVALID_CONFIG | SSL Config is invalid |
0x10000103 | ALGO_ SSL _RET_INVALID_HANDLE | SSL Handle is invalid |
0x10000104 | ALGO_ SSL _RET_INVALID_SAMPLERATE | SSL sample rate is invalid |
0x10000105 | ALGO_ SSL _RET_INVALID_POINTNUMBER | SSL sampling point is invalid |
0x10000106 | ALGO_SSL_RET_INVALID_BFMODE | bf_mode setting of SSL init is invalid |
0x10000107 | ALGO_SSL_RET_DELAY_SAMPLE_TOO_LARGE | The delayed sample is too large, please check the set distance and sampling rate |
0x10000108 | ALGO_ SSL _RET_INVALID_CALLING | SSL API call sequence error |
0x10000109 | ALGO_ SSL _RET_API_CONFLICT | Other APIs are running |