SGS WNR 算法使用参考¶
REVISION HISTORY¶
| Revision No. | Description |
Date |
|---|---|---|
| 1.0 | 07/19/2024 | |
| 1.01 | 04/25/2025 | |
| 1.02 | 05/14/2025 | |
| 1.03 | 05/21/2025 | |
| 1.1 | 11/03/2025 |
1. 概述¶
1.1. 算法说明¶
降风噪算法(Wind Noise Reduction, WNR)是针对环境中的风声压抑,以提升语音质量。库文件若包含深度学习模式 (MODE1) 则不支持动态库。
2. API 参考¶
| API名称 | 功能 |
|---|---|
| IaaWnr_GetBufferSize | 获取WNR算法运行需要的内存大小 |
| IaaWnr_Init | 初始化WNR算法 |
| IaaWnr_Config | 设置WNR算法参数 |
| IaaWnr_Run | WNR算法处理 |
| IaaWnr_Free | 释放WNR算法资源 |
| IaaWnr_SetHandleId | 配置WNR算法ID |
| IaaWnr_GetJsonFileSize | WNR获取解析Json文件内容所需要的内存大小 |
| IaaWnr_InitReadFromJson | 配置Json参数到WNR算法的初始化结构体指针 |
| IaaWnr_ConfigReadFromJson | 配置Json参数到WNR算法的参数结构体指针 |
2.1. IaaWnr_GetBufferSize¶
-
功能
获取WNR算法运行所需要的内存大小。
-
语法
unsigned int IaaWnr_GetBufferSize(void); -
形参
参数名称 描述 输入/输出 N/A -
返回值
返回值为WNR算法运行所需要的内存大小。
-
依赖
-
头文件: AudioWnrProcess.h
-
库文件: libWNR_LINUX.so/ libWNR_LINUX.a
-
-
注意
该接口仅返回需要的内存大小,申请和释放内存的动作需应用来处理。
-
举例
请参考IaaWnr_Run举例部分。
2.2. IaaWnr_Init¶
-
功能
初始化WNR算法。
-
语法
WNR_HANDLE IaaWnr_Init(char* const working_buffer_address, AudioWnrInit *wnr_init); -
形参
参数名称 描述 输入/输出 working_buffer_address WNR算法使用的内存地址 输入 wnr_init WNR算法的初始化结构体指针 输入 -
返回值
返回值 结果 非NULL 成功 NULL 失败 -
依赖
-
头文件: AudioWnrProcess.h
-
库文件: libWNR_LINUX.so/ libWNR_LINUX.a
-
-
注意
无。
-
举例
请参考 IaaWnr_Run 举例部分。
2.3. IaaWnr_Config¶
-
功能
设置WNR算法参数。
-
语法
ALGO_WNR_RET IaaWnr_Config(WNR_HANDLE handle, AudioWnrConfig *wnr_config); -
形参
参数名称 描述 输入/输出 handle WNR算法handle 输入 wnr_config WNR算法参数设置结构体 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考 错误码 -
依赖
-
头文件: AudioWnrProcess.h
-
库文件: libWNR_LINUX.so/ libWNR_LINUX.a
-
-
注意
无。
-
举例
请参考 IaaWnr_Run 举例部分。
2.4. IaaWnr_Run¶
-
功能
WNR算法处理函数。
-
语法
ALGO_WNR_RET IaaWnr_Run(WNR_HANDLE handle, short* pss_audio_in); -
形参
参数名称 描述 输入/输出 handle 算法handle 输入 pss_audio_in 输入数据指针 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考 错误码 -
依赖
-
头文件: AudioWnrProcess.h
-
库文件: libWNR_LINUX.so/ libWNR_LINUX.a
-
-
注意
无。
-
举例
#include <stdio.h> #include <string.h> #include <time.h> #include <stdlib.h> #ifndef OS_WINDOWS #include <sys/ioctl.h> #endif #include <sys/types.h> #include <sys/stat.h> #include <sys/time.h> #include "AudioWnrProcess.h" #define USE_MALLOC (1) unsigned int WorkingBuffer2[1] = {0}; 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 ); return T; } int main(int argc, char *argv[]) { short input[1024]; char input_file[512]; char outfile_name[512]; unsigned int T0, T1; float avg = 0; int counter=0; #if USE_MALLOC char *working_buf_ptr = (char*)malloc(IaaWnr_GetBufferSize()); #else char working_buf_ptr[512*100*2]; #endif FILE * fin, *fout; int ret1; WNR_HANDLE handle; AudioWnrInit wnr_init; AudioWnrConfig wnr_config; char wnr_para_json_file[512]; sprintf(wnr_para_json_file,"%s","./../sample/data/WnrParamJson.json"); unsigned int wnr_para_buffersize = IaaWnr_GetJsonFileSize(wnr_para_json_file); char *wnr_para_json_buf_ptr = (char*)malloc(wnr_para_buffersize); memset(&wnr_init,0,sizeof(AudioWnrInit)); memset(&wnr_config,0,sizeof(AudioWnrConfig)); ret1 = IaaWnr_InitReadFromJson(&wnr_init, wnr_para_json_buf_ptr, wnr_para_json_file, wnr_para_buffersize); ret1 = IaaWnr_ConfigReadFromJson(&wnr_config, wnr_para_json_buf_ptr, wnr_para_json_file, wnr_para_buffersize); if(ret1 < 0) { printf("Error occured Read JSON file\n"); return -1; } handle = IaaWnr_Init((char *)working_buf_ptr, &wnr_init); if(handle==NULL) { printf("WNR init error\r\n"); return -1; } else { printf("WNR init succeed\r\n"); } if(IaaWnr_Config(handle, &wnr_config) == -1) { printf("Config Error!"); return -1; } sprintf(input_file,"%s","./../sample/data/m5dB_p228_217_mic1_test_gusts_07.wav"); sprintf(outfile_name,"%s","./../sample/data/m5dB_p228_217_mic1_test_gusts_07_sim.wav"); fin = fopen(input_file, "rb"); if(!fin) { printf("the input file %s could not be open\n",input_file); return -1; } fout = fopen(outfile_name, "wb"); if (!fout) { fprintf(stderr, "Error opening file: %s\n", outfile_name); return -1; } fread(input, sizeof(char), 44, fin); // read header 44 bytes fwrite(input, sizeof(char),44, fout); // write 44 bytes output while(fread(input, sizeof(short), wnr_init.point_number*wnr_init.channel, fin)) { counter++; T0 = (long)_OsCounterGetMs(); ret1 = IaaWnr_Run(handle, input); T1 = (long)_OsCounterGetMs(); avg += (T1 - T0); if(ret1 < 0) { printf("Error occured in WNR\n"); break; } fwrite(input, sizeof(short), wnr_init.point_number*wnr_init.channel, fout); } avg /= counter; printf("AVG is %.2f us\n",avg); IaaWnr_Free(handle); free(working_buf_ptr); fclose(fin); fclose(fout); printf("Done\n"); return 0;
2.5. IaaWnr_Free¶
-
功能
释放WNR算法的资源。
-
语法
ALGO_WNR_RET IaaWnr_Free(WNR_HANDLE handle);
-
形参
参数名称 描述 输入/输出 handle WNR算法handle 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考 错误码 -
依赖
-
头文件: AudioWnrProcess.h
-
库文件: libWNR_LINUX.so/ libWNR_LINUX.a
-
-
注意
必须先调用IaaWnr_Free,再释放供WNR算法所使用的内存。
-
举例
请参考 IaaWnr_Run 举例部分。
2.6. IaaWnr_SetHandleId¶
-
功能
配置WNR算法ID
-
语法
ALGO_WNR_RET IaaWnr_SetHandleId(WNR_HANDLE handle, int id); -
形参
参数名称 描述 输入/输出 handle WNR算法handle 输入 id WNR算法handle id
数值范围:[0,100]输入 -
返回值
返回值 结果 0 成功 非0 失败,参考 错误码 -
依赖
-
头文件: AudioWnrProcess.h
-
库文件: libWNR_LINUX.so/ libWNR_LINUX.a
-
-
注意
无。
2.7. IaaWnr_GetJsonFileSize¶
-
功能
WNR获取解析Json文件内容所需要的内存大小
-
语法
unsigned int IaaWnr_GetJsonFileSize(char* jsonfile); -
形参
参数名称 描述 输入/输出 jsonfile Json檔名 输入 -
返回值
返回值为解析Json文件内容所需要的内存大小
-
依赖
-
头文件: AudioWnrProcess.h
-
库文件: libWNR_LINUX.so/ libWNR_LINUX.a
-
-
注意
无。
-
举例
请参考 IaaWnr_Run 举例部分。
2.8. IaaWnr_InitReadFromJson¶
-
功能
配置Json参数到WNR算法的初始化结构体指针
-
语法
ALGO_WNR_RET IaaWnr_InitReadFromJson(AudioWnrInit* wnr_init, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 wnr_init WNR算法Init 输入 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考 错误码 -
依赖
-
头文件: AudioWnrProcess.h
-
库文件: libWNR_LINUX.so/ libWNR_LINUX.a
-
-
注意
无。
-
举例
请参考 IaaWnr_Run 举例部分。
2.9. IaaWnr_ConfigReadFromJson¶
-
功能
配置Json参数到WNR算法的参数结构体指针
-
语法
ALGO_WNR_RET IaaWnr_ConfigReadFromJson(AudioWnrConfig* wnr_config, char* jsonBuffer, char* jsonfile, unsigned int buffSize); -
形参
参数名称 描述 输入/输出 wnr_config WNR算法Config 输入 jsonBuffer 解析Json文件内容所使用的内存地址 输入 jsonfile Json檔名 输入 buffSize 解析Json文件内容所需要的内存大小 输入 -
返回值
返回值 结果 0 成功 非0 失败,参考 错误码 -
依赖
-
头文件: AudioWnrProcess.h
-
库文件: libWNR_LINUX.so/ libWNR_LINUX.a
-
-
注意
无。
-
举例
请参考 IaaWnr_Run 举例部分。
3. WNR 数据类型¶
WNR模块相关数据类型定义如下:
| 数据类型 | 定义 |
|---|---|
| IAA_WNR_SAMPLE_RATE | WNR算法的取样频率类型 |
| WNR_CONVERGE_SPEED | WNR算法的收敛速度类型 |
| AudioWnrInit | WNR算法初始化数据结构体类型 |
| AudioWnrConfig | WNR算法参数设置结构体类型 |
| WNR_HANDLE | WNR算法句柄类型 |
3.1. IAA_WNR_SAMPLE_RATE¶
-
说明
定义WNR算法的测采样率类型。
-
定义
typedef enum { IAA_WNR_SAMPLE_RATE_16000 = 16000 , }IAA_WNR_SAMPLE_RATE; -
成员
成员名称 描述 IAA_WNR_SAMPLE_RATE_16000 采样率16000Hz -
注意事项
无。
-
相关数据类型及接口
3.2. WNR_CONVERGE_SPEED¶
-
说明
定义WNR收敛速度类型。
-
定义
typedef enum { WNR_SPEED_LOW, WNR_SPEED_MID, WNR_SPEED_HIGH } WNR_CONVERGE_SPEED; -
成员
成员名称 描述 WNR_SPEED_LOW 低速收敛 WNR_SPEED_MID 中速收敛 WNR_SPEED_HIGH 高速收敛 -
注意事项
无。
-
相关数据类型及接口
3.3. AudioWnrInit¶
-
说明
定义WNR算法的初始化参数类型。
-
定义
typedef struct { unsigned int point_number; unsigned int channel; IAA_WNR_SAMPLE_RATE sample_rate; }AudioWnrInit; -
成员
成员名称 描述 point_number WNR算法处理一次的采样点数 channel 通道数,支持单声道及双声道 sample_rate 采样率 -
注意事项
-
point_number,MODE1可支持 128/256 点 (编译时决定)。库文件所支持的 point_number 可以在终端机输入以下指令得知
strings libWNR_LINUX.a | grep WNRSET -
sample_rate,MODE1 仅支持16k。
-
-
相关数据类型及接口
3.4. AudioWnrConfig¶
-
说明
定义WNR算法的配置参数结构体类型。
-
定义
typedef struct{ unsigned int wnr_enable; unsigned int wnr_mode; int wnr_intensity_band[WNR_BAND_NUM-1]; int wnr_intensity[WNR_BAND_NUM]; unsigned int wnr_smooth_level; WNR_CONVERGE_SPEED wnr_converge_speed; }AudioWnrConfig; -
成员
成员名称 描述 wnr_enable 是否启用 WNR 算法 wnr_mode 频域降风噪滤波器模式。范围 [0,1];步长1 wnr_intensity_band 降风噪频率范围。范围 [1,point_number];步长1 wnr_intensity 降风噪强度。值越大降噪强度越高,但同时也会带来细节的丢失/损伤,建议值: 10。范围 [0,30];步长 1 wnr_smooth_level 频域平滑程度。建议值: 0,范围 [0,10];步长 1 wnr_converge_speed 噪声收敛速度。建议值: high,范围 [low;mid;high] -
注意事项
-
当 wnr_enable 为 FALSE 时,算法不做动,其他的WNR参数也不会起作用。
-
wnr_mode 指定WNR算法 1 为使用深度学习之降风噪算法。库文件可使用的算法 mode 可以在终端机输入以下指令得知
strings libWNR_LINUX.a | grep WNRTYPE -
wnr_intensity_band/wnr_intensity/wnr_smooth_level/wnr_converge_speed 主要是针对 wnr_mode 1 的参数调整。
-
WNR_BAND_NUM 定义可从 header 查看。
-
wnr_intensity_band,降噪频率范围,后一个元素必须大于等于前1个元素。
如:wnr_intensity_band[0] = 10, 则:wnr_intensity_band[1] 必须大于等于10。
当前取样率对应的最高频率平均分成 point_number 份,频率范围则是对应多少份组成一个频带。
如:当前 point_number 为128,取样率为 16K,对应的最大频率为 8K,每一份为 8000 / 128 ≈ 62.5 Hz。如在 {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} ,wnr_intensity 为降噪强度,可根据 wnr_intensity_band 的频带划分,针对各个频带的噪声情况设置不同的参数。
-
wnr_smooth_level,WNR 算法处理频域的平滑程度,针对相邻频率上的压抑做平滑处理。
-
wnr_converge_speed,WNR 算法的收敛速度,更新噪声的速度快慢,设定越慢降噪收敛越慢,
-
-
相关数据类型及接口
3.5. WNR_HANDLE¶
-
说明
定义WNR算法的句柄类型。
-
定义
typedef void* WNR_HANDLE;
-
成员
成员名称 描述 N/A -
注意事项
无。
-
相关数据类型及接口
4. Error code¶
WNR API 错误码如下表所示:
| 错误码 | 宏定义 | 描述 |
|---|---|---|
| 0x00000000 | ALGO_WNR_RET_SUCCESS | WNR 执行成功 |
| 0x10000801 | ALGO_WNR_RET_INVALID_CONFIG | WNR Config 无效 |
| 0x10000802 | ALGO_WNR_RET_INVALID_HANDLE | WNR handle 无效 |
| 0x10000803 | ALGO_WNR_RET_INVALID_SAMPLERATE | WNR 取样率 无效 |
| 0x10000804 | ALGO_WNR_RET_INVALID_POINTNUMBER | WNR 每帧点数设置无效 |
| 0x10000805 | ALGO_WNR_RET_INVALID_CHANNEL | WNR 通道数设置无效 |
| 0x10000806 | ALGO_WNR_RET_INVALID_ENABLE | WNR 开关参数设置无效 |
| 0x10000807 | ALGO_WNR_RET_INVALID_MODE | WNR 模式参数设置无效 |
| 0x10000808 | ALGO_WNR_RET_INVALID_INTENSITY | WNR 强度参数设置无效 |
| 0x10000809 | ALGO_WNR_RET_INVALID_SMOOTH_LEVEL | WNR 平滑化参数设置无效 |
| 0x10000810 | ALGO_WNR_RET_INVALID_CONVERGE_SPEED | WNR 收敛速度参数设置无效 |
| 0x10000811 | ALGO_WNR_RET_INVALID_JSONFILE | WNR 解析Json相关错误 |
| 0x10000812 | ALGO_WNR_RET_INVALID_DUMP | WNR Dump音档相关错误 |
| 0x10000813 | ALGO_WNR_RET_INVALID_CALLING | WNR API 呼叫顺序错误 |
| 0x10000814 | ALGO_WNR_RET_API_CONFLICT | WNR API 运行冲突 |
| 0x10000815 | ALGO_WNR_RET_FAILED | WNR 运行失败 |