Pg电子平台:一种回声抑制器中近端话音检测的实现方法
回声抑制是目前广泛应用于通讯领域的一项技术,该技术的应用目的是消除掉由于电路的阻抗不匹配或者由于声学反射造成的回声,以为通话双方提供更高质量的语音通讯服务。
目前应用最广泛的回声抑制器由以下三个部分组成,分别是双工检测器、回声估计消除器和非线性处理器。其中双工检测器的作用是指示回声估计消除器是否进行滤波器系数更新以及是否开启非线性处理器。回声估计消除器的核心结构为自适应滤波器,该滤波器的作用是根据远端输入的语音估计出回声数据并从近端输入中减掉该数据以达到削弱或消除回声的作用,同时依据估计误差即近端输入和估计数据的差并按照某种收敛算法来进行滤波器系数的更新,以使滤波器系数更逼近于回波路径参数从而使得滤波器达到收敛。非线性处理器的作用是通过一些非线性的处理方法来消除掉残余回声,从而进一步提升语音质量。
双工检测器最重要的工作是检测近端是否有话音输入。如果检测到近端有话音输入的话则立即停止自适应滤波器的系数更新,并停止非线性处理器。因为此时滤波器估计回声与近端输入的差已经不是估计误差而是估计误差与近端语音的和,如果此时进行滤波器系数的更新,则会导致滤波器处于非正常工作状态,对于某些收敛算法甚至会导致滤波器发散。如果此时仍进行非线性处理则会导致近端语音被削波,影响语音质量。由此看出近端话音检测在回波抑制器中起着非常重要的作用。为在同一硬件平台上实现更多通道的回声抑制处理或集成更多功能,有必要提供一种高效率的,稳定的近端话音检测方法。
目前近端话音检测中最为经典的算法是Geigel算法,该算法的前提是假设回声相对于语音至少有6dB的衰减,即回声的幅值至少会小于远端语音幅值的一半。假设滤波器长度为N,近端当前采样数据为s(i),远端输入序列为y(i)到y(i-N-1),则如果不等式s(i)≥0.5max(y(i),y(i-1),...,y(i-N+1))成立则表明近端一定有语音输入。
由上式可以看出,如果采用图1所描述的方法1直接按照以上判决条件进行判断,则对应每一个近端输入采样点需要计算N点远端输入序列的最大值,其计算量跟滤波器阶数N成正比。以在8KHz采样的电线ms的回声抑制为例,按照通用处理器或DSP上对N点数据取最大值至少需要2N个指令周期来计算,每秒钟需要的计算量为16*8*2*8000=2048000,合2MIPS,这样的运算量接近甚至大于核心滤波器运算的计算量,因此直接在通用处理器或者DSP中采用这种方法运算的话是非常不经济的。
一种改进的实现方法为图2描述的方法2,这种实现方法是在初始化时计算一下远端输入序列的最大值,在后续的处理中,只需要计算y(i)和上一帧最大值之间的最大值即为本帧数据的最大值,但是在运算结束后需要检测y(i-N+1)是否即为本帧最大值,如果是则表示下次从滑动窗口中移出的值为最大值,需要重新计算N-1点的最大值给下帧使用。由这种方法的原理可以看出在正常语音情况下,这种情况可以大幅度降低运算量。但是在极限情况下,例如一段时间内远端输入为静音情况下,即所有的远端输入序列的绝对值均相等,则此时的运算量和上述运算量没有改变。即这种方法可以将运算量的平均值降至一个不确定的水平,但是运算量峰值并没有变。而在回声抑制这种实时运算中,需要保证在下一数据点或数据帧到来之前必须完成上一数据点或数据帧的操作,因此开发人员在设计时必须按照处理量的峰值来分配计算资源,而这种方法提供的运算峰值与方法1的运算峰值相同,因此相对于方法1来讲并没有实际的进步。同时该方法的运算平均值随远端输入信号的不同而不同,不能通过测试的方法获得实际运行计算量峰值,因此不便于开发人员进行性能统计。
本发明所要解决的技术问题在于提供一种近端话音检测的低运算量解决方法,从而可以在同一计算平台上实现更多通道的回声抑制解决方案,或为其它模块结余更多的处理器计算资源,从而达到降低成本的目的。同时能够在开发阶段就能够精确的计算出模块的运算量,便于开发人员进行性能统计和计算资源分配,并有利于产品的稳定性和兼容性。
为了实现上述目的,本发明提供了一种回声抑制器中近端话音检测的实现方法,采用Geigel算法进行近端话音检测,其特点在于,在远端输入序列y(i)中取M个采样点作为一子帧,M小于所述回声抑制器中的滤波器长度N,在对每一子帧的第一个采样点的输入进行计算时,首先获得所述远端输入的滑动窗口内y(i)到y(i-N+M)共N-M+1个采样点的最新数据的最大值,并保存为Frame_MAX,然后对所述子帧的M个采样点逐个进行运算,取所述最大值Frame_MAX与当前滑动窗口内余下的M-1个采样点的数据的最大值做作为所述子帧的各个采样点的最大值MAX,若所述子帧的采样点的近端输入序列s(i)满足条件s(i)≥u*MAX,则所述近端有话音。
上述的回声抑制器中近端话音检测的实现方法,其特点在于,对所述远端输入序列y(i)中的子帧进行近端话音检测的方法包括如下步骤步骤一,初始化一子帧计数器计数值为0;步骤二,取近端输入数据绝对值为s(i),取远端输入数据绝对值为y(i),并将所述数据保存到远端数据缓冲区中,该缓冲区保存了从y(i)到y(i-N+1)共N个采样点的数字序列;步骤三,如果子帧计数器为0,则表示当前远端数据采样点为该子帧的第一个采样点,计算远端输入滑动窗口内最新的从y(i)到y(i-N+M)共计N-M+1个采样点数据的最大值,并将该值保存为Frame_MAX;如果子帧计数器计数值不为0,则执行步骤四;步骤四,计算远端数据缓冲区中Frame_MAX及剩余的M-1个采样点的最大值MAX;步骤五,比较衰减因子u与MAX的乘积u*MAX与近端输入数据绝对值s(i)的大小,如果满足条件s(i)≥u*MAX,则表明近端有语音输入;步骤六,更新所述子帧计数器,子帧计数器数值加1;步骤七,如果子帧计数器值等于M,则将子帧计数器数值复位为0;步骤八,跳转到步骤二,对所述子帧的下一采样点数据进行计算。
上述的回声抑制器中近端话音检测的实现方法,其特点在于,在所述方法应用于本身有语音帧长概念的应用中时,M同时应该为所述语音帧长的公约数。
上述的回声抑制器中近端话音检测的实现方法,其特点在于,对于一个固定的系统,根据不同的设计需求,有一个或两个最优的M值,在采用所述最优的M值时所消耗的处理器运算指令周期数最小。
上述的回声抑制器中近端话音检测的实现方法,其特点在于,所述最优M值通过实际测试的方法获得。
上述的回声抑制器中近端话音检测的实现方法,其特点在于,所述方法中,所有子帧的运算量均一致,而在各个子帧内部每个采样点的运算量不一致。
上述的回声抑制器中近端话音检测的实现方法,其特点在于,参照用户电路回声相对语音至少衰减6dB,所述回声幅度衰减因子u取0.5。
相较于现有技术,本发明提出的方法的特点是在运算结果与现有方法完全一致的情况下能够大幅度的降低程序运算所需要的运算量,因此可以在同一处理平台上实现更多通道的回声抑制处理,或为实现更多的功能提供足够的处理能力,因此可以达到降低成本的目的。同时使用该方法运算量的最大值和平均值一致,在参数一定的情况下运算量为一定值,便于开发人员进行性能统计和计算资源分配,并有利于应用产品的稳定性和兼容性。
图1是一种现有回声抑制中近端话音检测的实现方法的流程图;图2是另一种现有回声抑制中近端话音检测的实现方法的流程图;图3是本发明方法的流程图。
本发明提供的一种通讯领域内实现回声抑制器近端话音检测的实现方法,该方法的原理描述如下(1)近端话音检测采用Geigel算法,滤波器长度为N,近端输入序列为s(i),远端输入序列为y(i),回声幅度衰减因子为u。则在下面不等式成立时则近端有话音
s(i)≥u*max(y(i),y(i-1),...,y(i-N+1))(2)取M个采样点为一子帧,M小于滤波器长度N。如果本发明被使用在VOIP等本身有语音帧长概念的应用中时,M同时应该为帧长的公约数,例如在G.729应用中,帧长为10ms,对应8000Hz采样的80采样点,则M应该可以被80整除。在本发明中可以保证在每一子帧数据的运算量完全一致。
(3)在对每一子帧的第一点输入进行计算时,首先计算y(i)到y(i-N+M)共计N-M+1点的最大值,并保存为Frame_MAX,再将该值与滑动窗口内余下的M-1点取最大值做为该采样点的最大值。
(4)在对该子帧剩余的M-1点逐个进行运算时,用于计算Frame_MAX的N-M+1点此时仍然保留在滑动窗口内(同计算第一点时,不需要重复进行运算),因此只需要计算Frame_MAX与此时滑动窗口内剩余的M-1点的最大值即可,即相当于取M点的最大值运算。
请参照图3,要实现本发明方法,具体的操作步骤如下步骤1初始化子帧计数器COUNT值为0。
步骤2取近端输入数据绝对值为s(i)。取远端输入数据绝对值为y(i),并将该数据保存到缓冲区BUFFER中。该缓冲区保存了从y(i)到y(i-N+1)共N点的数字序列。
步骤3判断子帧计数器是否为0?如果子帧计数器COUNT为0,则执行步骤4;如果子帧计数器COUNT不为0,则直接执行步骤5。
步骤4如果子帧计数器为0,则表示当前远端数据采样点为该子帧的第一个采样点,计算远端输入滑动窗口内最新的N-M+1点,即y(i)到y(i-N+M)共计N-M+1点数据的最大值,并将该值保存为Frame_MAX。
步骤5计算远端数据缓冲区BUFFER中Frame_MAX及剩余的M-1点的最大值,该值为MAX。
步骤6比较衰减因子u与MAX的乘积u*MAX与近端输入数据绝对值s(i)的大小。
步骤7如果不等式s(i)≥u*MAX成立则表明近端有语音输入(参照用户电路回声相对语音至少衰减6dB,可以取u为0.5)。如果不成立,则直接转为执行步骤8。
步骤9判断子帧计数器值是否等于M?如果子帧计数器值不等于M,则跳转到步骤2,对下一采样点数据进行计算;如果子帧计数器值等于M,则执行步骤10。
步骤10将子帧计数器数值复位为0,并跳转到步骤2,对下一采样点数据进行计算。
依照以上实施步骤,对于整个子帧而言耗费的运算量共需要进行N+M*(M-1)次两点取最大值运算而不是N*M次两点取最大值运算,从而达到了降低运算量的目的,并且可以保证每一子帧的运算量相等并且该运算量在设计阶段即可经过计算精确获得。
以实现16ms回声抑制器而言,以处理器内部实现一次两点取最大值需要两个指令周期为例,针对8000Hz采样的系统,滤波器长度N为(8000/1000)*16=128。如取M为16,则按照图1方法实现一子帧M点的近端话音检测在计算最大值处所消耗的指令周期数为N*M*2=128*16*2=4096,而如果按照本发明所提供的方法进行运算所耗费的指令周期数为(N+M*(M-1))*2=(128+16*(16-1))*2=736。相对于原方法可以节省超过80%的处理器运算能力。
对于一个固定的系统,根据不同的设计需求,有一个或两个最优的M值,在采用此M值时所消耗的处理器运算指令周期数最小。即此时在所有满足系统要求的M的取值范围中(N+M*(M-1))/M最小。并且该最优M值也可以通过实际测试的方法获得。
综上所述,本发明的特征如下(1)本发明采用子帧概念,在下一子帧数据到来之前处理完上一子帧内容。子帧的长度M小于滤波器阶数N,如果应用在有语音帧概念的应用上,子帧长度M应该能够被语音帧采样点数FRAME整除。
(2)本发明保证所有子帧的运算量均一致,但在各个子帧内部每个采样点的运算量不一致。
(3)本发明中每帧运算时总是先计算最新的N-M+1点的最大值Frame_MAX,在本子帧的后续采样点中只需要计算M点的最大值。
当然,本发明还可有其他多种实施例,在不背离本发明精神及其实质的情况下,熟悉本领域的技术人员当可根据本发明作出各种相应的改变和变形,但这些相应的改变和变形都应属于本发明所附的权利要求的保护范围。
1.一种回声抑制器中近端话音检测的实现方法,采用Geigel算法进行近端话音检测,其特征在于,在远端输入序列y(i)中取M个采样点作为一子帧,M小于所述回声抑制器中的滤波器长度N,在对每一子帧的第一个采样点的输入进行计算时,首先获得所述远端输入的滑动窗口内y(i)到y(i-N+M)共N-M+1个采样点的最新数据的最大值,并保存为Frame_MAX,然后对所述子帧的M个采样点逐个进行运算,取所述最大值Frame_MAX与当前滑动窗口内余下的M-1个采样点的数据的最大值做作为所述子帧的各个采样点的最大值MAX,若所述子帧的采样点的近端输入序列s(i)满足条件s(i)≥u*MAX,则所述近端有话音,其中u为回声幅度衰减因子。
2.根据权利要求1所述的回声抑制器中近端话音检测的实现方法,其特征在于,对所述远端输入序列y(i)中的子帧进行近端话音检测的方法包括如下步骤步骤一,初始化一子帧计数器计数值为0;步骤二,取近端输入数据绝对值为s(i),取远端输入数据绝对值为y(i),并将所述数据保存到远端数据缓冲区中,该缓冲区保存了从y(i)到y(i-N+1)共N个采样点的数字序列;步骤三,如果子帧计数器为0,则表示当前远端数据采样点为该子帧的第一个采样点,计算远端输入滑动窗口内最新的从y(i)到y(i-N+M)共计N-M+1个采样点数据的最大值,并将该值保存为Frame_MAX;如果子帧计数器计数值不为0,则执行步骤四;步骤四,计算远端数据缓冲区中Frame_MAX及剩余的M-1个采样点的最大值MAX;步骤五,比较衰减因子u与MAX的乘积u*MAX与近端输入数据绝对值s(i)的大小,如果满足条件s(i)≥u*MAX,则表明近端有语音输入;步骤六,更新所述子帧计数器,子帧计数器数值加1;步骤七,如果子帧计数器值等于M,则将子帧计数器数值复位为0;步骤八,跳转到步骤二,对所述子帧的下一采样点数据进行计算。
3.根据权利要求1或2所述的回声抑制器中近端话音检测的实现方法,其特征在于,在所述方法应用于本身有语音帧长概念的应用中时,M同时应该为所述语音帧长的公约数。
4.根据权利要求3所述的回声抑制器中近端话音检测的实现方法,其特征在于,对于一个固定的系统,根据不同的设计需求,有一个或两个最优的M值,在采用所述最优的M值时所消耗的处理器运算指令周期数最小。
5.根据权利要求4所述的回声抑制器中近端话音检测的实现方法,其特征在于,所述最优M值通过实际测试的方法获得。
6.根据权利要求4所述的回声抑制器中近端话音检测的实现方法,其特征在于,所述方法中,所有子帧的运算量均一致,而在各个子帧内部每个采样点的运算量不一致。
7.根据权利要求3所述的回声抑制器中近端话音检测的实现方法,其特征在于,参照用户电路回声相对语音至少衰减6dB,所述回声幅度衰减因子u取0.5。
本发明涉及一种回声抑制器中近端话音检测的实现方法,采用Geigel算法进行近端话音检测,在远端输入序列y(i)中取M个采样点作为一子帧,M小于所述回声抑制器中的滤波器长度N,在对每一子帧的第一个采样点的输入进行计算时,首先获得所述远端输入的滑动窗口内y(i)到y(i-N+M)共N-M+1个采样点的最新数据的最大值,并保存为Frame_MAX,然后对所述子帧的M个采样点逐个进行运算,取所述最大值Frame_MAX与当前滑动窗口内余下的M-1个采样点的数据的最大值做作为所述子帧的各个采样点的最大值MAX,若所述子帧的采样点的近端输入序列s(i)满足条件s(i)≥u*MAX,则所述近端有话音。本发明的方法能在运算结果与现有方法完全一致的情况下大幅降低程序运算所需要的运算量,降低成本。