Полное техническое издание четырёх глав китайского RK-KF-YF-793 V1.0.0 от : сборка, включение, параметры и устранение ошибок. Таблица применимости указывает все чипы и версии ядра; это историческая область источника, не обещание текущей совместимости. Есть только китайский источник, английских оригинальных рисунков нет. Символьные схемы аудиотракта сохранены как редактируемый код и дополнены исходными фрагментами китайского PDF; изображения не объявляются локализованными. Исключены юридические страницы, аудитория, история изменений и повторное оглавление, но не технические параметры. Команды, запись и аппаратные тесты не выполнялись.
Редакционные замечания: соединены разрывы кода и таблиц между страницами, восстановлены UUID и последний символ заголовка 4.1. Пустые описания attenuate_time и пяти параметров DOA оставлены пустыми, как в источнике. supEnergy2 описан как «точка 1»; fRk1/fRk2 — неактивный наклон экспандирования; регистр HardThreshold/PrioriRatio сохранён без догадок об алгоритме. Комментарии кода, UUID, имена параметров, журналы и исходные многоточия сохранены. Безопасность: adb root/remount и setenforce 0 предназначены только для разрешённой отладки; последняя команда отключает принудительное применение SELinux, после теста восстановите политику. Аудиодампы могут содержать личные записи: ограничьте доступ и удаляйте ненужные файлы.
1. Сборка
1.1 Найдите BoardConfig.mk проекта
Расположение BoardConfig.mk зависит от чипа и product, выбранного через lunch. Пример: чип 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 в 16 мс с округлением вниз.
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 config в hardware/rockchip/audio/tinyalsa_hal/audio_hw.c.
static struct pcm_config pcm_config_in = {
// ...
.rate = 48000,
.period_size = 768,
};
2) Измените число каналов MIC.
Уточнив число каналов MIC, измените конфигурацию ниже; пример для двух каналов MIC в hardware/rockchip/audio/tinyalsa_hal/audio_hw.c.
#define PCM_CAPTURE_CHANNELS 2
Один MIC сейчас обрабатывается как два канала.
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 |
+----------------+ | +----------+ | +-----+
| |

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 |
| |+----------+| | +-----+
| +------------+ |


Измените число опорных каналов; пример: два канала в 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 |
+----------------+ | | | | +-----+
| +----------+ |

Измените конфигурацию ядра для сборки DLP.
CONFIG_SND_SOC_ROCKCHIP_DLP_PCM
В dts включите DLP для соответствующего cpu dai.
&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. Пример: два канала MIC + два опорных канала.
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",
};
Измените число опорных каналов; пример: два канала в 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. Данные объединяются на 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> | |

Измените конфигурацию ядра для сборки Aloop.
CONFIG_SND_DRIVERS
CONFIG_SND_ALOOP
Число опорных каналов задавать не нужно: Aloop использует два канала по умолчанию. Файл: 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; включено — RLS, требующий больше вычислений, чем LMS |
preproc_bf_fix |
BF с фиксированным направлением луча |
preproc_bf_dtd |
Определение односторонней/одновременной речи BF |
preproc_bf_cng |
Комфортный шум BF |
preproc_bf_eq |
Регулировка эквалайзера BF |
preproc_bf_chn_select |
BF для индивидуального расширения MIC |
preproc_bf_howling |
Подавление акустической обратной связи BF; включать по необходимости |
preproc_bf_doa |
Локализация источника звука BF оценивает его направление; включать по необходимости |
preproc_bf_wind |
Подавление ветрового шума BF; включать по необходимости |
preproc_bf_ainr |
Шумоподавление BF с ИИ; при включении 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) Проверьте привязку к нужному потоку. Во время записи или разговора используйте 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.xml: в SDK — hardware/rockchip/audio/preprocess/, на устройстве — /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 |
Длина буфера MIC. Настраивать только если известно, что захват MIC запаздывает относительно опорного сигнала; иначе оставить 0. |
filter_len |
Длина линейного фильтра AEC. Большая длина повышает точность оценки эха, но замедляет сходимость и увеличивает вычисления. Типичные значения: 2/4/6/8. |
Array_list |
Порядок аудиоканалов; требуется preproc_aec_array_reset. |
Параметры оценки задержки (требуется preproc_aec_delay).
| Атрибут | Описание |
|---|---|
max_frame |
Максимальное число кадров оценки; обычно 16. |
least_delay |
Минимальное число кадров оценки; рекомендуется 0, если MaxFrame не особенно велик. |
jump_frame |
Число кадров, пропускаемых в начале; обычно 12. |
delay_offset |
Смещение в кадрах, предотвращающее запаздывание MIC относительно опоры из-за чрезмерной оценки задержки; обычно 1. |
mic_amp_thr |
Минимальная энергия MIC: ниже порога оценка задержки не обновляется. Обычно 50. |
ref_amp_thr |
Минимальная энергия опорного сигнала: ниже порога оценка задержки не обновляется. Обычно 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 mode: сильнее подавляет эхо, но может чрезмерно подавлять речь. |
limit_ratio_0 |
Минимальная доля остаточного эха в диапазоне; рекомендуется [1.0f, 5.0f]. Большие значения усиливают подавление. Три столбца — низкий, средний и высокий диапазоны, задаваемые low_freq и high_freq. |
limit_ratio_1 |
Доля подавления остаточного эха по диапазонам; рекомендуется [1.0f, 3.0f]. Большие значения усиливают подавление. Три столбца — низкий, средний и высокий диапазоны, разделённые low_freq и high_freq. |
thd_split_freq_0 |
Диапазоны подавления гармоник. Неиспользуемую строку заполните нулями. Каждая строка — диапазон: начало в столбце 1, конец в столбце 2; диапазон обоих значений [0,1/2 * sample rate]. |
thd_split_freq_1 |
То же, что выше. |
thd_split_freq_2 |
То же, что выше. |
thd_split_freq_3 |
То же, что выше. |
thd_sup_degree_0 |
Коэффициенты подавления гармоник для указанных диапазонов. Нулевая строка диапазона отключает соответствующую строку коэффициентов. Столбцы задают подавление основной частоты, способной образовать в диапазоне гармоники со 2-й по 11-ю. Рекомендуется [0.001f,1.0f]; большее значение усиливает подавление. |
thd_sup_degree_1 |
То же, что выше. |
thd_sup_degree_2 |
То же, что выше. |
thd_sup_degree_3 |
То же, что выше. |
hard_split_freq_0 |
Диапазоны Hard mode и диапазон вычисления среднего усиления. Столбцы 1/2 — начало/конец в [0,1/2*sample rate]. Не более четырёх диапазонов Hard mode; последняя строка задаёт диапазон среднего усиления для HardThreshold ниже. |
hard_split_freq_1 |
То же, что выше. |
hard_split_freq_2 |
То же, что выше. |
hard_split_freq_3 |
То же, что выше. |
hard_split_freq_4 |
То же, что выше. |
hard_threshold |
Пороги включения Hard mode: четыре порога соответствуют четырём диапазонам выше. Если среднее усиление ниже порога, в соответствующем диапазоне включается Hard mode. |
2) Параметры AGC (требуется preproc_bf_agc).
| Атрибут | Описание |
|---|---|
attack_time |
Рекомендуется 20-600 мс. Время атаки — время увеличения усиления AGC. |
release_time |
Рекомендуется 20-600 мс. Время восстановления — время снижения усиления AGC. |
attenuate_time |
|
max_gain |
Рекомендуется 0-50 дБ. Максимальное усиление, также усиление линейного участка. |
max_peak |
Диапазон от 0 до -87 дБ. Максимальная энергия речи после AGC. |
fRth0 |
Диапазон от 0 до -87 дБ. Порог шумового затвора: речь ниже него не усиливается. |
fRth1 |
Диапазон от 0 до -87 дБ. Энергетический порог конца экспандирования; речь выше него усиливается на max_gain. |
fRth2 |
Диапазон от 0 до -87 дБ. Порог начала компрессии; выше него усиление речи постепенно падает до 0 дБ. |
fRk0 |
Наклон участка экспандирования. |
fRk1 |
Наклон участка экспандирования (неактивный параметр). |
fRk2 |
Наклон участка экспандирования (неактивный параметр). |
fLineGainDb |
Повышение линейного участка в дБ (неактивный параметр). |
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 |
Минимальное априорное SNR, (0.0f, 0.5f); большие значения ослабляют шумоподавление. |
postMax |
Максимальное апостериорное SNR; обычно 40. |
prioriRatio |
Коэффициент сглаживания априорного SNR, (0.0f,1.0f); большие значения усиливают шумоподавление. |
prioriRatioLow |
Коэффициент сглаживания априорного SNR, (0.0f,1.0f); большие значения усиливают шумоподавление. |
splitBand |
Индекс разделения диапазонов, [0,32]. Ниже него априорное SNR сглаживается PrioriRatioLow, иначе — PrioriRatio. |
prioriSmooth |
Коэффициент сглаживания априорного SNR, (0.0f,1.0f); большие значения усиливают шумоподавление. |
tranMode |
Режим импульсного шума: 0 — выключен, 1 — подавление по обнаружению, 2 — по оценке. |
4) Параметры подавления реверберации (требуется preproc_bf_dereverb).
| Атрибут | Описание |
|---|---|
rlsLg |
Порядок RLS-фильтра подавления реверберации для пробуждения. В определённых пределах больший порядок усиливает эффект и увеличивает вычисления. Рекомендуется 4. |
curveLg |
Порядок кривой распределения для подавления реверберации в разговоре. Большие значения усиливают эффект и риск чрезмерного подавления. Рекомендуется 10. |
delay |
Задержка RLS-фильтра определяет сохранение ранней реверберации. Рекомендуется 2. |
forgetting |
Коэффициент забывания RLS. Меньшие значения усиливают подавление реверберации и риск чрезмерного подавления. Рекомендуется 0.98-0.999. |
t60 |
Оценка времени реверберации в секундах. Большие значения усиливают подавление и риск чрезмерной обработки. Рекомендуется 0.68 при слабой реверберации, 1.5 при средней/сильной. |
coCoeff |
Коэффициент взаимной когерентности против чрезмерного подавления. Меньшие значения усиливают эффект. Рекомендуется 2 при слабой реверберации, 1 при средней/сильной. |
5) Параметры комфортного шума (требуется preproc_bf_cng).
| Атрибут | Описание |
|---|---|
fGain |
Рекомендуется 0-50 дБ. Коэффициент амплитуды добавляемого комфортного шума; по умолчанию 2. |
fMpy |
Рекомендуется 0-50 дБ. Амплитуда случайного генератора белого шума; по умолчанию 5. |
fSmoothAlpha |
Диапазон 0.0f-1.0f. Сглаживание комфортного шума; по умолчанию 0.92. |
fSpeechGain |
Диапазон 0.0f-1.0f. Степень имитации речевой структуры комфортного шума; по умолчанию 0.3. |
6) Параметры DTD (требуется preproc_bf_dtd).
| Атрибут | Описание |
|---|---|
ksiThd_high |
Верхний порог односторонней/одновременной речи; выше него определяется односторонняя речь. |
ksiThd_low |
Нижний порог; ниже него определяется односторонняя речь. |
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 Настройка и отладка параметров
Используйте сборку userdebug и проверьте подключение ПК через ADB. На ПК выполните две следующие команды.
adb root
adb remount
3.3.1 Обновление параметров
Измените rkaudio_effect_preprocess.xml и отправьте его через push в соответствующий каталог устройства.
adb push rkaudio_effect_preprocess.xml /vendor/etc/
3.3.2 Анализ выхода
Перезапустите запись для проверки результата либо разговор для проверки выхода удалённой стороны. Также можно выгрузить вход/выход и проанализировать потоки напрямую.
setenforce 0
setprop vendor.audio.preproc.debug 1
Затем экспортируйте два следующих файла и проанализируйте их в Audacity или другом инструменте ПК.
/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. Вопросы и ответы
4.1 После добавления DLP запись с заданным числом каналов MIC + опоры завершается ошибкой параметров
Пример: два канала MIC и два опорных канала.
# 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"
При ошибке проверьте три пункта:
Invalid mixer control: Software Digital Loopback Mode
Проверьте наличие поддержки 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")) {
Проверьте, включён ли DLP в ядре.
CONFIG_SND_SOC_ROCKCHIP_DLP_PCM
Включите DLP для соответствующего cpu dai в dts.
&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 поддержку четырёхканального захвата.
// ...
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>;
};
