Skip to main content

X2000 Webrtc回声消除调试pc环境

一 概述

该测试环境硬件需要amic回采电路,通过amic硬件回采以及dmic录⾳进⾏消回声(aec),当开发板与PC连接时,可以在PC上通过应用工具(普通播放器、音频处理软件等)控制开发板的icodec播放、dmic录音及amic回采,并且能够实时地观察到基于回声消除算法库(Webrtc)处理后的回声消除效果.

二 配置

2.1 回声消除相关demo

代码文件位置libmedia/test/main_webrtc_uac_aec_cc_test.c

1

2.2 播放、录⾳与回读功能

声卡驱动配置

2

amic作为硬件回采

  • 关闭偏置电压
  • 偏置电压寄存器设置为0
  • MICL模拟增益设置为0
  • ALCL模拟增益推荐14

dmic作为录音设备

13

创建声卡设备

3

2.3 buildroot配置

bhu@bhu-PC:~/work/buildroot/buildroot24$ make menuconfig

编译webrtc库需要工具链gcc1210

4

2.4 kernel uac 配置

bhu@bhu-PC:~/work/kernel/kernel$ make menuconfig

5

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_aec_cc_test.c

# arecord -l
**** List of CAPTURE Hardware Devices ****
card 0: dmicsoundcard [dmic-sound-card], device 0: x2000 DMIC snd-soc-dummy-dai-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0
card 1: icodecsoundcard [icodec-sound-card], device 0: x2000 icodec pcm ingenic-icodec-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0
card 2: UAC2Gadget [UAC2_Gadget], device 0: UAC2 PCM [UAC2 PCM]
Subdevices: 1/1
Subdevice #0: subdevice #0
# aplay -l
**** List of PLAYBACK Hardware Devices ****
card 1: icodecsoundcard [icodec-sound-card], device 0: x2000 icodec pcm ingenic-icodec-0 []
Subdevices: 1/1
Subdevice #0: subdevice #0
card 2: UAC2Gadget [UAC2_Gadget], device 0: UAC2 PCM [UAC2 PCM]
Subdevices: 1/1
Subdevice #0: subdevice #0

7

8

修改完后重新编译测试demo

3.3 运行测试demo

webrtc_uac_aec_cc_test 48000        //48000为采样率

此处的采样率与uac设备配置脚本的采样率需要保持一致,变更时需要同时变更

3.4 pc端调试

Audacity配置

运行应用Audacity,选择录制设备为模拟UAC设备,录制声道数为3,采样率相应设置为48000Hz

9

设置完开始录制,打开任意音频文件选择该模拟UAC设备播放,测试回声消除效果

10

由上到下,

第一行为回声消除后的音频数据,

第二行为实际录制到的音频数据,

第三行为回采到的音频数据(即模拟UAC设备播放的音频文件)