跳转至

SGS WNR 算法使用参考


REVISION HISTORY

Revision No.
Description
Date
1.0
  • Initial release
  • 07/19/2024
    1.01
  • Update file description and copyright
  • 04/25/2025
    1.02
  • Remove copyright
  • 05/14/2025
    1.03
  • Update description
  • 05/21/2025
    1.1
  • Remove wnr_mode 0 and related API
  • 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
    • 注意事项

      无。

    • 相关数据类型及接口

      AudioWnrInit

    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 高速收敛
    • 注意事项

      无。

    • 相关数据类型及接口

      AudioWnrConfig

    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。

    • 相关数据类型及接口

      IaaWnr_Init

      IaaWnr_InitReadFromJson

    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 算法的收敛速度,更新噪声的速度快慢,设定越慢降噪收敛越慢,

    • 相关数据类型及接口

      IaaWnr_Config

      IaaWnr_ConfigReadFromJson

    3.5. WNR_HANDLE

    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 运行失败