/* * audio_process_chain.h * * Created on: 2022年6月9日 * Author: pengzc */ #ifndef JNI_VOIP_AUDIO_PROCESS_CHAIN_H_ #define JNI_VOIP_AUDIO_PROCESS_CHAIN_H_ #include #include namespace base { struct AudioAnrConfig { /** * 是否使能Anr算法 */ unsigned int enable; /** * Anr算法运行的模式 * 0,表示Anr算法完全不使用其他的Anr参数,而是使用Anr算法内部的设定; * 1或2表示完全使用应用下的Anr参数 */ unsigned int user_mode; /** * 降噪频率范围 范围[1,127];步长1 */ int intensity_band[6]; /** * 降噪强度,值越大降噪强度越高,但同时也会带来细节的丢失/损伤,建议值:10。 * 范围[0,30];步长1 */ int intensity[7]; /** * 频域平滑程度,建议值:10 范围[0,10];步长1 */ unsigned int smooth_level; /** * 噪声收敛速度,建议值 1 * 取值范围 [0,2] ,0最低,2最高 */ int converge_speed; AudioAnrConfig(); }; struct AudioEqConfig { /** * 是否使能Eq算法 */ unsigned int enable; /** * Eq算法的运行模式 * 0,表示Eq使用预设的参数,预设参数全为0,不做任何增益或衰减; * 1,表示完全使用应用下的Eq参数。 */ unsigned int user_mode; /** * Eq算法增益调节取值,将当前采样率的频率范围分成129个频率范围来进行调节, * 单位为1dB 范围[-50,20];步长1 */ short gain_db[129]; AudioEqConfig(); }; struct AgcGainInfo { int gain_max; //gain maximum int gain_min; //gain minimum int gain_init; //default gain (initial gain) }; struct AudioAgcConfig { /** * 是否使能Agc算法 */ unsigned int enable; /** * Agc算法的运行模式 */ unsigned int user_mode; /** * Agc算法的增益信息,定义AGC增益的最大、最小和初始值 */ AgcGainInfo gain_info; /** * 瞬间增益下降的最大值,防止输出饱和, * 若输出加上当前Gain超出drop_gain_threshold所设定的dB值, * Agc会瞬间降低Gain避免当前信号的峰值超过drop_gain_threshold。 * 范围[0,60];步长1 注意:此值仅代表能下降的范围,但具体能下降到何值还需参考AGC增益的最小值。 */ unsigned int drop_gain_max; /** * 增益下降的时间步长,以4毫秒为1单位,若设定2则为8毫秒判断一次是否降Gain 范围[1,20];步长1 */ unsigned int attack_time; /** * 增益增加的时间步长,以4毫秒为1单位,若设定2则为8毫秒判断一次是否升Gain 范围[1, 20] ;步长1 */ unsigned int release_time; /** * 配合compression_ratio_output 使用,透过多个转折点实现多斜率的曲线,得到input power level跟output power level之间的关系。 * 范围[-80,0]dBFS;步长1 */ short compression_ratio_input[7]; /** * 配合compression_ratio_input使用,透过多个转折点实现多斜率的曲线,得到input power level跟output power level之间的关系。 * 范围[-80,0]dBFS;步长1 */ short compression_ratio_output[7]; /** * 衰减阈值,当信号峰值幅度超过此值后,会瞬间衰减,衰减幅度受drop_gain_max跟gain_info所限制。 * 范围[-80,0]dB;步长1 */ int drop_gain_threshold; /** * 噪声阈值,当信号小于此值时,当作噪声处理, * Case1: 若设定noise_gate_db 从-80到0,当前gain值会根据release/attack time的时间将Gain值收敛成0。 * Case2: 若设定noise_gate_db 从1到80,当信号小于此值时,Gain值将不会做更改,会保留前一帧的Gain值。 * 范围[-80,80];步长1 */ int noise_gate_db; /** * 当噪声阈值起效果时,输入源的衰减百分比 * 范围[0,100];步长1 */ unsigned int noise_gate_attenuation_db; /** * 套用增益的速率,以0.5dB为一个单位,若设定为1,则每帧依照需求套用±0.5dB。 * 此值设定的越高,拉升和降低音量的速率越快。 范围[1,10]; 步长1 */ unsigned int gain_step; AudioAgcConfig(); }; /** * APC(Audio Process Chain)音频处理链路,是一个包含降噪、均衡器和自动增益控制的算法组合。 * APC的主要目的是提高音频质量。 * APC的内部的算法串接流程为Anr → Eq/Hpf → Agc。 * 透过降噪消除噪声提升SNR,再根据客户所需曲线调整EQ/HPF,最后输出透过AGC放大或压抑。 * * AGC(Automatic Gain Control),自动增益控制,用于控制数字输出增益。 * EQ(Equalizer),均衡器处理,用于对特定频段进行增益或衰减。 * ANR(Acoustic Noise Reduction),降噪,用于去除环境中持续存在,频率固定的噪声。 * HPF(High-Pass Filtering),高通滤波 * */ class AudioProcessChain { public: struct Configuration { AudioAnrConfig anr; AudioEqConfig eq; AudioAgcConfig agc; /** * 通道数 */ unsigned int number_of_channels; /** * 采样率 */ unsigned int sample_rate; Configuration(); std::string ToString() const ; static Configuration FromString(const std::string& str); }; AudioProcessChain(); virtual ~AudioProcessChain(); /** * * @return 0 success */ int Initialize(const AudioProcessChain::Configuration& conf); /** * * @param pss_audio_in_out * @param number_of_samples * @return 0 success */ int Process(short* pss_audio_in_out, int number_of_samples); private: class Impl; Impl* impl_; }; } /* namespace base */ #endif /* JNI_VOIP_AUDIO_PROCESS_CHAIN_H_ */