ALSA子系统 | POP音排查
POP音基本原理
这个POP音的产生主要是因为codec开始工作时,耳机等输出或mic输入声道上的直流电平跳变产生的;手机或一般的手持设备上不会有负电压,音源信号必须在一个直流电平上(如1/2VDD上)输出,这样一个从0电平到1/2VDD的直流跳变,通过隔直电容后到耳机上必然会产生POP音,同样地对于喇叭输出也类似;codec内部操作某些寄存器也会产生pop,有的时间比较长,需要增加延时。
一般出现在音频开始工作、结束工作或者动态切换通路时,出现这种问题的原因有很多,需要具体情况具体分析。
大部分情况下在PA之后加延时都能解决,当然,加了PA延时可能也不起作用,即使加了一秒的延时,还会惊喜的发现pop会在一秒之后出现。这就要分析下具体是啥原因造成的了。
还有就是,如果左右声道都是采用全差分方式输出的话,那是不需要隔直电容,但是耳机就不能够用标准四线耳机插孔,这种全差分的方式,耳机一般都是用的专用输出插头(与调试接口共用)。
POP音常见原因
引起POP原因可能有多种,可排查以下几点:
- 音源与PA开启关断时序不合理(可通过抓取音频输出波形与PA使能引脚波形来判定)
因为有的功放PA使能之后要一定时间才能稳定工作,在这个时间内,codec有任何变化都会被放大出来。
正常时序理应如下:
- 上电时序:1.打开codec输出。2.PA拉高使能。3.延时一小段后送入相应音源。
- 下电时序:1.关闭相应音源。2.PA 拉低。3.延时一小段以后关闭codec输出。
输入电容,电阻失配引起;
原理图错误:AB类差分输入应用;
例如板子是差分输出,但是配置了单端输出。
- 音源本身问题;
如果音频经过AU软件修改,文件尾部被附带了一段软件信息。
- 控制音频PA使能引脚的GPIO口下拉能力弱,或其他地方有上拉,导致长时间未关断;
有的方案PA是常开的。
- 部分PA芯片的使能会存在Pa音,单独操作PA使能开关查看是否POP音是本身产生的。
通用解决方法
一般来说, IC 上、掉电时的 POP 音是由于偏置电压的瞬间跳变引起的。所以要减小 POP 音就必须抑制 IC 的偏置电压bias的瞬变。Layout上的体现方法就是增大bias的滤波电容。偏置电容变得过大会导致 IC 的建立时间变长,另外电容过大还会导致 THD+N 变差。
通过改变上下电时序,是在噪声出来之前关掉末端输出,通过软件修改PA mute和spk mute的时序,即为在codec驱动代码中定义的dapm的通路上调准顺序,在回调中增加delay时间,是内部产生的杂音不走到下一级输出,使其提前关闭。
预充电的方法,再加上上拉和下拉电阻将电容的直流电压稳定住,可能效果会比较好。当然首先要确认这个直流偏置1/2VDD到底是多高(有些是可以设置的,有些固定),才好设计上下拉电阻的大小,这样调整后,感觉效果还可以,pop noise几乎感觉不到。
有些CODEC在软件上有一个寄存器可以设置这个直流电平的上升时间,让它在一定时间内跳变到1/2VDD,而不是很陡的一个上升沿,这样可以在一定程度改善这个POP音。
开关机的POP 音问题目前是整个音频功放的瓶颈问题,目前最好的一个解决方法是方法二。
对于正常工作时切换内部音频通路产生POP,切换之前可以将输出(HP,LineOut)Mute,切换完成后再unMute。
解决POP音小诀窍:从末端各个环节进行切分,然后细分codec内部数字和模拟模块的各个部件的上下电顺序,以及保持时间大小。
最后我看网上还有些说抖动enable开通技术的,这也太会玩了吧,反正我是没有用过,反倒是有些codec有寄存器配置支持爬坡使能,让它在一定时间内跳变到1/2VDD,而不是很陡的一个上升沿,这样可以在一定程度改善这个POP音。
end