Rockchip · AI & Linux Hub

Android 与 BSP

Rockchip Android 3A 模块开发指南

Rockchip Android 3A 模块开发指南 — V1.0.0

· ArmSoM Editorial · Rockchip source documentation · 22 分钟阅读

依据 RK-KF-YF-793 V1.0.0中文原稿,完整保留编译、启用、参数和故障处理四章。原稿适用表标注所有芯片、所有内核版本,这是原稿范围说明,不是当前兼容性承诺。只有中文来源,没有英文原图;等宽字符通路图作为可编辑代码保留,同时附中文 PDF 的原始图形区域,外语不伪称已本地化。移除封面法律、受众、修订及重复目录,不删技术参数。未执行命令、录音或硬件测试。

校对说明:跨页代码/表格已接续,UUID 内的 PDF 折行已合并,4.1 标题末字已恢复。原表 attenuate_time 和 DOA 五项说明本来为空,保持空白;supEnergy2 的说明原写“点1”,fRk1/fRk2 原写扩张段且无效,HardThreshold/PrioriRatio 等大小写按原文保留,不猜改算法含义。源码注释、UUID、参数名、日志及原示例中的省略号保留原样。安全:adb root/remount 和 setenforce 0 仅用于获授权的调试设备;后者会关闭 SELinux 强制执行,应在测试后恢复策略。音频 dump 可能包含私人录音,应限制访问并按需清理。

1. 编译

1.1 确认项目 BoardConfig.mk 位置

BoardConfig.mk 的位置与芯片型号和 lunch 时选择的 product 有关比如芯片名称为 rk3588 , product 为 rk3588_u

# echo $TARGET_PRODUCT
# rk3588_u

则 BoardConfig.mk 的位置为 device/rockchip/rk3588/rk3588_u/BoardConfig.mk

1.2 添加编译开关

在项目的 BoardConfig.mk 添加下面的编译开关, 确保 hardware/rockchip/audio/preprocess 被编译

BOARD_USE_AUDIO_PREPROCESS := true

2. 启用

2.1 声明音效

修改 frameworks/av/media/libeffects/data/audio_effects.xml , 声明如下音效合集

<libraries>
    <!-- 保留已有内容, 添加下面的配置项 -->
    <library name="rkpreprocess" path="librkpreprocess.so"/>
</libraries>
<effects>
    <!-- 保留已有内容, 添加下面的配置项 -->
    <effect name="preproc_aec_normal" library="rkpreprocess" uuid="bb392ec0-8d4d-11e0-a896-0002a5d5c51b"/>
    <effect name="preproc_aec_delay" library="rkpreprocess" uuid="55fa4ede-4adb-45fe-80b9-0002a5d5c51b"/>
    <effect name="preproc_aec_array_reset" library="rkpreprocess"
uuid="49cd17f2-819f-4acd-9541-0002a5d5c51b"/>
    <effect name="preproc_bf_fast_aec" library="rkpreprocess" uuid="b5bfc822-0b26-4230-adcb-0002a5d5c51b"/>
    <effect name="preproc_bf_wakeup" library="rkpreprocess" uuid="9ed2a703-5336-4a49-9bbf-0002a5d5c51b"/>
    <effect name="preproc_bf_dereverb" library="rkpreprocess" uuid="bd266323-f95b-4c4f-ab34-0002a5d5c51b"/>
    <effect name="preproc_bf_nlp" library="rkpreprocess" uuid="53e4a6d1-4e6b-4421-afbc-0002a5d5c51b"/>
    <effect name="preproc_bf_aes" library="rkpreprocess" uuid="3ad36ef7-2f2a-42cc-afa3-0002a5d5c51b"/>
    <effect name="preproc_bf_agc" library="rkpreprocess" uuid="aa8130e0-66fc-11e0-bad0-0002a5d5c51b"/>
    <effect name="preproc_bf_anr" library="rkpreprocess" uuid="20b2732e-28e9-4b6b-968a-0002a5d5c51b"/>
    <effect name="preproc_bf_gsc" library="rkpreprocess" uuid="19d4a390-7e23-488b-8568-0002a5d5c51b"/>
    <effect name="preproc_bf_gsc_method" library="rkpreprocess" uuid="79dbccc7-d690-4ed3-be87-0002a5d5c51b"/>
    <effect name="preproc_bf_fix" library="rkpreprocess" uuid="8e8fe0d9-e335-4a75-847a-0002a5d5c51b"/>
    <effect name="preproc_bf_dtd" library="rkpreprocess" uuid="97ef38d0-9346-48d3-aeed-0002a5d5c51b"/>
    <effect name="preproc_bf_cng" library="rkpreprocess" uuid="c0c12199-fccb-45a0-a912-0002a5d5c51b"/>
    <effect name="preproc_bf_eq" library="rkpreprocess" uuid="5f4428b2-6827-4a06-842f-0002a5d5c51b"/>
    <effect name="preproc_bf_chn_select" library="rkpreprocess" uuid="874978b4-1b82-470f-be80-0002a5d5c51b"/>
    <effect name="preproc_bf_howling" library="rkpreprocess" uuid="22075603-4d9d-40a6-bfac-0002a5d5c51b"/>
    <effect name="preproc_bf_doa" library="rkpreprocess" uuid="50404545-a180-40ad-a8f4-0002a5d5c51b"/>
    <effect name="preproc_bf_wind" library="rkpreprocess" uuid="2b8fea18-547e-4af7-85c9-0002a5d5c51b"/>
    <effect name="preproc_bf_ainr" library="rkpreprocess" uuid="a2913959-f123-43bc-ad9c-0002a5d5c51b"/>
    <effect name="preproc_rx_anr" library="rkpreprocess" uuid="9b6b4c6f-9fba-453b-9f33-0002a5d5c51b"/>
    <effect name="preproc_rx_howling" library="rkpreprocess" uuid="f55efb11-dc37-4844-a160-0002a5d5c51b"/>
    <effect name="preproc_ref_hw" library="rkpreprocess" uuid="b95396ba-60ed-424d-8ec7-0002a5d5c51b"/>
    <effect name="preproc_ref_sw_dlp" library="rkpreprocess" uuid="7583028a-e283-4cb5-9c0f-0002a5d5c51b"/>
    <effect name="preproc_ref_sw_alp_playback" library="rkpreprocess"
uuid="d3cb7c9b-79a1-4a84-b26c-0002a5d5c51b"/>
    <effect name="preproc_ref_sw_alp_capture" library="rkpreprocess"
uuid="4f7f9f58-122b-4dc6-831d-0002a5d5c51b"/>
</effects>

2.2 启用音效

音效的详细介绍请参考 Rockchip_Developer_Guide_Microphone_Array_Tuning.pdf启用音效之前, 需要修改以下两处:

1) 修改 tinyalsa_hal 录音时的帧长为 16ms, 向下取整

period_size = (int)(rate * 0.016 / 4) * 4

比如采样率 48000, period_size = (int)(48000 * 0.016 / 4) * 4 = 768比如采样率 44100, period_size = (int)(44100 * 0.016 / 4) * 4 = 704确认后修改对应的 pcm confighardware/rockchip/audio/tinyalsa_hal/audio_hw.c

static struct pcm_config pcm_config_in = {
    // ...
    .rate = 48000,
    .period_size = 768,
};

2) 修改 MIC 通道数

确认 MIC 通道数后修改下面的配置, 比如 2 channel MIChardware/rockchip/audio/tinyalsa_hal/audio_hw.c

#define PCM_CAPTURE_CHANNELS 2

单 MIC 目前是以 2 channel 来处理

2.2.1 AEC

effect 说明
preproc_aec_normal AEC 模块
preproc_aec_delay AEC 延时估计子模块
preproc_aec_array_reset AEC 输入音频通道顺序重排功能
preproc_ref_hw 硬回采
preproc_ref_sw_dlp 软回采 DLP 方式
preproc_ref_sw_alp_playback 软回采 Aloop 数据缓存
preproc_ref_sw_alp_capture 软回采 Aloop 数据获取

AEC 需要回采信号 (参考信号) 来消除回声, 因此需要根据音频通路或拓扑来配置

1) 硬回采如下图示: [L1][R1]… 表示回采数据, 在 SPK 的前级回环到某个音频接口 (CPU DAI1); [L2][R2]… 表示 MIC数据

HAL                 | Kernel                             | Hardware
                    |                                    |
                    |                      +----------+  |
+----------------+  | [L1][R1]...          | CPU DAI0 |  |               +-----+
| Output Stream  *------------------------>*          *----\------------>* SPK |
+----------------+  |                      +----------+  |  \            +-----+
                    |                                    |  |(Wired)
                    |                      +----------+  |  |
+----------------+  | [L2][R2][L1][R1]...  | CPU DAI1 |  |  v [L2][R2]...+-----+
| Input Stream   *<========================*          *<====+<-----------* MIC |
+----------------+  |                      +----------+  |               +-----+
                    |                                    |

Audio

HAL                 | Kernel                             | Hardware
                    |                                    |
                    |                      +----------+  |
+----------------+  | [L1][R1]...          | CPU DAI0 |  |               +-----+
| Output Stream  *------------------------>*          *----\------------>* SPK |
+----------------+  |                      +----------+  |  \            +-----+
                    |                                    |  |
                    |                     +------------+ |  |(Wired)
                    |                     | Combo DAI  | |  |
                    |                     |+----------+| |  |
                    |                     || CPU DAI1 || |  /
                    |                     ||          *<---/
+----------------+  | [L2][R2][L1][R1]... |+----------+| |
| Input Stream   *<=======================*            | |
+----------------+  |                     |+----------+| |
                    |                     || CPU DAI2 || |    [L2][R2]...+-----+
                    |                     ||          *<-----------------* MIC |
                    |                     |+----------+| |               +-----+
                    |                     +------------+ |

Audio

Audio

修改回采通道数, 比如 2 channel 回采hardware/rockchip/audio/tinyalsa_hal/audio_hw.c

#define PCM_REFERENCE_CHANNELS 2

修改 frameworks/av/media/libeffects/data/audio_effects.xml , 绑定对应的流到下面的音效

<!-- 如果没有声明 preprocess, 则直接添加下面的配置, 并忽略下面的注释 -->
<preprocess>
    <stream type="mic">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_aec_normal"/>
        <apply effect="preproc_ref_hw"/>
    </stream>
    <stream type="voice_communication">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_aec_normal"/>
        <apply effect="preproc_ref_hw"/>
    </stream>
</preprocess>

2) 软回采 DLP 方式适用于播放和录音用同一个 cpu dai如下图示: [L1][R1]… 表示回采数据, 缓存到 DLP; [L2][R2]… 表示 MIC 数据

HAL                 | Kernel                             | Hardware
                    |                                    |
                    |                      +----------+  |
+----------------+  | [L1][R1]...          | CPU DAI0 |  |
| Output Stream  *-------------------------*---\      |  |
+----------------+  |                      |    \     |  |
                    |                      |    |(DLP)|  |
+----------------+  | [L2][R2][L1][R1]...  |    v     |  |  [L2][R2]...  +-----+
| Input Stream   *<========================*====+<----*------------------* MIC |
+----------------+  |                      |          |  |               +-----+
                    |                      +----------+  |

Audio

修改 kernel 配置, 编译 DLP

CONFIG_SND_SOC_ROCKCHIP_DLP_PCM

修改 dts 配置, 在对应的 cpu dai 上使能 DLP

&i2s {
        rockchip,digital-loopback;
};

cpu dai 可以是: i2s0_8ch, i2s1_8ch, i2s2_2ch, i2s3_2ch, sai0, sai1 等等修改通路配置, 在 tinyalsa_hal 增加对应的通路配置不同的声卡名对应不同通路配置文件, 通过 sound_card_config_list 确认, 没有匹配则使用默认的default_config.h比如 2 channel mic + 2 channel 回采

diff --git a/tinyalsa_hal/codec_config/default_config.h
b/tinyalsa_hal/codec_config/default_config.h
index a554492..114e3d2 100755
--- a/tinyalsa_hal/codec_config/default_config.h
+++ b/tinyalsa_hal/codec_config/default_config.h
@@ -198,6 +202,10 @@ const struct config_control
default_main_mic_capture_controls[] = {
         .ctl_name = "Capture MIC Path",
         .str_val = "Main Mic",
     },
+    {
+        .ctl_name = "Software Digital Loopback Mode",
+        .str_val = "4CH: 2 Mics + 2 Loopbacks",
+    },
 };

 const struct config_control default_hands_free_mic_capture_controls[] = {

总共有以下几个选项, 根据对应的 MIC 通道数和回采通道数配置即可

static const char *const dlp_text[] = {
        "Disabled",
        "2CH: 1 Loopback + 1 Mic",
        "2CH: 1 Mic + 1 Loopback",
        "2CH: 1 Mic + 1 Loopback-mixed",
        "2CH: 2 Loopbacks",
        "4CH: 2 Mics + 2 Loopbacks",
        "4CH: 2 Mics + 1 Loopback-mixed",
        "4CH: 4 Loopbacks",
        "6CH: 4 Mics + 2 Loopbacks",
        "6CH: 4 Mics + 1 Loopback-mixed",
        "6CH: 6 Loopbacks",
        "8CH: 6 Mics + 2 Loopbacks",
        "8CH: 6 Mics + 1 Loopback-mixed",
        "8CH: 8 Loopbacks",
        "10CH: 8 Mics + 2 Loopbacks",
        "10CH: 8 Mics + 1 Loopback-mixed",
        "16CH: 8 Mics + 8 Loopbacks",
};

修改回采通道数, 比如 2 channel 回采hardware/rockchip/audio/tinyalsa_hal/audio_hw.c

#define PCM_REFERENCE_CHANNELS 2

修改 frameworks/av/media/libeffects/data/audio_effects.xml , 绑定对应的流到下面的音效

<!-- 如果没有声明 preprocess, 则直接添加下面的配置, 并忽略下面的注释 -->
<preprocess>
    <stream type="mic">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_aec_normal"/>
        <apply effect="preproc_ref_sw_dlp"/>
    </stream>
    <stream type="voice_communication">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_aec_normal"/>
        <apply effect="preproc_ref_sw_dlp"/>
    </stream>
</preprocess>

3) 软回采 Aloop 方式适用于播放和录音不在同一个 cpu dai如下图示: [L1][R1]… 表示回采数据, 缓存到 Aloop; [L2][R2]… 表示 MIC 数据MIC 数据和回采数据最终在 Step#4 中拼接

HAL                 | Kernel                             | Hardware
                    |                                    |
  <Far End In>      |                      +----------+  |
+------*---------+  | [L1][R1]...          | CPU DAI0 |  |               +-----+
| Output Stream  *------------------------>*          *----------------->* SPK |
+------*---------+  |                      +----------+  |               +-----+
       | Step#1     |                                    |
       |[L1][R1]... |                                    |
       v            |                                    |
+------*--------+   |                      +----------+  |
|               |   |                      | Aloop    |  |
|(optional pre  *------------------------->* Playback |  |
|  resampler)   |   |                      | PCM      |  |
+---------------+   |                      +----------+  |
                    |                        |#cable0    |
                    |                        |           |
                    |                        v           |
+---------------+   |                      +-*--------+  |
|               |   | Step#2               | Aloop    |  |
|(optional post *<-------------------------* Capture  |  |
|  resampler)   |   |                      | PCM      |  |
+-----*-*-------+   |                      +----------+  |
Step#4| ^ Step#3    |                                    |
<AEC> | |[L2][R2]...|                                    |
      v |           |                      +----------+  |            <Near End>
+-----*-*--------+  | Step#2'              | CPU DAI1 |  |  [L2][R2]...  +-----+
| Input Stream   *<------------------------*          *<-----------------* MIC |
+-----*----------+  |                      +----------+  |               +-----+
  <Far End Out>     |                                    |

Audio

修改 kernel 配置, 编译 Aloop

CONFIG_SND_DRIVERS
CONFIG_SND_ALOOP

修改回采通道数不需配置回采通道数 (因为 Aloop 方式默认 2 channel)hardware/rockchip/audio/tinyalsa_hal/audio_hw.c

#define PCM_REFERENCE_CHANNELS 0

修改 frameworks/av/media/libeffects/data/audio_effects.xml , 绑定对应的流到下面的音效

<!-- 如果没有声明 preprocess, 则直接添加下面的配置, 并忽略下面的注释 -->
<preprocess>
    <stream type="mic">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_aec_normal"/>
        <apply effect="preproc_ref_sw_alp_capture"/>
    </stream>
    <stream type="voice_communication">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_aec_normal"/>
        <apply effect="preproc_ref_sw_alp_capture"/>
    </stream>
</preprocess>

<!-- 如果没有声明 postprocess, 则直接添加下面的配置, 并忽略下面的注释 -->
<postprocess>
    <stream type="voice_call">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_ref_sw_alp_playback"/>
    </stream>
</postprocess>

2.2.2 BF

effect 说明
preproc_bf_fast_aec BF 线性残留回声消除模块, 该功能用于唤醒通路进一步消除回声
preproc_bf_wakeup BF 唤醒模块
preproc_bf_dereverb BF 去混响模块
preproc_bf_nlp BF 非线性残留回声消除模块, 该功能用于通话通路进一步消除回声
(该模块已弃用)
preproc_bf_aes BF 非线性残留回声消除模块
preproc_bf_agc BF 自动增益控制模块
preproc_bf_anr BF 噪声抑制模块
preproc_bf_gsc BF 波束后滤波模块, 用于进一步消除噪声, 视实际效果决定是否打开
preproc_bf_gsc_method BF 关闭则GSC采用LMS方法, 打开GSC采用RLS方法, RLS算力高于
LMS算法
preproc_bf_fix BF 启用固定方向波束
preproc_bf_dtd BF 单双讲检测模块
preproc_bf_cng BF 舒适度噪声模块
preproc_bf_eq BF EQ调节模块
preproc_bf_chn_select BF 用于定制化扩展 MIC 需求场景
preproc_bf_howling BF 去啸叫模块, 视实际场景需求决定是否打开
preproc_bf_doa BF 声源定位模块, 用于估计声源方向, 视实际场景需求决定是否打开
preproc_bf_wind BF 去⻛噪模块, 视实际场景需求决定是否打开
preproc_bf_ainr BF AI降噪模块, 若开启该模块则ANR模块将强制关闭

如果需要开 preproc_bf_fast_aec 和 preproc_bf_aes, 需要先配置 AEC 相关修改 frameworks/av/media/libeffects/data/audio_effects.xml , 绑定对应的流到下面的音效

1) BF 用于唤醒推荐音效如下

<!-- 如果没有声明 preprocess, 则直接添加下面的配置, 并忽略下面的注释 -->
<preprocess>
    <stream type="mic">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_bf_wakeup"/>
        <apply effect="preproc_bf_fast_aec"/>
        <apply effect="preproc_bf_dtd"/>
        <apply effect="preproc_bf_agc"/>
    </stream>
    <stream type="voice_communication">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_bf_wakeup"/>
        <apply effect="preproc_bf_fast_aec"/>
        <apply effect="preproc_bf_dtd"/>
        <apply effect="preproc_bf_agc"/>
    </stream>
</preprocess>

2) BF 用于语音通话推荐音效如下

<!-- 如果没有声明 preprocess, 则直接添加下面的配置, 并忽略下面的注释 -->
<preprocess>
    <stream type="mic">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_bf_fast_aec"/>
        <apply effect="preproc_bf_dtd"/>
        <apply effect="preproc_bf_aes"/>
        <apply effect="preproc_bf_anr"/>
        <apply effect="preproc_bf_agc"/>
        <apply effect="preproc_bf_dereverb"/>
    </stream>
    <stream type="voice_communication">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_bf_fast_aec"/>
        <apply effect="preproc_bf_dtd"/>
        <apply effect="preproc_bf_aes"/>
        <apply effect="preproc_bf_anr"/>
        <apply effect="preproc_bf_agc"/>
        <apply effect="preproc_bf_dereverb"/>
    </stream>
</preprocess>

3) 根据需要绑定其他的音效

2.2.3 RX

effect 说明
preproc_rx_anr 噪声抑制模块, 视实际场景需求决定是否打开
preproc_rx_howling 去啸叫模块, 视实际场景需求决定是否打开

修改 frameworks/av/media/libeffects/data/audio_effects.xml , 绑定对应的流到下面需要的音效

<!-- 如果没有声明 preprocess, 则直接添加下面的配置, 并忽略下面的注释 -->
<preprocess>
    <stream type="mic">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_rx_anr"/>
        <apply effect="preproc_rx_howling"/>
    </stream>
    <stream type="voice_communication">
        <!-- 保留已有内容, 添加下面的配置项 -->
        <apply effect="preproc_rx_anr"/>
        <apply effect="preproc_rx_howling"/>
    </stream>
</preprocess>

2.3 验证

1) 确认是否已经注册到 AudioFlinger通过 dumpsys media.audio_flinger 确认

# dumpsys media.audio_flinger
[...]
Libraries loaded:
 [...]
 Library rkpreprocess
  path: /vendor/lib/soundfx/librkpreprocess.so
  Aloop Capture / Rockchip Electronics Co. Ltd.
    UUID: 4f7f9f58-122b-4dc6-831d-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  Aloop Playback / Rockchip Electronics Co. Ltd.
    UUID: d3cb7c9b-79a1-4a84-b26c-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820204
  Digital Loopback / Rockchip Electronics Co. Ltd.
    UUID: 7583028a-e283-4cb5-9c0f-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  HW Loopback / Rockchip Electronics Co. Ltd.
    UUID: b95396ba-60ed-424d-8ec7-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  RX HOWLING / Rockchip Electronics Co. Ltd.
    UUID: f55efb11-dc37-4844-a160-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  RX ANR / Rockchip Electronics Co. Ltd.
    UUID: 9b6b4c6f-9fba-453b-9f33-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  BF AINR / Rockchip Electronics Co. Ltd.
    UUID: a2913959-f123-43bc-ad9c-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  BF WIND / Rockchip Electronics Co. Ltd.
    UUID: 2b8fea18-547e-4af7-85c9-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  BF DOA / Rockchip Electronics Co. Ltd.
    UUID: 50404545-a180-40ad-a8f4-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
BF HOWLING / Rockchip Electronics Co. Ltd.
  UUID: 22075603-4d9d-40a6-bfac-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF CHN Select / Rockchip Electronics Co. Ltd.
  UUID: 874978b4-1b82-470f-be80-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF EQ / Rockchip Electronics Co. Ltd.
  UUID: 5f4428b2-6827-4a06-842f-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF CNG / Rockchip Electronics Co. Ltd.
  UUID: c0c12199-fccb-45a0-a912-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF DTD / Rockchip Electronics Co. Ltd.
  UUID: 97ef38d0-9346-48d3-aeed-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF FIX / Rockchip Electronics Co. Ltd.
  UUID: 8e8fe0d9-e335-4a75-847a-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF GSC Method / Rockchip Electronics Co. Ltd.
  UUID: 79dbccc7-d690-4ed3-be87-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF GSC / Rockchip Electronics Co. Ltd.
  UUID: 19d4a390-7e23-488b-8568-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF ANR / Rockchip Electronics Co. Ltd.
  UUID: 20b2732e-28e9-4b6b-968a-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF AGC / Rockchip Electronics Co. Ltd.
  UUID: aa8130e0-66fc-11e0-bad0-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF AES / Rockchip Electronics Co. Ltd.
  UUID: 3ad36ef7-2f2a-42cc-afa3-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
  apiVersion: 00020000
  flags: 00820203
BF NLP / Rockchip Electronics Co. Ltd.
  UUID: 53e4a6d1-4e6b-4421-afbc-0002a5d5c51b
  TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  BF De-Reverberation / Rockchip Electronics Co. Ltd.
    UUID: bd266323-f95b-4c4f-ab34-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  BF Wakeup / Rockchip Electronics Co. Ltd.
    UUID: 9ed2a703-5336-4a49-9bbf-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  BF Fast AEC / Rockchip Electronics Co. Ltd.
    UUID: b5bfc822-0b26-4230-adcb-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  AEC Array Reset / Rockchip Electronics Co. Ltd.
    UUID: 49cd17f2-819f-4acd-9541-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  AEC Delay / Rockchip Electronics Co. Ltd.
    UUID: 55fa4ede-4adb-45fe-80b9-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
  AEC Normal / Rockchip Electronics Co. Ltd.
    UUID: bb392ec0-8d4d-11e0-a896-0002a5d5c51b
    TYPE: 34805d32-2e6d-4d1e-9296-0002a5d5c51b
    apiVersion: 00020000
    flags: 00820203
[...]

2) 确认是否能正常绑定到对应的 stream录音或语音, 通过 dumpsys media.audio_flinger 确认以语音, 软回采 Aloop 为例

<preprocess>
    <stream type="voice_communication">
        <apply effect="preproc_aec_normal"/>
        <apply effect="preproc_bf_fast_aec"/>
        <apply effect="preproc_bf_aes"/>
        <apply effect="preproc_bf_anr"/>
        <apply effect="preproc_bf_dereverb"/>
        <apply effect="preproc_rx_anr"/>
        <apply effect="preproc_ref_sw_alp_capture"/>
    </stream>
</preprocess>

<postprocess>
    <stream type="voice_call">
        <apply effect="preproc_ref_sw_alp_playback"/>
    </stream>
</postprocess>
# dumpsys media.audio_flinger
[...]
Output thread 0xb40000784395ba60, name AudioOut_D, tid 642, type 0 (MIXER):
  I/O handle: 13
  Standby: no
  [...]
  1 Effect Chains
    1 effects for session 249
        In buffer    Out buffer                           Active tracks:
        0x78439e0000   0x7843d34000 -> 0xb400007730317020   1
        Effect ID 75:
                [...]
                - UUID: d3cb7c9b-79a1-4a84-b26c-0002a5d5c51b
                [...]
                - name: Aloop Playback
                [...]
  [...]
[...]
Input thread 0xb40000784388dc60, name AudioIn_2E, tid 6501, type 3 (RECORD):
  I/O handle: 30
  Standby: no
  [...]
  1 Effect Chains
    7 effects for session 257
        In buffer    Out buffer         Active tracks:
        nullptr   nullptr   0
        Effect ID 139:
                [...]
                - UUID: bb392ec0-8d4d-11e0-a896-0002a5d5c51b
                [...]
                - name: AEC Normal
                [...]
        Effect ID 147:
                [...]
                - UUID: b5bfc822-0b26-4230-adcb-0002a5d5c51b
                [...]
                - name: BF Fast AEC
                [...]
        Effect ID 155:
                [...]
                - UUID: 3ad36ef7-2f2a-42cc-afa3-0002a5d5c51b
                [...]
                - name: BF AES
                [...]
        Effect ID 163:
                [...]
                - UUID: 20b2732e-28e9-4b6b-968a-0002a5d5c51b
                [...]
                - name: BF ANR
                [...]
        Effect ID 171:
                [...]
                - UUID: bd266323-f95b-4c4f-ab34-0002a5d5c51b
                [...]
                - name: BF De-Reverberation
                [...]
        Effect ID 179:
                [...]
                - UUID: 9b6b4c6f-9fba-453b-9f33-0002a5d5c51b
                [...]
                - name: RX ANR
                [...]
        Effect ID 187:
                [...]
                - UUID: 4f7f9f58-122b-4dc6-831d-0002a5d5c51b
                [...]
                - name: Aloop Capture
                [...]
  [...]
[...]

3. 参数

默认配置保存在 rkaudio_effect_preprocess.xmlSDK 默认保存到 hardware/rockchip/audio/preprocess/出厂默认 install 到设备的 /vendor/etc/

3.1 参数说明

参考文档 Rockchip_Developer_Guide_Microphone_Array_Tuning.pdf集成后参数默认保存到 rkaudio_effect_preprocess.xml, 以下说明均围绕文档和此 xml 来讨论

3.2 参数设置

3.2.1 AEC 模块参数

属性 说明
pos 回采通道所在位置, 0 为回采通道位于mic数据最前面,1 则在最后面
drop_ref_channel 不处理的回采通道数
delay_len 延迟估计不开时为默认硬回采延迟点, 延迟估计打开时为起始延迟估计点
look_ahead 缓存⻨克⻛端数据⻓度, 除非已知采集⻨克⻛信号晚于回采信号可配置, 其余
情况默认置0
filter_len 配置线性AEC滤波器⻓度, 设置越⻓对于回声估计越准确, 但收敛速度相应越
慢且算力越大. 一般可配置为2/4/6/8
Array_list 配置音频通道顺序, 生效需要启用 preproc_aec_array_reset

延时估计子模块参数设置 (生效需要启用 preproc_aec_delay)

属性 说明
max_frame 延时估计最⻓估计帧数, 一般场景建议设为16
least_delay 延时估计最短估计帧数, MaxFrame没有特别大时建议设为0
jump_frame 初始跳过帧数, 一般设为12
delay_offset offset帧数, 用于防止延时估计过大导致⻨克⻛信号晚于回采信号, 一般设为1
mic_amp_thr mic端最小能量阈值, 低于该值不更新延时估计结果, 一般设为50
ref_amp_thr ref端最小能量阈值, 低于该值不更新延时估计结果, 一般设为50
start_freq 延时估计起始频段的频率, 一般选择语音集中频段, 根据实际收音效果调整, 一般
设为500
end_freq 延时估计终止频段的频率, 一般选择语音集中频段, 根据实际收音效果调整, 一般
设为4000
smooth_factor 平滑系数, 一般取值为[0.95,1), 越高延时估计结果越稳定, 越低延时估计结果更
新越快, 一般设为0.97/0.99

3.2.2 BF 模块参数

属性 说明
ref_pos 回采通道所在位置, 0 为回采通道位于mic数据最前面,1 则在最后面
targ 当 preproc_bf_fix 开启时, 设置拾音方向
drop_ref_channel 不处理的回采通道数

1) AES 模块参数设置 (生效需要启用 preproc_bf_aes)

属性 说明
beta_up 上升速度, 该值越大则非线性抑制越强, 建议0.001-0.01之间
beta_down 下降速度, 该值越大则非线性抑制越弱, 建议0.001-0.01之间
beta_up_low 低频段上升速度, 特性以及取值同 beta_up
beta_down_low 低频段下降速度, 特性以及取值同 beta_down
low_freq 低频分段
high_freq 高频分段
thd_flag 置 1 开启谐波失真抑制, 置 0 则关闭
hard_flag 置 1 开启 Hard 模式, 对于回声消除抑制更强, 但也有可能造成语音过消
limit_ratio_0 表示各频段残留回声的比例最小值, 一般建议取值范围[1.0f, 5.0f], 设置越大,
回声消除效果越强. 3列分别对应低频分段、中频分段、高频分段(由上面
的 low_freq 以及 high_freq 设置
limit_ratio_1 表示各频段消除残留回声的比例, 一般建议取值范围[1.0f, 3.0f], 设置越大,
回声消除效果越强. 3列分别对应低频分段、中频分段、高频分段(由上面
的 low_freq 以及 high_freq 设置
thd_split_freq_0 谐波抑制频段, 不需要时该行可以全置 0. 每一行表示一个频段, 第一列表示
频段起始点, 第二列表示频段终止点. 取值范围均为[0,1/2 * sample rate]
thd_split_freq_1 同上
thd_split_freq_2 同上
thd_split_freq_3 同上
thd_sup_degree_0 谐波抑制程度, 对应上表的频段, 配置的对应消除比例, 当上面有全 0 行时,
该表对应行的设置也将无效. 从第一列到最后一列分别表示频段内有可能成
为二次到十一次谐波时消除相应基频的比例, 一般建议取值范 [0.001f,1.0f],
设置越大, 消除效果越强
thd_sup_degree_1 同上
thd_sup_degree_2 同上
thd_sup_degree_3 同上
hard_split_freq_0 配置为Hard模式的频段以及计算平均增益的频段, 第一列表示起始, 第二列
表示终止, 取值范围均为 [0,1/2*sample rate], 配置为Hard模式的频段最多
设置4个, 最后一行为计算平均增益的频段, 该频段将在下一个参数
HardThreshold中进行使用
hard_split_freq_1 同上
hard_split_freq_2 同上
hard_split_freq_3 同上
hard_split_freq_4 同上
hard_threshold Hard模式开启阈值, 4个阈值分别对应上个参数配置的4个频段. 使用平均增
益频段和该参数配置的阈值进行对比, 当平均增益低于阈值时, 对应的频段
会开启Hard模式

2) AGC 模块参数设置 (生效需要启用 preproc_bf_agc)

属性 说明
attack_time 建议范围:20~600ms. 触发时间, 即AGC增益上升所需要的时间
release_time 建议范围:20~600ms. 施放时间, 即AGC增益下降所需要的时间
attenuate_time  
max_gain 建议范围:0~50dB. 最大增益, 同时也是线性段增益
max_peak 取值范围:0~-87dB. 经AGC处理后, 输出语音的最大能量
fRth0 取值范围:0~-87dB. 噪声⻔阈值, 低于该值的语音不被增益
fRth1 取值范围:0~-87dB. 扩张段结束能量dB阈值, 高于该值的语音以max_gain增
益
fRth2 取值范围:0~-87dB. 压缩段起始能量dB阈值, 高于该值的语音增益逐渐下降至
0dB
fRk0 扩张段斜率
fRk1 扩张段斜率 (无效参数)
fRk2 扩张段斜率 (无效参数)
fLineGainDb 线性段提升dB数 (无效参数)
swSmL0 扩张段时域平滑点数 (无效参数)
swSmL1 线性段时域平滑点数 (无效参数)
swSmL2 压缩段时域平滑点数 (无效参数)

3) ANR 模块参数设置 (生效需要启用 preproc_bf_anr)

属性 说明
noiseFactor 噪声估计水平, 一般取值范围在[0.5f,1.5f], 越大噪声消除越干净
swU 噪声估计帧⻓时间片, 一般取值范围[2,20], 设置越大对平稳噪声估计越准确,
对突变噪声收敛越慢;反之对突变噪声收敛越快但容易造成语音过消
psiMin 语音存在概率判断阈值, 取值范围[0.0f,1.0f], , 设置越大, 噪音消除效果越强
psiMax 语音存在概率判断阈值, 取值范围[0.0f,1.0f], 设置越大, 噪音消除效果越强
fGmin 噪声消除最小值, 取值范围[0.0f,1.0f], 设置越小, 噪音消除效果越强
supFreq1 恒频噪声抑制点1, 取值范围[0,1/2*sample rate], 始终抑制设置点噪声
supFreq2 恒频噪声抑制点2, 取值范围[0,1/2*sample rate], 始终抑制设置点噪声
supEnergy1 恒频噪声抑制点1对应的能量阈值, 一般取值100000, 当频点能量超出该值时
会对恒频噪声的估计进行更新
supEnergy2 恒频噪声抑制点1对应的能量阈值, 一般取值100000, 当频点能量超出该值时
会对恒频噪声的估计进行更新
interV 取帧间隔, 一般取值范围[2,20], 设置越大估计的噪声越平稳, 类似swU功能
biasMin 噪声补偿, 一般取值范围[1.0f, 2.0f], 设置越大噪声消除效果越强
updateFrm 快速收敛⻓度, 一般设置为15, 在开头15帧快速收敛
nPreGammaThr 纯噪声概率估计阈值, 一般取值范围 (3.0f,5.0f), 设置越大噪声消除效果越强
nPreZetaThr 纯噪声概率估计阈值, 一般取值范围 (1.0f,3.0f), 设置越大噪声消除效果越强
sabsGammaThr0 语音不存在概率估计阈值, 一般取值范围 (0.5f,1.5f), 设置越大噪声消除效果
越强
sabsGammaThr1 语音不存在概率估计阈值, 一般取值范围 (2.f,4.0f), 设置越大噪声消除效果越
强
infSmooth 输入信号平滑系数, 取值范围(0.0f,1.0f)
probSmooth 语音存在概率平滑系数, 取值范围(0.0f,1.0f)
compCoeff 噪声补偿, 一般取值范围[1.0f, 2.0f], 对于低于平均噪声估计的频段进行补偿,
设置越大噪声消除效果越强
prioriMin 先验信噪比最小值, 取值范围(0.0f, 0.5f), 设置越大噪声消除效果越弱
postMax 后验信噪比最大值, 一般设为40
prioriRatio 先验信噪比平滑系数, 取值范围(0.0f,1.0f), 设置越大噪声消除效果越强
prioriRatioLow 先验信噪比平滑系数, 取值范围(0.0f,1.0f), 设置越大噪声消除效果越强
splitBand 分频段index, 取值范围[0,32], 对于低于该index的先验信噪比用
PrioriRatioLow进行平滑, 反之用PrioriRatio
prioriSmooth 先验信噪比平滑系数, 取值范围(0.0f,1.0f), 设置越大噪声消除效果越强
tranMode 冲击噪声开关, 置0表示关闭, 置1表示使用检测消除方法, 置2表示使用估计消
除方法

4) 去混响模块参数设置 (生效需要启用 preproc_bf_dereverb)

属性 说明
rlsLg RLS滤波器阶数, 用于唤醒模块去混响, 一定范围内, 阶数越大, 去混响效果越强, 算力
消耗越大, 建议取值:4
curveLg 分布曲线阶数, 用于通话模块去混响, 阶数越大, 去混响效果越强, 越容易过消,建议取
值:10
delay RLS滤波器延时, 决定早期混响保留程度, 建议取值:2
forgetting RLS滤波器遗忘因子, 因子越小, rls去混响能力越强, 越容易过消, 建议范围:0.98-
0.999
t60 混响时间估计值(单位:s), 越大, 去混响能力越强, 但是越容易过消除, 低混响场景
建议取值0.68, 中高混响场景建议取值1.5
coCoeff 互相干性调整系数, 防止过消除, 越小能力越强, 低混响场景建议取值2, 中高混响场景
建议取值1

5) 舒适噪声参数设置 (生效需要启用 preproc_bf_cng)

属性 说明
fGain 建议范围:0~50dB, 施加舒适噪声幅度比例, 默认2
fMpy 建议范围:0~50dB, 白噪随机数生成幅度, 默认5
fSmoothAlpha 取值范围:0.0f~1.0f, 施加舒适噪声平滑度, 默认0.92
fSpeechGain 取值范围:0.0f~1.0f, 施加舒适噪声语音纹理模拟程度, 默认0.3

6) DTD 模块参数设置 (生效需要启用 preproc_bf_dtd)

属性 说明
ksiThd_high 单双讲判决阈值, ceil阈值, 高于该阈值判断为单讲
ksiThd_low floor阈值, 低于该阈值判断为单讲

7) DOA 模块参数设置 (生效需要启用 preproc_bf_doa)

属性 说明
rad  
start_freq  
end_freq  
lg_num  
lg_pitch_num  

8) EQ 模块参数设置 (生效需要启用 preproc_bf_eq)

属性 说明
shwParaLen 滤波器系数个数
filter_bank_0 滤波器系数
filter_bank_1 滤波器系数
filter_bank_2 滤波器系数
filter_bank_3 滤波器系数
filter_bank_4 滤波器系数

3.3 参数调试

确保 build 版本是 userdebug确保 PC 可以通过 ADB 连接设备在 PC 端执行以下两个指令

adb root
adb remount

3.3.1 更新参数

修改 rkaudio_effect_preprocess.xml, 并 push 到设备对应的目录

adb push rkaudio_effect_preprocess.xml /vendor/etc/

3.3.2 分析输出

重新开始录音检查效果, 或重新开始语音检查远端输出的效果也可以直接 dump 输入和输出, 分析对应的数据流

setenforce 0
setprop vendor.audio.preproc.debug 1

之后导出并用 audacity 或其他 PC 工具分析以下两个文件

/data/misc/audioserver/preproc_input_xxxhz_xxxch.pcm
/data/misc/audioserver/preproc_output_xxxhz_xxxch.pcm

其中 xxxhz 表示采样率, xxxch 表示声道数使用 audacity 分析时, 依次点击 文件 , 导入 , 原始数据 , 然后修改采样率和声道数即可确认符合效果之后把 rkaudio_effect_preprocess.xml 更新到hardware/rockchip/audio/preprocess/

4. Q&A

4.1 加入 DLP 后, 无法以指定的声道 (MIC + 回采) 录音, 提示参数错误

以 2 channel MIC 和 2 channel 回采为例

# tinycap /sdcard/mic.wav -D xxx -c 4 -r 48000
Unable to open PCM device (cannot set hw params: Invalid argument)
Captured 0 frames

xxx 是 cat /proc/asound/cards 后看到的对应的声卡序号

4.1.1 检查通路设置

(1) 确认是否能正常设置通路

# tinymix -D xxx "Software Digital Loopback Mode" "4CH: 2 Mics + 2 Loopbacks"

如果报错了需要确以下 3 点

Invalid mixer control: Software Digital Loopback Mode

需要确认当前版本的 kernel 是否增加了 DLP 支持, 没有则更新 SDK 或加入补丁

# grep rockchip,digital-loopback -r ./sound/soc/rockchip/
./sound/soc/rockchip/rockchip_sai.c:    if (device_property_read_bool(&pdev->dev,
"rockchip,digital-loopback"))
./sound/soc/rockchip/rockchip_i2s.c:    if (device_property_read_bool(&pdev->dev,
"rockchip,digital-loopback"))
./sound/soc/rockchip/rockchip_i2s_tdm.c:        if
(device_property_read_bool(dev, "rockchip,digital-loopback")) {

需要确认 kernel 是否开启了 DLP

CONFIG_SND_SOC_ROCKCHIP_DLP_PCM

需要在 dts 对应的 cpu dai 上使能 DLP

&i2s {
        rockchip,digital-loopback;
};

cpu dai 可以是: i2s0_8ch, i2s1_8ch, i2s2_2ch, i2s3_2ch, sai0, sai1 等等(2) 确认通路是否生效

# tinymix -D xxx
...
13      ENUM    1       Software Digital Loopback Mode           4CH: 2 Mics + 2
Loopbacks
...

4.1.2 检查声卡相关

确认 dts 绑定的 codec dai driver 是否声明支持 4 channel capture

// ...
demo_sound: demo-sound {
    compatible = "simple-audio-card";
    // ...
    simple-audio-card,codec {
        sound-dai = <&demo>;
    };
    // ...
};

// ...
// 或者
demo_sound: demo-sound {
    compatible = "rockchip,multicodecs-card";
    // ...
    rockchip,codec = <&demo>;
    // ...
};
struct snd_soc_dai_driver demo_dai = {
    // 没有 capture, 或者 channels_max 小于 4 channel, 则说明不支持
    .capture = {
        .channels_min = 1,
        .channels_max = 2,
    },
    // ...
};

如果不支持则可以使用 “rockchip,multicodecs-card”, 同时绑定一个辅助的虚拟 codec

// 修改前 (例1)
#if 0
demo_sound: demo-sound {
    status = "okay";
    compatible = "simple-audio-card";
    simple-audio-card,format = "i2s";
    simple-audio-card,name = "rockchip,demo-codec";
    simple-audio-card,mclk-fs = <256>;
    simple-audio-card,cpu {
        sound-dai = <&i2s>;
    };
    simple-audio-card,codec {
        sound-dai = <&demo>;
    };
};
#endif

// 修改前 (例2)
#if 0
demo_sound: demo-sound {
    status = "okay";
    compatible = "rockchip,multicodecs-card";
    rockchip,format = "i2s";
    rockchip,card-name = "rockchip,demo-codec";
    rockchip,mclk-fs = <256>;
    rockchip,cpu = <&i2s>;
    rockchip,codec = <&demo>;
};
#endif
// 修改后
// 声明虚拟 codec 节点
demo_aux: demo-aux {
    status = "okay";
    compatible = "rockchip,dummy-codec";
    sound-name-prefix = "demo-aux";
    #sound-dai-cells = <0>;
};

// 使用 "rockchip,multicodecs-card" 绑定 codec 和虚拟 codec
demo_sound: demo-sound {
    status = "okay";
    compatible = "rockchip,multicodecs-card";
    rockchip,format = "i2s";
    rockchip,card-name = "rockchip,demo-codec";
    rockchip,mclk-fs = <256>;
    rockchip,cpu = <&i2s>;
    rockchip,codec = <&demo &demo_aux>;
};

浏览此主题 → · 入门路线 →