芯片型号:AB1565
功能模块:Side Tone
功能描述:Side Tone是用来把耳机外界的声音导入到耳朵内,从而实现人能听到耳机外的自然声音,最理想的情况是听到的外部声音如同没有配置耳机一样的效果。
图1图2为Side Tone单元的函数调用关系,过程中会配置Side Tone的Filter和通透的增益。基中DTM()为FreeRTOS的一个任务,软件在启动后该任务便会一直运行,并且维护一个名为dtm_queue的本地队列,所有和Side Tone相关的操作命令都会被先发送到该队列,然后由该Task来把命令从队列中提取并做相应的执行,其工作逻辑如图2所示。
- Filter
滤波系数是来对声音做EQ处理,比如音色的还原,噪声的消除、抑制或增强等。这些系统,是提前预置在代码中的,当然也可以编程手段来动态修改这些参数,比如从BL导入并存储在指定位置等,SDK中,此系数的位置如图1和图3所示,最终这些系数被写入了寄存器“AFE_SIDETONE_CON0”中。
那么这个系数的写入又是如何存储的呢?我来再来看芯片的Reference Manual,其中关于AFE_SIDETONE_CON0寄存器的定义,如图4所示,红框标记的即为控制系数写入RAM的相关位。
bit[20:16]为系数的地址,区5个bit位,因此可以知道系数最多只能是2^5=32个(当然实际可以小于32个)。
而bit[15:0]则为系数值(格式为Q1.15),因此在写入时需要依据系数的数量来执行同样次数的写操作。
- 增益
则是调节外界声音透传入耳内的强度,理想情况下该增益应为动态的且有上限的阀值,对较小的声音有放大的功能,对较大的声音进行抑制,从而形成听力保护效果;
无论是filter还是gain,最终都是形成因子写入到AB1656对应的寄存器,即AFE_SIDETONE下面的若干寄存器。
那么gain又是如何写入芯片的呢?如图1所示,其中” dsp_sidetone_set_volume()”及“dsp_sidetone_start_volume_set()”函数即为配置sidetone的增益的相关接口函数,如图5所示。
从图5可以发现,增益值最终被写入了寄存器AFE_SIDETONE_GAIN中,那么该寄存器又是如何定义的呢?我们看图6,可以发现关于增益共有两个:Positive Gain和SideToneGain(暂时还没研究两者的区别)。