以编程方式增加麦克风增益

时间:2017-03-12 15:02:06

标签: c++ signal-processing microphone portaudio

我试图为VOIP场景增加麦克风的增益。 我使用PortAudio来获取输入流(具有类型为paFloat32的样本),我将这些值乘以浮点数,然后将结果流传递给输出设备。 注意:我将其传递给虚拟输出设备,该设备会自动重定向到虚拟输入设备(程序:VB-Cable),VOIP应用程序可以将其用作应用了增益的麦克风输入。

我想知道是否有更好的方法可以增加信号的增益,从而更好地保持质量。

我已经读过,通过首先将输入转换为更高精度格式,以此格式执行增益乘法,应用裁剪,然后退回到原始格式来执行此类增益计算会更好。 我不确定如何使用PortAudio的paFloat32类型,我已经在源代码中注释了我的尝试。当我启用它时,即使增益设置为1,也会出现明显的噪声问题。

依赖关系:tinycon, PortAudio

编译:{{1​​}}

代码:

g++ main.cpp tinycon.cpp -o main -L./ -lcygportaudio-2 -lrt -lm -pthread  -std=c++11

1 个答案:

答案 0 :(得分:0)

我发现您也可以使用webrtc库。它具有噪音抑制功能,非常方便。我不明白compress_gain_db和target_level_dbfs实际上做了什么,但是将它们设置为最高值似乎应用了最多的收益。按照@alexander的建议在int16中工作解决了我的自定义解决方案的许多问题,并修复了循环以覆盖整个缓冲区。通过以下示例代码,可以实时播放webrtc的解决方案和我自己的解决方案。

下面的代码示例。

$ ./main.exe -h
-h : show this help message
-i <int> : select the INPUT DEVICE by id
-o <int> : select the OUPUT DEVICE by id
-c <int [0,90]> : compression_gain_db
-t <int [0, 31]> : target_level_dbfs
-g <0 or 1> : toggle webrtc gain control on and off (1 by default)
-k <0 or 1> : toggle custom gain control on and off (1 by default)
-f <int [1, maxInt]> : customGainControlFactor
-q <int [0, 3]> : webrtc noise supression level, high is more suppression
-e <0 or 1> : toggle webrtc noise suppression on and off (1 by default)
-d : list devices

Real time controls:
compression_gain_db            UP_KEY='a' DOWN_KEY='s'
target_dbfs_level              UP_KEY='d' DOWN_KEY='f'
webrtcGainControlEnabled                           TOGGLE_KEY='g'
webrtcNoiseSuppressionLevel    UP_KEY='q' DOWN_KEY='w'
webrtcNoiseSuppressionEnabled                      TOGGLE_KEY='e'
customGainFactor               UP_KEY='h' DOWN_KEY='j'
customGainFactorEnabled                            TOGGLE_KEY='k'
Press any key to close

依赖关系:tinycon, PortAudio, libwebrtc-audio-processing-devel

注意:我正在使用cygwin,如果你遇到libwebrtc问题,请参阅here

编译:{{1​​}}

的main.cpp

g++ main.cpp tinycon.cpp -o main -L./ -lcygportaudio-2 -lrt -lm -pthread -I/usr/include/webrtc_audio_processing/ -DWEBRTC_WIN -DWEBRTC