SGS BF 算法使用参考¶
REVISION HISTORY¶
| Revision No. | Description |
Date |
|---|---|---|
| 1.0 | 09/12/2020 | |
| 1.1 | 10/15/2020 | |
| 1.2 | 08/03/2021 | |
| 1.3 | 12/05/2022 | |
| 1.4 | 04/10/2023 | |
| 1.5 | 10/27/2023 | |
| 1.6 | 04/22/2024 | |
| 1.7 | 10/30/2024 | |
| 1.8 | 04/19/2025 | |
| 1.81 | 05/01/2025 | |
| 1.82 | 07/16/2025 | |
| 1.83 | 11/25/2025 |
1. 概述¶
1.1. 算法说明¶
Bf(beamforming)波束形成是一种用于传感器数组传输或接收的定向信号处理技术,透过空间滤波搭配传感器数组实现特定角度的信号强化,并压抑其他方向之讯号。波束形成可用于发射端和接收端实现空间选择性。
关键词说明
-
噪音阀值与语音活性检测模式
-
Bf 的滤波器仅有在当帧输入被判断为噪音时,才会进行滤波器的更新。若被判断为语音,则持续使用过去之滤波器进行滤波。目前提供两种判断噪音的方式。请参考 AudioBfConfig.
-
noise_gate_dbfs: 噪音阀值(dBFS)。当输入音量小于此噪音阀值时会被判断为噪音。此参数必须考虑实际麦克风所录制的音量大小。范围为 [-80,0],建议值为-20,步长为1。
-
vad_eanble: 语音活性检测模式。使用VAD的方式判断当前输入是噪音还是语音。范围为 [0,1],建议值为0,步长为1。 vad_enable=0 时, 使用噪音阀值做判断。 vad_enable=1 时,使用语音活性检测做判断。
-
-
对角负载
为了提升Bf 滤波器的强健性,使用对角负载(Diagonal loading)可以保证反矩阵必定存在,进而达成正则化。若设置太高,空间滤波表现会变差,若设置太低,容易造成语音失真,范围 [1,100],建议值为10,步长为1。 请参考 AudioBfConfig。
-
数组形状及坐标系定义
Bf 算法库目前支持一维或是二维数组,请参考3.数组系统及坐标系。
注意
Bf 目前有2或4麦克风数组算法库。使用者需要确认是否正确地使用对应的Bf算法库。如果需要不同麦克风数量的Bf算法库,请向算法同仁提出需求。为方便调试和确认算法效果,需要用户自行实现替换算法参数和抓取音频处理结果的逻辑。此模块搭配音频处理链APC(Audio Process Chain)会有最佳的信号加强、压制干扰的效果。
1.2. 基本结构¶
Bf需要输入及输出 Buffer以及想强化的声音方向来进行处理。当Bf算法配置好内存,并根据数组形状完成参数初始化与设定后,输入讯号会根据强化方向进行处理后,将结果输出到输出 Buffer上。注意Bf 算法为多声道输入单声道输出系统,输入 Buffer 与输出 Buffer 长度并不同。

1.3. 功能介绍¶
保留强化方向的声音,并抑制来自其他方向的声音,提升讯号干扰比。

1.4. 应用场景¶
Bf常用于会议系统、楼宇对讲、安防监控与消费电子产品等场景,在不同环境下强化使用者方向的声音并滤除旁边的声音外,搭配APC可以提供噪声低、音质好、音量稳定的舒适音频体验。
1.5. 芯片差异说明¶
在不同系列芯片,目前Bf算法效果上没有差异。
1.6. 实例介绍¶
使用Bf API获取Bf算法运行需要的内存大小、初始化Bf算法handle、配置参数至Bf算法handle、运行Bf算法与释放Bf算法资源。

-
双声道或多声道输入程序范例
-
范例一:两颗麦克风数组(麦克风输入为双声道音频)
#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <sys/time.h> #include <sys/ioctl.h> #include <stdlib.h> #include "AudioBfProcess.h" #define USE_MALLOC (1) typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned long uint32; float AVERAGE_RUN(int a) { static unsigned int num = 0; static float avg = 0; if(num == 0) avg = 0; num++; avg = avg + ((float)a - avg) / ((float)num); return avg; } unsigned int _OsCounterGetMs(void) { struct timeval t1; gettimeofday(&t1,NULL); unsigned int T = ( (1000000 * t1.tv_sec)+ t1.tv_usec ) / 1000; return T; } int main(int argc, char *argv[]) { short input[256]; short output[128]; char infileName[512]; char outfileName[512]; FILE * fin, * fout; ALGO_BF_RET ret; int shape = 0; float direction = 0.0; int delay_sample = 0; float avg = 0; int counter = 0; unsigned int T0,T1; AudioBfInit bf_init; AudioBfConfig bf_config; BF_HANDLE handle; bf_init.mic_distance = 8.0; bf_init.point_number = 128; bf_init.sample_rate = 16000; bf_init.channel = 2; bf_config.noise_gate_dbfs = -20; bf_config.temperature = 20; bf_config.noise_estimation = 0; bf_config.output_gain = 0.7; bf_config.vad_enable = 0; bf_config.diagonal_loading = 10; #if USE_MALLOC char *WorkingBuffer2; WorkingBuffer2 = (char*)malloc(IaaBf_GetBufferSize()); #endif handle = IaaBf_Init((char*)WorkingBuffer2, &bf_init); if (handle==NULL) { printf("BF init error\r\n"); return -1; } else { printf("BF init succeed\r\n"); } ret = IaaBf_SetConfig(handle,&bf_config); if (ret) { printf("Error occured in Config\n"); return -1; } ret = IaaBf_SetShape(handle,shape); if (ret) { printf("Error occured in Array shape\n"); return -1; } sprintf(infileName,"%s","./../sample/data/Chn-14.wav"); sprintf(outfileName,"%s","./BFOut.pcm"); fin = fopen(infileName, "rb"); if(!fin) { printf("the input file could not be open\n"); return -1; } fout = fopen(outfileName, "wb"); if(!fout) { printf("the output file could not be open\n"); return -1; } fread(input, sizeof(char), 44, fin); // read header 44 bytes fwrite(input, sizeof(char),44, fout); // write 44 bytes output // int delay_sample = 0; while(fread(input, sizeof(short), bf_init.point_number*bf_init.channel, fin)) { counter++; T0 = (long)_OsCounterGetMs(); ret = IaaBf_Run(handle,input,output,&direction); T1 = (long)_OsCounterGetMs(); avg += (T1 - T0); if(ret) { printf("Error occured in Run\n"); return -1; } fwrite(output, sizeof(short), bf_init.point_number, fout); } avg /= counter; printf("AVG is %.2f ms\n",avg); IaaBf_Free(handle); fclose(fin); fclose(fout); free(WorkingBuffer2); printf("Done\n"); return 0; } -
范例二:多颗麦克风数组(麦克风输入为4个单声道音讯)
#include <stdio.h> #include <unistd.h> #include <fcntl.h> #include <string.h> #include <sys/time.h> #include <sys/ioctl.h> #include <stdlib.h> #include "AudioBfProcess.h" #define MIC_NUM (4) #define USE_MALLOC (1) typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned long uint32; float AVERAGE_RUN(int a) { static unsigned int num = 0; static float avg = 0; if(num == 0) avg = 0; num++; avg = avg + ((float)a - avg) / ((float)num); return avg; } unsigned int _OsCounterGetMs(void) { struct timeval t1; gettimeofday(&t1,NULL); unsigned int T = ( (1000000 * t1.tv_sec)+ t1.tv_usec ) / 1000; return T; } int main(int argc, char *argv[]) { /*********Input file init*******/ short input[512]; short output[128]; short input_tmp1[128],input_tmp2[128],input_tmp3[128],input_tmp4[128]; FILE * fin0, * fin1, * fin2, * fin3, * fout; char infileName[MIC_NUM][512]; char outfileName[512]; ALGO_BF_RET ret; int k; float avg = 0; int counter = 0; unsigned int T0, T1; /********common setting between SSL and BF********/ int point_number = 128; float microphone_distance = 4.0; int temperature = 20; int sample_rate = 16000; int shape = 0; // int delay_sample[MIC_NUM-1] = {0,0,0}; //channel-1 float direction = 0.0; /*******BF data init*********/ #if USE_MALLOC char *WorkingBuffer_BF; WorkingBuffer_BF = (char*)malloc(IaaBf_GetBufferSize()); #endif AudioBfInit bf_init; AudioBfConfig bf_config; BF_HANDLE bf_handle; bf_init.mic_distance = microphone_distance; bf_init.point_number = point_number; bf_init.sample_rate = sample_rate; bf_init.channel = MIC_NUM; bf_config.noise_gate_dbfs = -20; bf_config.temperature = temperature; bf_config.noise_estimation = 0; bf_config.output_gain = 0.7; bf_config.vad_enable = 0; bf_config.diagonal_loading = 10; bf_handle = IaaBf_Init((char*)WorkingBuffer_BF, &bf_init); if (bf_handle==NULL) { printf("BF init error\r\n"); return -1; } else { printf("BF init succeed\r\n"); } ret = IaaBf_SetConfig(bf_handle,&bf_config); if (ret) { printf("Error occured in Config\n"); return -1; } ret = IaaBf_SetShape(bf_handle,shape); if (ret) { printf("Error occured in Array shape\n"); return -1; } /********open input file and output file*****/ sprintf(infileName[0],"%s","./../sample/data/Chn-01.wav"); sprintf(infileName[1],"%s","./../sample/data/Chn-02.wav"); sprintf(infileName[2],"%s","./../sample/data/Chn-03.wav"); sprintf(infileName[3],"%s","./../sample/data/Chn-04.wav"); sprintf(outfileName,"%s","./BFOut.pcm"); fin0 = fopen(infileName[0], "rb"); if(!fin0) { printf("the input file 0 could not be open\n"); return -1; } fin1 = fopen(infileName[1], "rb"); if(!fin1) { printf("the input file 1 could not be open\n"); return -1; } fin2 = fopen(infileName[2], "rb"); if(!fin2) { printf("the input file 2 could not be open\n"); return -1; } fin3 = fopen(infileName[3], "rb"); if(!fin3) { printf("the input file 3 could not be open\n"); return -1; } fout = fopen(outfileName, "wb"); if(!fout) { printf("the output file could not be open\n"); return -1; } fread(input, sizeof(char), 44, fin0); fread(input, sizeof(char), 44, fin1); fread(input, sizeof(char), 44, fin2); fread(input, sizeof(char), 44, fin3); fwrite(input, sizeof(char),44, fout); short * input_ptr; while(fread(input_tmp1, sizeof(short), bf_init.point_number, fin0)) { fread(input_tmp2, sizeof(short), bf_init.point_number, fin1); fread(input_tmp3, sizeof(short), bf_init.point_number, fin2); fread(input_tmp4, sizeof(short), bf_init.point_number, fin3); input_ptr = input; for(k=0;k<point_number;k++) { *input_ptr = input_tmp1[k]; input_ptr++; *input_ptr = input_tmp2[k]; input_ptr++; *input_ptr = input_tmp3[k]; input_ptr++; *input_ptr = input_tmp4[k]; input_ptr++; } counter++; T0 = (long)_OsCounterGetMs(); ret = IaaBf_Run(bf_handle,input,output,&direction); T1 = (long)_OsCounterGetMs(); avg += (T1 - T0); if(ret) { printf("Error occured in Run\n"); return -1; } fwrite(output, sizeof(short),point_number, fout); } avg /= counter; printf("AVG is %.2f ms\n",avg); IaaBf_Free(bf_handle); fclose(fin0); fclose(fin1); fclose(fin2); fclose(fin3); fclose(fout); free(WorkingBuffer_BF); printf("Done\n"); return 0; }
-
2. 规格¶
-
麦克风个数必须至少两颗或以上。
-
必须使用同规格的麦克风。
-
麦克风增益必须相同。
-
在安静的背景环境,可以达到最好的效果。
-
必须确保音文件中没有发生信号剪裁,如下所示:

3. 数组系统及坐标系¶
3.1. 多麦克风数组¶
相较于双麦克风数组,多信道数组具有更好的带宽分辨率和更多可控制的麦克风滤波器,能够在增强方向上实现更好的空间选择性。常见的多麦克风数组主要有两类,分别是均匀线性数组以及均匀圆形数组。以下皆为二维示意图(无高度差的影响)。
3.1.1. 均匀线性数组及坐标系¶
均匀线性数组为相邻麦克风之间距皆相同的直线数组,由于其对称性,加强方向仅考虑上半平面(-90度至90度)。下图为均匀线性数组于空间坐标系的示意图。强化方向定义为与数组中心及x轴的夹角。逆时钟方向为正。建议相邻麦克风之间距至少大于 5cm 或 6cm。

3.1.2. 均匀圆形数组及坐标系¶
均匀圆形数组为相邻麦克风与数组中心之夹角皆相同的圆形数组,由于不具对称性,加强角度可以为整个平面,下图为均匀圆形数组于空间坐标系的示意图。强化方向定义为与数组中心及x轴的夹角。逆时钟方向为正。麦克风间距为圆形的直径。建议至少大于6cm。

4. API 参考¶
4.1. 功能模块API¶
| API名 | 功能 |
|---|---|
| IaaBf_GetBufferSize | 获取Bf算法运行需要的内存大小 |
| IaaBf_Init | 初始化Bf算法 |
| IaaBf_SetConfig | 配置Bf算法 |
| IaaBf_GetConfig | 获取Bf算法当前的配置参数信息 |
| IaaBf_SetShape | Bf指派麦克风数组形状 |
| IaaBf_Run | Bf算法处理 |
| IaaBf_Reset | 重新初始化Bf算法 |
| IaaBf_Free | 释放Bf算法资源 |
| IaaBf_SetArbitraryShape | Bf指派任意麦克风数组形状 |
| IaaBf_GetArrayPosition | Bf获取设定的麦克风数组位置 |
| IaaBf_DynamicLoading | Bf指定对角负载使用之带宽及对应强度 |
| IaaBf_SetMode | Bf指定使用模式 |
| IaaBf_SetAdaptiveIntensity | Bf指定模式0、模式3或模式4迭代的强度 |
| IaaBf_SetCallbackFunction | Bf算法对Ikayaki芯片的授权管控(弃用,不再限制) |
| IaaBf_GetAPIVersion | 返回当前Bf算法版号 |
| IaaBf_SetPfFlow | Bf指定后滤波器应用位置 |
| IaaBf_SetCalibration | Bf校正麦克风间音量差异 |
| IaaBf_GetJsonFileSize | Bf获取解析Json文件内容所需要的内存大小 |
| IaaBf_InitReadFromJson | 配置Json参数到Bf算法的初始化结构体指针 |
| IaaBf_ConfigReadFromJson | 配置Json参数到Bf算法的配置结构体指针 |
| IaaBf_OptionReadFromJson | 配置Json参数到Bf算法的其他选项结构体指针 |
| IaaBf_ReadJson | 读取Json其他选项参数并额外使用这些参数呼叫Bf常用API |
| IaaBf_SetHandleId | 配置Bf算法id |
4.2. IaaBf_GetBufferSize¶
-
功能
获取Bf算法运行所需要的内存大小。
-
语法
unsigned int IaaBf_GetBufferSize(void); -
返回值
返回值为Bf算法运行所需要的内存大小
-
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
注意
该接口仅返回需要的内存大小,申请和释放内存的动作需应用来处理。
-
举例
请参考IaaBf_Run举例部分。
4.3. IaaBf_Init¶
-
功能
初始化Bf算法。
-
语法
BF_HANDLE IaaBf_Init(char* working_buffer,AudioBfInit* bf_init); -
形参
参数名称 描述 输入/输出 working_buffer Bf算法所使用的内存地址 输入 bf_init Bf算法的初始化结构体指针 输入 -
返回值
返回值 结果 非NULL 成功 NULL 失败 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
举例
请参考IaaBf_Run举例部分。
-
注意
-
神经网络模型(AI) 在CPU 版本仅支持 LINUX 静态库。
-
神经网络模型(AI) 在IPU 版本支持 LINUX 静态/动态库。
-
4.4. IaaBf_SetConfig¶
-
功能
配置Bf算法。
-
语法
ALGO_BF_RET IaaBf_SetConfig(BF_HANDLE handle,AudioBfConfig* bf_config); -
形参
参数名称 描述 输入/输出 handle Bf算法handle 输入 bf_config Bf算法的配置结构体指针 输入 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
举例
请参考IaaBf_Run举例部分。
4.5. IaaBf_GetConfig¶
-
功能
获取Bf算法当前的配置参数。
-
语法
ALGO_BF_RET IaaBf_GetConfig(BF_HANDLE handle,AudioBfConfig* bf_config); -
形参
参数名称 描述 输入/输出 handle Bf算法handle 输入 bf_config Bf算法的配置结构体指针 输出 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
举例
请参考IaaBf_Run举例部分。
4.6. IaaBf_SetShape¶
-
功能
Bf指派麦克风数组形状。
-
语法
ALGO_BF_RET IaaBf_Setshape(BF_HANDLE handle,int shape); -
形参
参数名称 描述 输入/输出 handle Bf算法handle 输入 shape 指派数组形状。0:均匀线性数组,1:均匀圆形数组 输入 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
注意
-
仅提供均匀线性数组及均匀圆型数组,请参考3.数组系统及坐标系,客户有特殊数组需求,可使用IaaBf_SetArbitraryShape。
-
双麦克风数组必定为线性数组。
-
数组位置设定会强烈影响波束形成效果,因此设定的数组位置必须与真实数组位置相同。
-
-
举例
请参考IaaBf_Run举例部分。
4.7. IaaBf_Run¶
-
功能
BF算法处理。
-
语法
ALGO_BF_RET IaaBf_Run(BF_HANDLE handle, short* microphone_input, short* microphone_output,float* microphone_doa); -
形参
参数名称 描述 输入/输出 handle Bf算法handle 输入 microphone_input 待进行声源定位的数据指针 输入 microphone_output 经过算法后的数据输出指针 输出 microphone_doa Beamforming强化的方向。此参数可由用户设定,也可由SSL计算定位结果得出。
范围:[-90,270]。 请参考3.数组系统及坐标系输入 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
注意
-
对于两颗麦克风数组(双声道音频可以负荷),microphone_input指向的数据应以采样点为最小单位,按照左->右->左->右的格式摆放,数据长度必须和 IaaBf_Init中设定的point_number(即多少个采样点进行一次beamforming处理)相对应。请参考范例一。
-
对于多颗麦克风数组(麦克风数多于两颗,双声道音频无法负荷)的情况,各个麦克风音频为单声道,microphone_input指向的数据仍应已采样点为最小单位,并按照麦克风于数组的相对位置,由左至右的格式摆放,数据长度必须和IaaBf_Init中设定的point_number(即多少个采样点进行一次beamforming处理)相对应。请参考范例二。
-
以四颗线性麦克风数组为例,microphone_input的排序方式为 [左一→左二→右二→右一]。
-
microphone_output数据长度必定和IaaBf_Init中设定的Point_number相同。 以四麦克风数组为例,若Point_number为128点,则四颗数组的microphone_input长度为128x4=512点,输出microphone_output为128点。
-
-
举例
请参考1.6. 实例介绍
4.8. IaaBf_Reset¶
-
功能
重新初始化Bf算法。
-
语法
BF_HANDLE IaaBf_Reset(BF_HANDLE working_buffer,AudioBfInit* bf_init); -
形参
参数名称 描述 输入/输出 working_buffer Bf算法运行的内存地址 输入 bf_init Bf算法的初始化参数结构体指针 输入 -
返回值
返回值 结果 非NULL 成功 NULL 失败 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
4.9. IaaBf_Free¶
-
功能
释放Bf算法资源。
-
语法
ALGO_BF_RET IaaBf_Free(BF_HANDLE handle); -
形参
参数名称 描述 输入/输出 handle Bf算法handle 输入 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
举例
请参考IaaBf_Run举例部分。
4.10. IaaBf_SetArbitraryShape¶
-
功能
Bf指派任意麦克风数组形状。
-
语法
ALGO_BF_RET IaaBf_SetArbitraryShape(BF_HANDLE handle, float* array_pos); -
形参
参数名称 描述 输入/输出 handle Bf算法handle 输入 array_pos 输入的数组位置指针,单位:公分 输入 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
注意
-
此功能帮助用户设定任意的数组形状。如果此功能于IaaBf_SetShape后呼叫,则会覆写原本IaaBf_SetShape定义的矩阵形状,反之亦然。
-
输入数组为卡式坐标系下的[X,Y]坐标,因此必须包含(麦克风个数*2) 个元素,数组中心定义为输入的麦克风数组分别沿着X及Y轴的平均值。
-
各麦克风位置定义为数组中心指向各麦克风位置的向量,microphone_doa(强化方向之角度)仍定义为其与数组中心及x轴的夹角。逆时钟方向为正。
-
以四颗麦克风为例,如果给定 array_pos:{-4,-2,-1,-3,2,3,4,2},数组中心[X=0.25,Y=0], Mic1[X=-4.25,Y=-2],Mic2 [X=-1.25,Y=-3], Mic3 [X=1.75,Y=3], Mic4 [X=3.75,Y=2]。
-
4.11. IaaBf_GetArrayPosition¶
-
功能
Bf获取设定的麦克风数组位置。
-
语法
ALGO_BF_RET IaaBf_GetArrayPosition(BF_HANDLE handle,float* array_pos); -
形参
参数名称 描述 输入/输出 handle Bf算法handle 输入 array_pos 输入的数组位置指针,单位:公分 输入/输出 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
注意
-
输出为代表卡式坐标系的三维坐标,依序为X,Y,Z 坐标,其Z坐标皆为0,因此数组必须要含有(麦克风个数 * 3)个元素。
-
如果此功能在IaaBf_SetShape后呼叫,输出的麦克风顺序如章节3.1(由左至右)。
-
如果此功能在IaaBf_SetArbitraryShape后呼叫,输出的麦克风顺序如同IaaBf_SetArbitraryShape的输入顺序。
-
此功能仅作为辅助功能回传麦克风数组位置,并不影响算法本身。
-
4.12. IaaBf_DynamicLoading¶
-
功能
Bf指定对角负载使用之带宽及对应强度。
-
语法
ALGO_BF_RET IaaBf_DynamicLoading(BF_HANDLE handle,int* band, int* dl_intensity, int* is_dynamic); -
形参
参数名称 描述 输入/输出 handle Bf算法handle 输入 band 频率范围指针,范围:[0,128],步长:1 输入 dl_intensity 对角负载强度指针,
范围:[1,1000],步长:1输入 is_dynamic 是否使用,范围:[0,1],0:关闭 1:启用 输入 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
注意
-
使用此功能前必须先执行IaaBf_SetConfig才能使用,并且只有在is_dynamic为1时才会应用至算法中。
-
使用band 的前六个元素可设定不同的频率子带,因此会产生七个子频带。元素间必须依升序排列。
-
使用dl_intensity 的前七个元素设定各个子频带之对角负载强度,针对不同频带放大AudioBfConfig的对角线负载。
-
当前取样率对应的最高频率平均分成128份,如:当前取样率为16K,对应的最大频率为8K,每一份为8000 / 128 ≈ 62.5Hz。
-
设定band={4,6,36,49,50,51},其对应子频带的频率范围为{0~4 * 62.5Hz, 4~6 * 62.5Hz, 6~36 * 62.5Hz, 36~49 * 62.5Hz, 49~50 * 62.5Hz, 50~51 * 62.5Hz, 51-127 * 62.5Hz} = {0~250Hz, 250~375Hz, 375~2250Hz, 2250~3062.5Hz, 3062.5~3125Hz, 3125~3187.5Hz, 3187.5Hz~8000Hz}。
-
此API预设为关闭。算法会预设使用AudioBfConfig设定之diagonal_loading。
-
4.13. IaaBf_SetMode¶
-
功能
Bf指定使用模式。
-
语法
ALGO_BF_RET IaaBf_SetMode(BF_HANDLE handle,float choose_doa, int mode); -
形参
参数名称 描述 输入/输出 handle Bf算法handle 输入 choose_doa Beamforming强化的方向。此参数可由用户设定,也可由SSL计算定位结果得出。
范围:[-90,270]。 请参考3.数组系统及坐标系mode 使用的BF模式,范围:[0,4],步长:1 输入 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
注意
-
目前算法库支持模式 0~4。 0: 迭代式波束形成,1: 固定式波束形成, 2: 广义旁瓣相消式波束形成, 3: 强化型迭代波束形成 4: AI强化型波束形成。若无呼叫此功能,BF默认使用 0: 迭代式波束形成。
-
算法速度: Mode 1 > Mode 2 > Mode 0 > Mode 3 > Mode 4,降噪及空间滤波效果: Mode 4 > Mode 3 > Mode 0 > Mode 2 > Mode 1。
-
Mode 3 与 Mode 4 同为 Mode 0之后滤波器,可设定不同的欲加强方向以进一步提升空间滤波之效果但会有些微失真,不同加强方向之间不具有可旋转之关系,此与数组之物理特性有关。 可使用 IaaBf_SetAdaptiveIntensity调整此后滤波器之强度。
-
当Mode 3 或 Mode 4 与APC一起使用时,必须在APC使用以下的特定API: IaaApc_EnhanceNNBFMode,并可透过 IaaBf_SetPfFlow 设定此后滤波器于算法流程下之位置。目前可设定在音频流程图中的四个位置 (1):直接作用于BF输出 (2):BF->APC,作用于APC之输出 (3):BF->AEC->APC 作用于APC之输出 (4): BF->AEC->AIWNR->APC 作用于APC之输出。
-
当使用Mode 4 时,仅支持16KHz的取样率,最好使用间距4公分或5公分之线性数组(不保证其他间距效果)。并且Mode 4仅提供LINUX库(CPU提供静态库,IPU提供静态及动态库)。
-
4.14. IaaBf_SetAdaptiveIntensity¶
-
功能
Bf指派模式0、模式3或模式4迭代的强度。
-
语法
ALGO_BF_RET IaaBf_SetAdaptiveIntensity(BF_HANDLE handle,int intensity); -
形参
参数名称 描述 输入/输出 handle Bf算法handle 输入 intensity 范围:[0,4],步长:1。
0: 低强度; 1,2: 一般强度; 3,4: 高强度输入 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
注意
-
此功能会指定迭代式波束形成(如:模式0、模式3、模式4) 的强度。设定的强度越强,空间滤波之效果越好但可能伴随较多失真,尤其是强化型迭代波束形成以及AI强化型波束形成。
-
默认为使用一般强度 intensity=1。
-
4.15. IaaBf_SetCallbackFunction¶
-
功能
BF算法对Ikayaki芯片的授权管控 (弃用,不再限制)。
-
语法
ALGO_BF_RET IaaBf_SetCallbackFunction(int(*log)(const char *szFmt, ...),int(*envSet)(char *key, char *par),int(*envGetString)(char *var, char *buf, unsigned int size),int(*envSave)(void),int(*readUuid)(unsigned long long *u64Uuid)); -
形参
参数名称 描述 输入/输出 log 打印debug 讯息的函式指针 输入 envSet 设置环境变量的函式指针(目前还没有实际作用) 输入 envGetString 获取环境变量中的授权信息的函式指针 输入 envsave 保存计算出来的授权码讯息至环境变量的函式指针(目前没有实际作用) 输入 readUuid 读取等待授权板子的Uuid 的函式指针 输入 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
注意
-
此为Bf对Ikayaki芯片的授权管控,其余芯片不受影响。
-
若使用Ikayaki芯片,根据授权成功与否会有其对应的使用时间。
-
4.16. IaaBf_GetAPIVersion¶
-
功能
返回当前Bf算法版号。
-
语法
ALGO_BF_RET IaaBf_GetAPIVersion(unsigned short* major, unsigned short* minor); -
形参
参数名称 描述 输入/输出 major 主版号 输入/输出 minor 副版号 输入/输出 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
4.17. IaaBf_SetPfFlow¶
-
功能
Bf指定后滤波器应用位置。
-
语法
ALGO_BF_RET IaaBf_SetPfFlow(BF_HANDLE handle, BF_WORKFLOW bf_workflow); -
形参
参数名称 描述 输入/输出 handle Bf算法handle 输入 bf_workflow 后滤波器之使用位置 输入 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
注意
-
目前算法库支持后滤波器位置为 0~3。 0(BF->APC): 应用在APC输出, 1(BF): 应用在BF输出,2(BF->AEC->APC): 应用在APC输出,3(BF->AEC->AIWNR->APC): 应用在APC输出,若无呼叫此功能,默认使用 1。
-
当 bf_workflow 设置为0,后滤波器会应用在APC 输出,此时BF内建之传统降噪会关闭由APC进行代替,可在APC端进行调整降噪之方法或强度。
-
当 bf_workflow 设置为1,后滤波器会应用在BF 输出, 此时BF内建之传统降噪会开启,后端之APC之降噪部分建议关闭避免过度压抑噪音导致失真。
-
当 bf_workflow 设置为2,代表有AEC应用在BF 与APC 之间,后滤波器会应用在APC 输出, 此时BF内建之传统降噪也会关闭由APC进行代替,可在APC端进行调整降噪之方法或强度。
-
当 bf_workflow 设置为3,代表有AEC及AI模式之WNR应用在BF 与APC 之间,后滤波器会应用在APC 输出, 此时BF内建之传统降噪也会关闭由APC进行代替,可在APC端进行调整降噪之方法或强度。
-
4.18. IaaBf_SetCalibration¶
-
功能
Bf校正麦克风间音量差异。
-
语法
ALGO_BF_RET IaaBf_SetCalibration(BF_HANDLE handle, BF_CALIBRATION calibration_flag); -
形参
参数名称 描述 输入/输出 handle Bf算法handle 输入 calibration_flag 是否需要校正,请参考 BF_CALIBRATION 输入 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
注意
- 此算法为人工校正麦克风间的音量差异。 0: 无校正音量, 1: 校正麦克风间音量差异,若无呼叫此功能,默认使用 0。
4.19. IaaBf_GetJsonFileSize¶
-
功能
Bf获取解析Json文件内容所需要的内存大小。
-
语法
unsigned int IaaBf_GetJsonFileSize(char* jsonfile); -
形参
参数名称 描述 输入/输出 jsonfile Json檔名 输入 -
返回值
返回值为解析Json文件内容所需要的内存大小。
-
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
4.20. IaaBf_InitReadFromJson¶
-
功能
配置Json参数到Bf算法的初始化结构体指针。
-
语法
ALGO_BF_RET IaaBf_InitReadFromJson(AudioBfInit* bf_init, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 bf_init Bf算法的初始化结构体指针 输入/输出 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
注意
此API读取jsonfile内初始化设定至AudioBfInit结构体,提供给IaaBf_Init使用。
4.21. IaaBf_ConfigReadFromJson¶
-
功能
配置Json参数到Bf算法的配置结构体指针
-
语法
ALGO_BF_RET IaaBf_ConfigReadFromJson(AudioBfConfig* bf_config, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 bf_config Bf算法的配置结构体指针 输入/输出 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
注意
此API读取jsonfile内初始化设定至AudioBfConfig结构体,提供给IaaBf_SetConfig使用
4.22. IaaBf_OptionReadFromJson¶
-
功能
配置Json参数到Bf算法的其他选项结构体指针。
-
语法
ALGO_BF_RET IaaBf_OptionReadFromJson(AudioBfOption* bf_option, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 bf_option Bf算法的其他选项结构体指针 输入/输出 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
注意
此算法读取jsonfile内其他选项设定参数至AudioBfOption结构体,提供给IaaBf_SetShape,IaaBf_Run,IaaBf_SetArbitraryShape,IaaBf_DynamicLoading,IaaBf_SetMode,IaaBf_SetAdaptiveIntensity](#414-iaabf_setadaptiveintensity),IaaBf_SetPfFlow,IaaBf_SetCalibration,IaaBf_ReadJson 等API函式使用。
4.23. IaaBf_ReadJson¶
-
功能
读取Json其他选项参数并额外使用这些参数呼叫Bf常用API。
-
语法
ALGO_BF_RET IaaBf_ReadJson(BF_HANDLE handle,AudioBfOption* bf_option, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 handle Bf算法handle 输入 bf_option Bf算法的其他选项结构体指针 输入 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
-
注意
- 此算法读取jsonfile内AudioBfOption的参数,并使用此参数额外呼叫 IaaBf_SetShape,IaaBf_SetMode,IaaBf_SetAdaptiveIntensity,IaaBf_SetPfFlow,IaaBf_SetCalibration 等常用API。
4.24. IaaBf_SetHandleId¶
-
功能
配置Bf算法id。
-
语法
ALGO_BF_RET IaaBf_SetHandleId(BF_HANDLE handle, int id); -
形参
参数名称 描述 输入/输出 handle Bf算法handle 输入 id Bf算法handle id
数值范围:[0,100]输入 -
返回值
返回值 结果 0 成功 非0 失败,参照错误码 -
依赖
-
头文件: AudioBfProcess.h
-
库文件: libBF_2MIC_LINUX.so/ libBF_2MIC_LINUX.a/ libBF_4MIC_LINUX.so/libBF_4MIC_LINUX.a
-
5. BF 数据类型¶
5.1. BF模块相关数据类型定义¶
| 数据类型 | 定义 |
|---|---|
| AudioBfInit | Bf算法初始化参数结构体类型 |
| AudioBfConfig | Bf算法配置参数结构体类型 |
| BF_HANDLE | Bf算法句柄类型 |
| BF_WORKFLOW | 指派Bf算法后滤波器之位置 |
| BF_CALIBRATION | Bf算法音量校正指针 |
| AudioBfOption | Bf算法其他选项参数结构体类型 |
5.2. AudioBfInit¶
-
说明
Bf算法初始化参数结构体类型。
-
定义
typedef struct { unsigned int point_number; unsigned int sample_rate; float mic_distance; unsigned int channel; }AudioBfInit; -
成员
成员名称 描述 point_number Bf算法处理一次的采样点数,仅支持128点 sample_rate 采样率,目前支持8k/16k/32k/48k mic_distance 相邻麦克风的间的间距,单位为cm,建议为5cm 或6cm channel 通道数。仅支持两颗或四颗麦克风 -
相关数据类型及接口
5.3. AudioBfConfig¶
-
说明
Bf算法配置参数结构体类型。
-
定义
typedef struct { unsigned int temperature; int noise_gate_dbfs; int noise_estimation; float output_gain; int vad_enable; int diagonal_loading; }AudioBfConfig; -
成员
成员名称 描述 temperature 环境温度(摄氏温度),摄氏温度=(5/9)*(华氏温度-32)。 步长为1。 noise_gate_dbfs 噪音阀值(dB),此参数必须考虑实际麦克风所录制的音量大小。 应小心处理此值。 范围[-80,0]。建议值为 -20,步长为1 noise_estimation 噪声的估计模式,范围[0,1]。 0:自适应模式; 1:平均模式。建议使用0 output_gain 输出增益,范围[0~1]。 0.7: 0dB 增益; 1:3~4dB 增益。建议使用0.7 vad_enable 是否使用语音活检测(VAD),范围[0,1]。1: 使用VAD 方式判断每帧是否为噪音。0:使用 noise_gate_dbfs 方式判断每帧是否为噪音。建议使用0 diagonal_loading 反矩阵正则化之参数,范围[1,100],步长为1。 应小心处理此值。 若太高,会影响算法效果;若太低,容易造成语音失真。建议值为10 -
相关数据类型及接口
5.4. BF_HANDLE¶
-
说明
Bf算法句柄类型。
-
定义
typedef void* BF_HANDLE; -
相关数据类型及接口
5.5. BF_WORKFLOW¶
-
说明
指派Bf算法后滤波器之位置。
-
定义
typedef enum { BF_WORKFLOW_AFTER_APC = 0, BF_WORKFLOW_AFTER_BF = 1, BF_WORKFLOW_AFTER_BF_AEC_APC = 2, BF_WORKFLOW_AFTER_BF_AEC_AIWNR_APC = 3, }BF_WORKFLOW; -
成员
成员名称 描述 BF_WORKFLOW_AFTER_APC 应用后滤波器于APC后 BF_WORKFLOW_AFTER_BF 应用后滤波器于BF后 BF_WORKFLOW_AFTER_BF_AEC_APC 当AEC应用在BF与APC之间时,应用后滤波器于APC后 BF_WORKFLOW_AFTER_BF_AEC_AIWNR_APC 当AEC及AI模式之WNR应用在BF与APC之间时,应用后滤波器于APC后 -
注意事项
无。
-
相关数据类型及接口
5.6. BF_CALIBRATION¶
-
说明
Bf算法音量校正指针。
-
定义
typedef enum { BF_CALIBRATION_DISABLE = 0, BF_CALIBRATION_ENABLE = 1, }BF_CALIBRATION; -
成员
成员名称 描述 BF_CALIBRATION_DISABLE 不校正音量直接进行Bf算法 BF_CALIBRATION_ENABLE 于进行Bf算法前校正音量 -
注意事项
无。
-
相关数据类型及接口
5.7. AudioBfOption¶
-
说明
Bf算法其他选项参数结构体类型。
-
定义
typedef struct { int shape; float direction; int is_dynamic; int mode; int intensity; BF_WORKFLOW bf_workflow; BF_CALIBRATION calibration_flag; float array_pos[8]; int band[6]; int dl_intensity[7]; }AudioBfOption; -
成员
成员名称 描述 shape 参考IaaBf_SetShape direction 参考IaaBf_SetMode,IaaBf_Run is_dynamic 参考IaaBf_DynamicLoading mode 参考IaaBf_SetMode intensity 参考IaaBf_SetAdaptiveIntensity bf_workflow 参考IaaBf_SetPfFlow calibration_flag 参考IaaBf_SetCalibration array_pos 参考IaaBf_SetArbitraryShape band 参考IaaBf_DynamicLoading dl_intensity 参考IaaBf_DynamicLoading -
注意事项
其他选项参数必须搭配对应的API做使用,若无呼叫对应的API,参数设定就不会应用在算法内。
-
相关数据类型及接口
6. Error code¶
Bf API 错误码如下表所示:
| 错误码 | 宏定义 | 描述 |
|---|---|---|
| 0x00000000 | ALGO_BF_RET_SUCCESS | Bf执行成功 |
| 0x10000301 | ALGO_BF_RET_INIT_ERROR | Bf初始化错误 |
| 0x10000302 | ALGO_BF_RET_INVALID_CONFIG | Bf Config无效 |
| 0x10000303 | ALGO_BF_RET_INVALID_HANDLE | Bf Handle无效 |
| 0x10000304 | ALGO_BF_RET_INVALID_NOISE_ESTIMATION | Bf噪音估计模式设置无效 |
| 0x10000305 | ALGO_BF_RET_INVALID_VAD_ENABLE | Bf的VAD模式设置无效 |
| 0x10000306 | ALGO_BF_RET_INVALID_OUTPUT_GAIN | Bf输出增益设置无效 |
| 0x10000307 | ALGO_BF_RET_INVALID_INPUT_POINTER | Bf输入指标无效 |
| 0x10000308 | ALGO_BF_RET_INVALID_SAMPLERATE | Bf采样率无效 |
| 0x10000309 | ALGO_BF_RET_INVALID_POINTNUMBER | Bf采样点数无效 |
| 0x10000310 | ALGO_BF_RET_INVALID_CHANNEL | Bf通道数无效 |
| 0x10000311 | ALGO_BF_RET_INVALID_CALLING | Bf呼叫API顺序错误 |
| 0x10000312 | ALGO_BF_RET_API_CONFLICT | 有其他API正在运行 |
| 0x10000313 | ALGO_BF_RET_INVALID_GEOMETRY_TYPE | Bf指派数组形状错误 |
| 0x10000314 | ALGO_BF_RET_INVALID_MIC_DISTANCE | Bf指派麦克风间距错误 |
| 0x10000315 | ALGO_BF_RET_INVALLD_DYNAMIC_BAND | Bf指派动态带宽及对角负载强度错误 |
| 0x10000316 | ALGO_BF_RET_INVALID_SETMODE | Bf指派模式错误 |
| 0x10000317 | ALGO_BF_RET_INVALID_GETPOSITION | Bf获取数组位置错误 |
| 0x10000318 | ALGO_BF_RET_INVALID_SETINTENSITY | Bf指派迭代式波束形成强度错误 |
| 0x10000319 | ALGO_BF_RET_INVALID_SETCALLBACK | 警告:Bf授权失败 |
| 0x10000320 | ALGO_BF_RET_INVALID_SETPFFLOW | Bf设定后滤波器位置失败 |
| 0x10000321 | ALGO_BF_RET_INVALID_CALIBRATION | Bf校正音量失败 |
| 0x10000322 | ALGO_BF_RET_INVALID_JSONFILE | Bf读取Json档失败 |
7. 与APC之串接关系¶
使用 IaaBf_SetPfFlow并搭配APC的API IaaApc_EnhanceNNBFMode,可以自行设定Bf 后滤波器应用的位置及ANR 降噪模块的来源(Bf 内的传统降噪模块或是APC 内的降噪模块)。

- 与APC串接程序范例
ret = IaaBf_SetPfFlow(handle_bf, BF_WORKFLOW_AFTER_APC); while(fread(input, sizeof(short), bf_init.point_number*bf_init.channel, fin)) { ret = IaaBf_Run(handle_bf,input,output,&direction); ret = IaaApc_EnhanceNNBFMode(handle_apc,handle_bf,1); ret = IaaApc_Run(handle_apc,output); }