Emphasis(频率增加权重)

        通过补偿参考信号的频谱特性,可以 优化自动能量消除(AEC)的收敛速度 。如果信号具有显著的低频能量,而高频能量相对较小,这将影响AEC在高频段的收敛速度,进而影响整体收敛速度。

        为什么需要预加重/去加重 语音信号特性?

        高频能量通常较弱,传输中易衰减

        AEC 性能:高频分量对回声消除很重要

        预加重:提升高频,改善 AEC 收敛和性能

        去加重:处理后再降低高频,恢复原始频率响应。

  • 语音本身:低频能量 >> 高频能量(高频信号通过空气衰减快!)

  • NLMS / 频域自适应滤波:

    • 权值更新与信号能量成正比

  • 结果:

    • 低频先学会

    • 高频“吃不饱”更新慢!!!

     Emphasis = 人为把高频“喂胖”一点,AEC_AECEMPHASISONOFF,参数如下:

算法含义
0 off AEC 直接在原始频谱上自适应
1 on 只改变近端(mic)信号的频谱权重 工程中默认值开启这个参数
2 on_eq 同时改变近端与远端参考的频谱权重,使两者“匹配”

整个过程如下:

其中:

        模式 1(on):仅处理麦克风信号

        模式 2(on_eq):麦克风 + 远端参考同时补偿

        设置我们的输出为标号5路径0的音频,即录制左声道为我们输入到AEC前端的参考信号:

xvf_host --use i2c AUDIO_MGR_OP_L 5 0
xvf_host --use i2c AUDIO_MGR_OP_R 0 0

这里我们要展开说明一下,为什么我们在测试的时候是 参考信号而不是麦克风输入的信号?而AEC_AECEMPHASISONOFF却是在模式1的时候仅仅加强mic的高频?

        1.第一个问题是,在AEC的运行过程中,参考信号是直接代表了滤波器能够学到的参数,而MIC的信号是有噪声的还有混响等各种问题!所以我们学习的时候就依靠参考信号来会比较可靠!

        2.如果我们人为的直接增加了参考信号的高频段,那么自适应滤波器改变了滤波器的输入统计特性,就学习的不真实了!学习到的就是不存在的声学路径!但是也不是不能增加,只有高频学习的时候输入过小的情况下,不得不去学习高频的时候才启用模式2!

        最后总结就是:

        当参考信号中的高频能量不足的时候,经扬声器和空气传播或其他原因,导致到达mic的高频分量衰减的更厉害(高频信号随距离的衰减比低频信号更厉害!),导致AEC在高频的相关性和收敛速度下降,因此需要调整参数来提升高频分量来加速收敛!

播放参考音频文件 IEEE_269-2010_Male_mono_48_kHz.wav 并使用Audacity录音。

aplay IEEE_269-2010_Male_mono_48_kHz.wav

使用Audacity中的 分析 -> 绘制频谱

为什么拿峰值与8KHz对比?

 峰值幅度(Peak magnitude)

  • 通常在 1–3 kHz(人声能量最集中的地方)

  • 这是“参考信号的主能量”

8 kHz 频点的幅度

  • 高频代表

  • 对 AEC 来说 最难学、最容易衰减

        按照官方文档推荐的参数,幅度大于8dB 参数设置为1,约等于40或者大于40设置为2!

        !!!!这里75 -33 = 42按照道理应该设置为 2,但是我们此时播放的声音是男生,本身的低频就比较多!这里是内容的问题,并不是说我们就应该设置为2!!!所以我们平时使用的时候,只要不是播放系统链路造成的这里我个人的建议是使用参数1即可!!!!!一定要注意!!!!

        AEC 残差(Residual)是指:麦克风信号中,在减去由参考信号经回声路径模型估计得到的回声分量之后,所剩余的信号。

        我们一会要通过观察AEC的残差来判断AEC的收敛

AEC 的“收敛速度”本质上就是 残差能量随时间下降的速度:

  • 收敛快 → 残差很快变小

  • 收敛慢 → 残差长时间保持较大

  • 某个频段收敛慢 → 那个频段的残差消失得更慢

  为了便于分析这个参数对AEC的影响,我们先将 AEC_AECEMPHASISONOFF 设置为0关闭对高频的加权:

xvf_host --use i2c AEC_AECEMPHASISONOFF 0

将以下参数配置为如下:

参数名 设置值 模块名称 工程作用 通俗解释
PP_MIN_NS 1.0 Stationary Noise(平稳噪声)默认值为0.15 

长时间存在、统计特性稳定

、频谱变化慢的噪声

  • 风扇声

  • 空调声

  • 电源嗡声

  • 机内底噪

PP_MIN_NN 1.0 Non-Station Noise(非平稳噪声)默认值0.55 非平稳噪声抑制(如突发噪声、环境变化噪声)
  • 键盘声

  • 碰撞声

  • 风噪突变

  • 人群突发噪声

PP_ECHOONOFF 0 Post Echo Suppression(后级回声抑制)默认1 关闭 AEC 后级的回声抑制模块 防止二次抑制,把 AEC 残差真实暴露出来
PP_NLATTENONOFF 0 Non-Linear Attenuation(非线性衰减)默认1 关闭非线性回声压制 避免在弱回声阶段“硬压”残差
PP_AGCONOFF 0 Automatic Gain Control(自动增益)默认1 禁用自动增益调节 防止把小残差自动放大或压小

总之就是将抑制或者影响残差的参数全部关掉就行了!

xvf_host --use i2c PP_MIN_NS 1.0
xvf_host --use i2c PP_MIN_NN 1.0
xvf_host --use i2c PP_ECHOONOFF 0
xvf_host --use i2c PP_NLATTENONOFF 0
xvf_host --use i2c PP_AGCONOFF 0

设置输出通道为索引7通道0,即为mic 0的残余回声输出。我们直接对比一个麦克风的惨差即可,记住我们此时设置 AEC_AECEMPHASISONOFF 设置为0,关闭对高频的加权

xvf_host --use i2c AUDIO_MGR_OP_L 7 0
xvf_host --use i2c AUDIO_MGR_OP_R 0 0

播放参考音频文件 IEEE_269-2010_Male_mono_48_kHz.wav 并使用Audacity录音。

aplay IEEE_269-2010_Male_mono_48_kHz.wav

分析录音后的Audacity的频谱

设置AEC_AECEMPHASISONOFF 设置  1

xvf_host --use i2c AEC_AECEMPHASISONOFF 1

但是我们分析下这个结果是在 AEC_AECEMPHASISONOFF 设置为0 和 1的不同情况下的参数此时尽管是已经经过AEC后的残差!所以我们这两个录取的数据实际是  不可信的!!

AEC残差 = 麦克风信号 - AEC估计的回声
               = (回声 + 你的声音 + 噪声) - 估计的回声
               = 残留回声 + 你的声音 + 噪声

        所以这里的测试环境最好是在专门的声学实验室里面进行!!! 可以消除掉自己说话的声音和噪声的干扰带来的影响!再进行分析!默认建议开启AEC_AECEMPHASISONOFF 的值为1,这比较贴近我们的通用实用环境!!

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐