最近在调试杰理AC692X系列蓝牙音频芯片时,遇到一个典型问题:每次播放提示音前会出现明显的"PO"声杂音。这种爆音现象在音频设备开发中并不罕见,但解决起来往往需要系统性的排查。先描述下具体表现:
audio_play_tone()函数播放提示音时通过逻辑分析仪抓取I2S信号发现,杂音出现在音频数据开始传输前约2ms处。这个时间点很关键——正好对应DAC从静默状态切换到工作状态的过渡期。
测量主电源发现,DAC供电电压(VDD_DAC)在播放开始时有约200mV的跌落。进一步用示波器捕获上电时序:
| 信号 | 上升时间 | 相对延迟 |
|---|---|---|
| VDD_CORE(1.8V) | 50μs | 基准 |
| VDD_DAC(3.3V) | 120μs | +70μs |
| DAC_ENABLE | 10μs | +20μs |
问题在于DAC使能信号过早激活,此时模拟电源尚未稳定。典型的电源轨要求是:模拟电源需比数字控制信号提前至少100μs稳定。
用音频分析仪测量DAC输出端直流分量:
这种DC偏移会导致扬声器音圈突然位移,产生可闻的"PO"声。根本原因是DAC内部偏置电路的上电时序与数字控制不同步。
电源时序调整:
输出耦合优化:
修改SDK中的音频驱动初始化流程:
c复制void audio_dac_init(void) {
// 先使能模拟电源
pmu_set_analog_power(true);
delay_us(150); // 确保电源稳定
// 分步开启DAC模块
dac_ctrl(DAC_CTRL_BIAS, 1);
delay_us(50);
dac_ctrl(DAC_CTRL_CLK, 1);
delay_us(20);
dac_ctrl(DAC_CTRL_DAT, 1);
// 设置渐进式偏置
for(int i=0; i<16; i++){
dac_set_bias(i);
delay_us(10);
}
}
在audio_cfg.h中修改关键参数:
c复制#define TONE_PLAY_PRESILENCE_MS 20 // 增加播放前静默时间
#define DAC_DEFAULT_BIAS_LEVEL 8 // 优化偏置点
#define VOLUME_RAMP_STEP_MS 5 // 音量渐变步进
使用APx515音频分析仪采集改进前后的对比数据:
| 测试项 | 改进前 | 改进后 |
|---|---|---|
| 瞬态噪声电平 | -45dBFS | -80dBFS |
| DC偏移突变幅度 | ±68mV | ±5mV |
| 建立时间 | 2.1ms | 0.8ms |
| THD+N@1kHz | 0.08% | 0.03% |
主观听感测试中,"PO"声完全消除,提示音播放变得干净利落。功耗测试显示待机电流仅增加7μA,在可接受范围内。
电源完整性检查:
软件防爆音技巧:
c复制void play_tone_safe(uint16_t id) {
audio_mute(true);
delay_ms(10);
audio_play_tone(id);
while(audio_is_playing()){
// 等待播放开始后再解除静音
if(get_play_progress() > 5){
audio_mute(false);
break;
}
}
}
硬件设计Checklist:
这个案例的解决过程表明,音频杂音问题往往需要硬件、软件、固件三方面的协同优化。特别是在低成本芯片方案中,默认配置可能无法满足高标准的音频质量要求,需要开发者进行深度定制。