1. 问题现象与背景分析
最近在调试杰理AC791N蓝牙芯片的24bit录音功能时,遇到了一个棘手的问题:通过录音时长接口获取的时间数据与实际录音时长严重不符。具体表现为,当实际录音时长为30秒时,接口返回的时间值可能高达120秒甚至更多。这种异常现象直接影响了录音文件的后期处理和播放控制。
杰理芯片在音频处理领域应用广泛,其AC79系列凭借低功耗和高性价比优势,在蓝牙耳机、录音笔等设备中占据重要市场份额。24bit高精度录音作为其特色功能之一,相比常见的16bit录音能提供更丰富的音频细节和动态范围。
2. 24bit录音的技术实现原理
2.1 采样深度与存储格式
24bit录音意味着每个采样点使用24位(3字节)存储,相比传统16bit录音,动态范围从96dB提升到144dB。在杰理方案中,原始PCM数据通常以以下格式存储:
- 小端字节序
- 采样率典型值为8kHz/16kHz/44.1kHz
- 三字节连续存储,无填充对齐
2.2 时间戳生成机制
录音时长计算通常基于两个参数:
- 总采样点数 = 文件大小 / 单样本字节数
- 理论时长 = 总采样点数 / 采样率
但在实际实现中,芯片内部可能采用定时器中断计数的方式记录时长,这就引入了潜在误差源。
3. 异常原因深度排查
3.1 字节对齐问题验证
通过USB逻辑分析仪抓取数据传输过程,发现当启用24bit模式时,DMA传输存在4字节对齐要求。这意味着:
- 实际每样本占用4字节(32位)
- 但有效数据只有低24位被使用
- 文件大小计算需按4字节/样本处理
若不考虑这点,直接用文件大小除以3字节计算,会导致采样点总数虚高约33%。
验证代码示例:
c复制// 错误计算方式(未考虑对齐)
uint32_t sample_count = file_size / 3;
// 正确计算方式
uint32_t sample_count = file_size / 4;
3.2 定时器时钟源配置
查阅AC791N技术参考手册发现,其录音时长计数器使用的定时器时钟源可配置为:
- 内部低速RC振荡器(32kHz)
- 外部晶振(16MHz)
- PLL分频时钟
当使用内部RC振荡器且未校准的情况下,实际频率可能偏差±
