audio_process_chain.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /*
  2. * audio_process_chain.h
  3. *
  4. * Created on: 2022年6月9日
  5. * Author: pengzc
  6. */
  7. #ifndef JNI_VOIP_AUDIO_PROCESS_CHAIN_H_
  8. #define JNI_VOIP_AUDIO_PROCESS_CHAIN_H_
  9. #include <string.h>
  10. #include <string>
  11. namespace base {
  12. struct AudioAnrConfig {
  13. /**
  14. * 是否使能Anr算法
  15. */
  16. unsigned int enable;
  17. /**
  18. * Anr算法运行的模式
  19. * 0,表示Anr算法完全不使用其他的Anr参数,而是使用Anr算法内部的设定;
  20. * 1或2表示完全使用应用下的Anr参数
  21. */
  22. unsigned int user_mode;
  23. /**
  24. * 降噪频率范围 范围[1,127];步长1
  25. */
  26. int intensity_band[6];
  27. /**
  28. * 降噪强度,值越大降噪强度越高,但同时也会带来细节的丢失/损伤,建议值:10。
  29. * 范围[0,30];步长1
  30. */
  31. int intensity[7];
  32. /**
  33. * 频域平滑程度,建议值:10 范围[0,10];步长1
  34. */
  35. unsigned int smooth_level;
  36. /**
  37. * 噪声收敛速度,建议值 1
  38. * 取值范围 [0,2] ,0最低,2最高
  39. */
  40. int converge_speed;
  41. AudioAnrConfig();
  42. };
  43. struct AudioEqConfig {
  44. /**
  45. * 是否使能Eq算法
  46. */
  47. unsigned int enable;
  48. /**
  49. * Eq算法的运行模式
  50. * 0,表示Eq使用预设的参数,预设参数全为0,不做任何增益或衰减;
  51. * 1,表示完全使用应用下的Eq参数。
  52. */
  53. unsigned int user_mode;
  54. /**
  55. * Eq算法增益调节取值,将当前采样率的频率范围分成129个频率范围来进行调节,
  56. * 单位为1dB 范围[-50,20];步长1
  57. */
  58. short gain_db[129];
  59. AudioEqConfig();
  60. };
  61. struct AgcGainInfo {
  62. int gain_max; //gain maximum
  63. int gain_min; //gain minimum
  64. int gain_init; //default gain (initial gain)
  65. };
  66. struct AudioAgcConfig {
  67. /**
  68. * 是否使能Agc算法
  69. */
  70. unsigned int enable;
  71. /**
  72. * Agc算法的运行模式
  73. */
  74. unsigned int user_mode;
  75. /**
  76. * Agc算法的增益信息,定义AGC增益的最大、最小和初始值
  77. */
  78. AgcGainInfo gain_info;
  79. /**
  80. * 瞬间增益下降的最大值,防止输出饱和,
  81. * 若输出加上当前Gain超出drop_gain_threshold所设定的dB值,
  82. * Agc会瞬间降低Gain避免当前信号的峰值超过drop_gain_threshold。
  83. * 范围[0,60];步长1 注意:此值仅代表能下降的范围,但具体能下降到何值还需参考AGC增益的最小值。
  84. */
  85. unsigned int drop_gain_max;
  86. /**
  87. * 增益下降的时间步长,以4毫秒为1单位,若设定2则为8毫秒判断一次是否降Gain 范围[1,20];步长1
  88. */
  89. unsigned int attack_time;
  90. /**
  91. * 增益增加的时间步长,以4毫秒为1单位,若设定2则为8毫秒判断一次是否升Gain 范围[1, 20] ;步长1
  92. */
  93. unsigned int release_time;
  94. /**
  95. * 配合compression_ratio_output 使用,透过多个转折点实现多斜率的曲线,得到input power level跟output power level之间的关系。
  96. * 范围[-80,0]dBFS;步长1
  97. */
  98. short compression_ratio_input[7];
  99. /**
  100. * 配合compression_ratio_input使用,透过多个转折点实现多斜率的曲线,得到input power level跟output power level之间的关系。
  101. * 范围[-80,0]dBFS;步长1
  102. */
  103. short compression_ratio_output[7];
  104. /**
  105. * 衰减阈值,当信号峰值幅度超过此值后,会瞬间衰减,衰减幅度受drop_gain_max跟gain_info所限制。
  106. * 范围[-80,0]dB;步长1
  107. */
  108. int drop_gain_threshold;
  109. /**
  110. * 噪声阈值,当信号小于此值时,当作噪声处理,
  111. * Case1: 若设定noise_gate_db 从-80到0,当前gain值会根据release/attack time的时间将Gain值收敛成0。
  112. * Case2: 若设定noise_gate_db 从1到80,当信号小于此值时,Gain值将不会做更改,会保留前一帧的Gain值。
  113. * 范围[-80,80];步长1
  114. */
  115. int noise_gate_db;
  116. /**
  117. * 当噪声阈值起效果时,输入源的衰减百分比
  118. * 范围[0,100];步长1
  119. */
  120. unsigned int noise_gate_attenuation_db;
  121. /**
  122. * 套用增益的速率,以0.5dB为一个单位,若设定为1,则每帧依照需求套用±0.5dB。
  123. * 此值设定的越高,拉升和降低音量的速率越快。 范围[1,10]; 步长1
  124. */
  125. unsigned int gain_step;
  126. AudioAgcConfig();
  127. };
  128. /**
  129. * APC(Audio Process Chain)音频处理链路,是一个包含降噪、均衡器和自动增益控制的算法组合。
  130. * APC的主要目的是提高音频质量。
  131. * APC的内部的算法串接流程为Anr → Eq/Hpf → Agc。
  132. * 透过降噪消除噪声提升SNR,再根据客户所需曲线调整EQ/HPF,最后输出透过AGC放大或压抑。
  133. *
  134. * AGC(Automatic Gain Control),自动增益控制,用于控制数字输出增益。
  135. * EQ(Equalizer),均衡器处理,用于对特定频段进行增益或衰减。
  136. * ANR(Acoustic Noise Reduction),降噪,用于去除环境中持续存在,频率固定的噪声。
  137. * HPF(High-Pass Filtering),高通滤波
  138. *
  139. */
  140. class AudioProcessChain {
  141. public:
  142. struct Configuration {
  143. AudioAnrConfig anr;
  144. AudioEqConfig eq;
  145. AudioAgcConfig agc;
  146. /**
  147. * 通道数
  148. */
  149. unsigned int number_of_channels;
  150. /**
  151. * 采样率
  152. */
  153. unsigned int sample_rate;
  154. Configuration();
  155. std::string ToString() const ;
  156. static Configuration FromString(const std::string& str);
  157. };
  158. AudioProcessChain();
  159. virtual ~AudioProcessChain();
  160. /**
  161. *
  162. * @return 0 success
  163. */
  164. int Initialize(const AudioProcessChain::Configuration& conf);
  165. /**
  166. *
  167. * @param pss_audio_in_out
  168. * @param number_of_samples
  169. * @return 0 success
  170. */
  171. int Process(short* pss_audio_in_out, int number_of_samples);
  172. private:
  173. class Impl;
  174. Impl* impl_;
  175. };
  176. } /* namespace base */
  177. #endif /* JNI_VOIP_AUDIO_PROCESS_CHAIN_H_ */