Webrtc回声消除调试pc环境
一 概述
该测试环境通过将开发板模拟成一个单通道播放、三声道录音的UAC声卡设备,当开发板与PC连接时,可以在PC上通过应用工具(普通播放器、音频处理软件等)控制开发板的icodec播放、录音及回环,并且能够实时地观察到基于回声消除算法库(Webrtc)处理后的回声消除效果.
二 配置
2.1 回声消除相关demo
代码文件位置libmedia/test/main_webrtc_uac_noecho_test.c
2.2 播放、录⾳与回读功能
声卡驱动配置
默认勾选加载模块时codec进入待机状态,播放时配置dac余下步骤(避免播放无声或滋滋声)
使能ADCL中MIC输入为单端模式: ad100 mic为差分不用勾选,ad102n/p为单端需要勾选
mic信号的增益(MICL_GAIN):外接amic时需要依据信号强弱设置改增益⼤⼩
⼿动设置ALCL增益(ALCL_GAIN):alcl为codec的adc的数字增益,⽤于调节录制⾳频的增益⼤⼩
输出信号的模拟增益(HPOUTL):⽤于调节播放⾳频的增益⼤⼩
录音时mic引脚需高电平,播放时功放引脚需高电平
创建声卡设备
2.3 buildroot配置
bhu@bhu-PC:~/ad100/buildroot/buildroot24$ make menuconfig
编译webrtc库需要工具链gcc1210
2.4 kernel uac 配置
bhu@bhu-PC:~/ad100/kernel/kernel$ make menuconfig
关闭USB的描述符DMA
2.5 uac2.0设备配置脚本
uac2_device_config.sh位于目录doc/开发使用说明/第三方库使用说明/硬件回环回声消除测试环境
#!/bin/bash
VID="0x18d1"
PID="0xd002"
function start_uac2()
{
echo "Creating the USB gadget..."
mount -t configfs none /sys/kernel/config
mkdir -m 0770 /sys/kernel/config/usb_gadget/g1
# 设置产品的VendorID、ProductID及USB规范版本号
echo "Setting Device Descriptor..."
echo 0x00 > /sys/kernel/config/usb_gadget/g1/bDeviceClass
echo 0x00 > /sys/kernel/config/usb_gadget/g1/bDeviceSubClass
echo 0x00 > /sys/kernel/config/usb_gadget/g1/bDeviceProtocol
echo 0x0200 > /sys/kernel/config/usb_gadget/g1/bcdUSB
echo 0x0200 > /sys/kernel/config/usb_gadget/g1/bcdDevice
echo $VID > /sys/kernel/config/usb_gadget/g1/idVendor
echo $PID > /sys/kernel/config/usb_gadget/g1/idProduct
# 实例化英语ID,开发商、产品和序列号字符串写入内核
echo "Setting English strings..."
mkdir -m 0770 /sys/kernel/config/usb_gadget/g1/strings/0x409
echo "ingenic" > /sys/kernel/config/usb_gadget/g1/strings/0x409/manufacturer
echo "audio" > /sys/kernel/config/usb_gadget/g1/strings/0x409/product
echo "your_serial_num" > /sys/kernel/config/usb_gadget/g1/strings/0x409/serialnumber
# Creating Config
echo "Creating Config..."
mkdir -m 0770 /sys/kernel/config/usb_gadget/g1/configs/c.1
mkdir -m 0770 /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
echo "uac2" > /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409/configuration
echo 500 > /sys/kernel/config/usb_gadget/g1/configs/c.1/MaxPower
echo 0x80 > /sys/kernel/config/usb_gadget/g1/configs/c.1/bmAttributes
# Creating functions
echo "Creating functions..."
mkdir /sys/kernel/config/usb_gadget/g1/functions/uac2.0
echo "0x01" > /sys/kernel/config/usb_gadget/g1/functions/uac2.0/c_chmask
echo "2" > /sys/kernel/config/usb_gadget/g1/functions/uac2.0/c_ssize
echo $SAMPLE_RATE > /sys/kernel/config/usb_gadget/g1/functions/uac2.0/c_srate
echo "0x07" > /sys/kernel/config/usb_gadget/g1/functions/uac2.0/p_chmask
echo "2" > /sys/kernel/config/usb_gadget/g1/functions/uac2.0/p_ssize
echo $SAMPLE_RATE > /sys/kernel/config/usb_gadget/g1/functions/uac2.0/p_srate
echo "2" > /sys/kernel/config/usb_gadget/g1/functions/uac2.0/req_number
echo "adaptive" > /sys/kernel/config/usb_gadget/g1/functions/uac2.0/c_sync
# Binding USB Device Controller
echo "Binding USB Device Controller"
ln -s /sys/kernel/config/usb_gadget/g1/functions/uac2.0 /sys/kernel/config/usb_gadget/g1/configs/c.1
echo 13500000.otg > /sys/kernel/config/usb_gadget/g1/UDC
}
function stop_uac2()
{
# Disabling the gadget
echo "Disabling the USB gadget"
echo "" > /sys/kernel/config/usb_gadget/g1/UDC
# Remove functions from configurations
rm /sys/kernel/config/usb_gadget/g1/configs/c.1/uac2.0
# Remove strings directories in configurations
rmdir /sys/kernel/config/usb_gadget/g1/configs/c.1/strings/0x409
# remove the configurations
rmdir /sys/kernel/config/usb_gadget/g1/configs/c.1
# Remove functions (function modules are not unloaded, though)
rmdir /sys/kernel/config/usb_gadget/g1/functions/uac2.0
# Remove strings directories in the gadget
rmdir /sys/kernel/config/usb_gadget/g1/strings/0x409
# finally remove the gadget
rmdir /sys/kernel/config/usb_gadget/g1
umount /sys/kernel/config
}
usage()
{
echo "Usage: ./usb-gadget-uac2.sh start|stop"
echo " options:"
echo " start [sample_rate] uac2.0 gadget, setting rate of both capture and playback"
echo " stop uac2.0 gadget"
}
case $1 in
start)
if [ "$#" -lt 2 ]; then
usage
exit 1
fi
SAMPLE_RATE=$2
start_uac2
;;
stop)
stop_uac2
;;
*)
usage
exit 1
;;
esac
exit 0
三 验证
3.1 模拟uac设备
在终端运行uac设备脚本
sh uac2_device_config.sh start 48000 //48000为采样率
3.2 修改回声消除测试demo
代码文件位置libmedia/test/main_webrtc_uac_noecho_test.c
# arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: icodecsoundcard [icodec-sound-card], device 0: ad100-icodec-pcm ingenic-icodec-0 []
Subdevices: 0/1
Subdevice #0: subdevice #0
card 1: loopbacksoundca [loopback-sound-card], device 0: ad100-loopback-pcm snd-soc-dummy-dai-0 []
Subdevices: 0/1
Subdevice #0: subdevice #0
card 2: UAC2Gadget [UAC2_Gadget], device 0: UAC2 PCM [UAC2 PCM]
Subdevices: 0/1
Subdevice #0: subdevice #0
icodecsoundcard为card 0,loopbacksoundcard为card 1,UAC2Gadget为card 2;
修改完后重新编译测试demo
3.3 运行测试demo
aec_webrtc_uac_loopback_test 48000 //48000为采样率
此处的采样率与uac设备配置脚本的采样率需要保持一致,变更时需要同时变更
3.4 pc端调试
Audacity配置
运行应用Audacity,选择录制设备为模拟UAC设备,录制声道数为3,采样率相应设置为48000Hz
设置完开始录制,打开任意音频文件选择该模拟UAC设备播放,测试回声消除效果
由上到下,
第一行为回声消除后的音频数据,
第二行为实际录制到的音频数据,
第三行为回采到的音频数据(即模拟UAC设备播放的音频文件)
四 调试
可以通过 cmd_alsa(libhardware2中的⼯具)修改mic及speak音量大小
# cmd_alsa list_ctls card=hw:0
integer: "Master Playback Volume" [0, 255] 220 //speak大小
integer: "Mic Volume" [0, 255] 225 //mic大小
integer: "ADCL Volume" [0, 255] 225
other[1]: "Playback Mute"
integer: "AGC OBSERVE Gain" [0, 31] 31
integer: "AGC PGAIN MAX Volume" [0, 7] 7
integer: "AGC PGAIN MIN Volume" [0, 7] 0
integer: "AGC RANGE MAX Threshold" [0, 32767] 16422
integer: "AGC RANGE MIN Threshold" [0, 32767] 8294
other[1]: "AGC Switch"
integer: "ALCL Volume" [0, 31] 6
integer: "DACL Volume" [0, 255] 220
integer: "HPOUTL Volume" [0, 4] 0
integer: "MICL Volume" [0, 3] 3
example:
cmd_alsa set_ctl card=hw:0 ctl="Master Playback Volume" value=230