espressif2022/audio_doa

0.0.1

Latest
uploaded 5 hours ago
Audio Beat Detection component

readme

# 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 集成支持

Links

Supports all targets

License: Apache-2.0

To add this component to your project, run:

idf.py add-dependency "espressif2022/audio_doa^0.0.1"

download archive

Stats

  • Archive size
    Archive size ~ 13.18 KB
  • Downloaded in total
    Downloaded in total 0 times
  • Downloaded this version
    This version: 0 times

Badge

espressif2022/audio_doa version: 0.0.1
|