啸叫检测的方法:基于DSP的实现
前文大概讲述了如何设计一个陷波器,那么在声反馈系统最为关键的一步就是啸叫的检测方法实现
啸叫具有明显的时频域特征,故可以使用一些信号特征进行检测:
频域上,啸叫频点功率很高,是一个峰值,远超其他语音或噪声频率的功率;
时域上,啸叫频点的功率有一个迅速增大的过程,达到饱和幅度后一直保持。
这篇文章主要积累我所知道了解的内容,主要用于对啸叫检测方法的理论理解和code实现
①峰值均值功率比(Peak‐to‐Average Power Ratio ,PAPR)
[引用论文] 基于峰值均值功率比的方法 ,通过计算信号功率谱峰值与均值的比值来判定是否产生啸叫 ,该方法简单且应用最为广泛 ,但存在虚警率偏高的问题
产生啸叫的频点功率远大于其他频点的功率,故可以先计算出整个频谱的平均功率,然后计算每个频点功率与平均功率之比。比值大于预设阈值的频点,记为候选啸叫频率。
②峰值谐波功率比(Peak‐to‐Harmonic Power Ratio ,PHPR)
[引用论文] 基于峰值谐 波功率比的方法 ,利用啸叫成分没有谐波分量的特点 ,通过统计功率谱峰值与其 m 次 (m ∈ {0.5 ,1.5 ,2 ,3 , 4}) 谐波功率的比值来区分语音和啸叫 ,该方法虽然可以在一定程度上降低虚警率 ,但鲁棒性较差
语音谱有谐波峰,而啸叫频率是不含谐波峰的,故可以根据一个峰值点的谐波频率功率是不是也很大,来判断该峰值是否为啸叫点。
③帧间幅度斜率偏差(Interframe Magnitude Slope Deviation ,IMSD)
[引用论文] 基于帧间幅度斜率偏差的方法 ,依据啸叫成分的幅度谱在对数刻度下近似线性增加的特点,通过统计幅度谱的变 化斜率在不同信号帧之间的偏差 ,以判定是否产生啸叫 ,该方法仍不能有效控制虚警率 ,容易造成输出语音 失真 ,影响扩声效果
IMSD 也是时域特征,是从啸叫开始发生时判断,此时啸叫频点幅度线性增长,帧间斜率将会保持不变。取多帧进行区间观察,计算多帧平均斜率与区间内更短区间的斜率之间的差值,如果差值在设定阈值以下,就认为该区间斜率保持不变,可能是发生了啸叫。
④长时信号特定频带变化率 (Long‐Term Signal Variability at Specific Frequency Band , LTSV‐SFB)
⑤帧间峰值保持度(Interframe Peak Magnitude Persistence, IPMP)
IPMP 是时域特征,如果一个频点,连续几帧都是检测出来的候选啸叫峰值,那就认为这个点确实发生了啸叫。实现时可以选定 5 帧,超过 3 帧是候选啸叫频点的位置,判定为啸叫点。
⑥峰值邻近功率比(Peak-to-Neighboring Power Raio, PNPR)
PNPR 寻找功率谱的峰值点,加入候选啸叫频率。可以选取左右各 M 个相邻频点进行比较,当前频点功率比邻值都高时,记为候选啸叫频率,M 选取 5 点左右。
⑦峰值阈值功率比(Peak-to-Threshold Power Raio, PTPR)
啸叫的功率远大于正常播放的音频。故设定一个阈值,只有功率超过阈值的频点,才会进行啸叫检测,减少无意义的检测判决。
频域特征 PTPR、PAPR、PNPR、PHPR 都是对一帧内频点进行分析,而时域特征是对多帧间的特征进行分析。所以在进行判决时,一般先对每帧频谱进行频域特征分析,然后对累计的时域特许证进行分析。
当然,其中的一些特性在某些场景中不一定明显,比如 PHPR,有些啸叫的系统是多频点的,并且高频确实是基频的谐波成分;比如 IMSD,在有外界干扰的情况下,这个特征也会被弱化。