# Audio DOA Component ## 概述 Audio DOA (Direction of Arrival) 组件是一个用于实时计算声源方向的音频处理模块。该组件通过分析双麦克风阵列的音频信号,使用相位差和时延估计算法来确定声源的角度(0-180度)。 ## 功能特性 - **实时 DOA 计算**:基于双麦克风阵列实时计算声源方向 - **角度平滑处理**:使用高斯加权移动平均滤波减少角度抖动 - **角度校准**:内置角度校准算法,提高测量精度 - **角度跟踪器**:可选的 DOA Tracker 模块,提供更稳定的角度输出 - **异步处理**:使用独立 FreeRTOS 任务处理音频数据,不阻塞主流程 - **回调机制**:支持角度结果回调通知 - **VAD 集成**:支持语音活动检测(VAD)控制 - **FreeRTOS 集成**:使用 FreeRTOS StreamBuffer 进行线程安全的数据传输 ## 组件架构 该组件由三个主要模块组成: 1. **audio_doa**:核心 DOA 处理模块 - 接收双通道音频数据 - 执行 DOA 角度计算 - 应用高斯滤波和角度校准 2. **audio_doa_tracker**:DOA 角度跟踪器(可选) - 对原始 DOA 角度进行平滑和稳定处理 - 智能处理 90 度(正面)角度 - 提供鲁棒的角度输出 3. **audio_doa_app**:应用层封装 - 整合 DOA 和 Tracker 模块 - 提供简化的 API 接口 - 支持 VAD 控制 ## 算法原理 ### DOA 计算流程 1. **音频数据接收** - 接收双通道交错音频数据(通道1、通道2交替) - 数据格式:16位 PCM,采样率 16kHz 2. **数据提取** - 从交错数据中分离左右通道 - 准备用于 DOA 算法的单通道数据 3. **DOA 处理** - 使用 `esp_doa_process()` 计算原始角度 - 基于相位差和时延估计 4. **角度滤波** - 使用高斯加权移动平均(窗口大小:7) - 减少角度抖动和噪声 5. **角度校准** - 应用非线性校准算法 - 根据角度偏移中心(90度)的程度进行校正 - 提高边缘角度的精度 6. **结果输出** - 通过回调函数输出校准后的角度(0-180度) ### DOA Tracker 算法 DOA Tracker 对原始 DOA 角度进行进一步处理: 1. **初始检测** - 检测前 3 个样本判断是否为正面朝向模式 - 根据初始状态调整后续处理策略 2. **鲁棒均值计算** - 使用排序和截断均值(去除最高和最低 10%) - 减少异常值的影响 3. **智能 90 度处理** - 正面朝向模式:直接接受 90 度输出 - 非正面模式:需要持续 1000ms 的 90 度才接受 4. **角度量化** - 将角度量化为 20 度的步长 - 减少小幅抖动 5. **变化检测** - 检测大角度变化(>30度)并重置缓冲区 - 过滤不合理的小角度变化(<15度) ## 配置说明 ### 默认参数 - **采样率**:16000 Hz - **通道数**:2(双通道) - **数据缓冲区大小**:2048 字节 - **DOA 窗口大小**:7(用于高斯滤波) - **高斯 Sigma**:1.0 - **Tracker 缓冲区大小**:6 个样本 - **角度量化步长**:20 度 ### 音频数据格式要求 - **格式**:16位 PCM - **采样率**:16000 Hz - **通道**:双通道交错 - **数据排列**:CH1_LSB, CH1_MSB, CH2_LSB, CH2_MSB, CH1_LSB, CH1_MSB, ... ## 注意事项 1. **内存管理** - 组件使用 FreeRTOS StreamBuffer 进行数据传输 - 缓冲区大小为 2048 字节 × 3 - 确保系统有足够的内存空间 2. **音频格式** - 输入音频必须是 16 位 PCM 格式 - 采样率必须为 16kHz - 必须是双通道交错格式 3. **线程安全** - `audio_doa_data_write()` 可以在任何线程中调用 - 角度结果通过回调函数返回,回调在 DOA 处理任务中执行 - 回调函数应尽量简短,避免阻塞 4. **VAD 控制** - 使用 `audio_doa_app` 时,需要先启用 VAD 才会处理数据 - 使用 `audio_doa_app_set_vad_detect()` 控制 VAD 状态 5. **性能考虑** - DOA 计算需要一定的 CPU 资源 - 建议在专用的 CPU 核心上运行音频处理任务 - 如果处理速度跟不上,可以调整任务优先级 6. **角度范围** - 输出角度范围:0-180 度 - 0 度:声源在左侧 - 90 度:声源在正前方 - 180 度:声源在右侧 7. **初始化顺序** - 必须先调用 `audio_doa_new()` 创建实例 - 然后调用 `audio_doa_start()` 启动处理 - 最后才能调用 `audio_doa_data_write()` 写入数据 ## 依赖项 - **esp-sr** (~2.2.0):提供 `esp_doa` 核心算法 - **FreeRTOS**:用于任务管理和 StreamBuffer - **ESP-IDF**:基础框架和内存管理 ## 许可证 Apache-2.0 ## 版本历史 - **v1.0.0**:初始版本 - 基本的 DOA 角度计算功能 - 高斯滤波和角度校准 - DOA Tracker 角度跟踪 - 应用层封装 - VAD 集成支持
idf.py add-dependency "espressif2022/audio_doa^0.0.1"