123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196 |
- /*
- * 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 <string.h>
- #include <string>
- 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_ */
|