在通信系统中控制回声抑制的方法和设备的制作方法

文档序号:7581481阅读:400来源:国知局
专利名称:在通信系统中控制回声抑制的方法和设备的制作方法
背景技术
本发明涉及通信系统,尤其涉及双向通信链路中的回声抑制。
在诸如陆线和无线电话系统的多种通信系统中,通常经双向通信链路在两个系统用户之间传送话音信号。在这种系统中,通常由通信链路一端上的近端话筒检测近端用户的语音,然后经链路向远端扬声器传送以再生和呈现给远端用户。相反地,由远端话筒检测远端用户语音,然后经通信链路向近端扬声器传送以再生和呈现给近端用户。在通信链路的任一端上,由邻近话筒检测的扬声器输出可能在无意中经通信链路向回传送,从用户的角度来看导致可能无法接受的破坏性反馈或回声。
因此,为了避免这种不希望的回声信号的传输,应当尽可能地隔离扬声器输出和话筒声音输入。使用常规的电话听筒,其中听筒话筒靠近用户嘴部,而听筒扬声器基本上覆盖用户耳部,轻易地实现所需的隔离。然而,随着便携式电话的实际尺寸变小,并且随着免提式扬声器电话变得更加普及,制造商已经转向扬声器到话筒的声音路径不被用户头部或身体阻碍的设计。因此,在现代系统中对更高级的回声抑制技术的需要变得极为重要。
这种需要在免提汽车电话的情况下尤其明显,封闭的车辆环境可能导致扬声器信号的多个反射被耦合回高增益免提话筒。用户在车辆中的移动和回声信号在相对方向和强度上的变化,例如当窗户打开和关闭或者用户在驾驶时移动其头部时,使汽车环境中回声抑制的工作更加复杂。另外,最近开发的数字电话通过语音编码器处理语音信号,该话音编码器引入明显的信号延迟和产生非线性信号失真。从用户的角度来看这种延迟将使信号回声问题更严重,并且附加的非线性失真使网络设备的回声抑制更困难。
针对上述问题,电话制造商已经开发了多种回声抑制装置。一种示范性回声抑制系统100在

图1A中图示。如图所示,示范性系统100包括话筒110、扬声器120和回声抑制器130。话筒110的音频输出115被耦合到回声抑制器130的音频输入,回声抑制器130的音频输出135用作电话(未图示)的近端音频输入。另外,电话的远端音频输出125被耦合到话筒120的音频输入和回声抑制器130的参考输入。
在工作中,回声抑制器130处理话筒信号115以向远端电话用户提供音频输出信号135。更具体地,回声抑制器130根据远端音频信号125衰减话筒信号115,以便扬声器120到话筒110的音频回声不被发送回远端电话用户。
回声抑制器130一般是非线性削波型抑制器或线性定标型抑制器。削波型抑制器一般通过消除落入特定数值范围(即特定的削波窗口)内的一部分信号来衰减话筒输出信号115。另一方面,定标型抑制器通过使信号乘以一个合适的比例因子来衰减话筒输出信号115,最近开发的混合型抑制器结合削波和定标的特征,例如通过按比例缩放落入特定衰减窗口内的一部分话筒信号。在许多情况下,一般根据远端音频信号125的幅度直接或间接地调整衰减标准(即削波窗口和/或比例因子),以便话筒输出115仅被衰减到远端用户讲话的范围。
一种常规的削波型抑制器,在技术上称为中心削波器,例如在1995年12月12日公开并授权给Rasmusson等人,标题为“使用回声估计修改误差信号的回声消除系统和方法”的美国专利US5,475,731中被描述。另一种削波型抑制器,在技术上称为AC-中心削波器,在1996年12月31日申请的标题为“通信系统中噪声和回声抑制的AC-中心削波器”的待审美国专利申请US 08/775,797中被描述。一种示范性的定标型抑制器在1994年2月1日授权给Center,标题为“回声消除器处理技术和处理”的美国专利US 5,283,784中被描述。一种改进的混合抑制器,在此称作AC-中心衰减器,在同时提交的标题为“改进通信系统中回声抑制的方法和设备”的待审美国专利申请US 09/005,149中被描述。每一上述专利和每一上述专利申请在此全文引用作为参考。
图1A的回声抑制器130也可以与线性回声消除器和/或舒适噪声生成器组合以提供更高级的回声抑制系统。图1B图示一种示范性系统101,包括图1A的话筒110、扬声器120和回声抑制器130,和声音回声消除器140和舒适噪声合成装置150。如图所示,话筒输出115被连接到声音回声消除器140的声音输入,声音回声消除器140的音频输出145被连接到回声抑制器130的音频输入。抑制器音频输出135和舒适噪声信号被分别连接到合成设备150的第一和第二输入,合成设备150的音频输出155用作电话(未图示)的近端音频输入。来自电话的远端音频输出125被连接到扬声器120的音频输入和声音回声消除器140和回声消除器130的参考输入。
在工作中,声音回声消除器140动态地模拟扬声器120到话筒110的声音路径,并试图从话筒输出信号115消除话筒110接收到扬声器声音。通常用于模拟声音回声路径的算法包括公知的最小均方(LMS)算法和诸如标准最小均方(NLMS)的变型。在授权给Rasmusson等人的上述美国专利US 5,475,731中描述了一种示范性的基于最小均方的消除器。另外,在1997年5月7日提交的标题为“在通信系统中使用的改进回声消除器”的待审美国专利申请US 08/852,729中描述了一种改进的基于标准最小均方的消除器,在此全文引用作为参考。
在图1B的系统101中,回声抑制器130辅助回声消除器140并在需要时提供附加的回声衰减。例如,可以根据声音回声消除器140获得的回声消除瞬间电平的测量值动态地调整回声抑制器130以将残余回声衰减到预定目标电平。例如在上述美国专利申请US09/005,149(标题为“在通信系统中改进回声抑制的方法和设备”并与此同时提交)中描述了动态测量回声消除器提供的回声消除的改进方法。
如在图1A的系统100中,回声抑制器130可以是削波抑制器、定标抑制器或混合抑制器。另外,当在回声消除器140之后时,回声消除器130可以是简单的单掷开关,在合适的时间上(即在话音激励检测器指示话筒信号115不包含话音的周期内)选择切断或静噪音频输出信号135。在任何情况下,回声抑制器130衰减整个音频信号,除了抑制回声之外,使任何背景噪声和/或可能出现的近端话音失真。事实上,当回声抑制器130工作时,可以将背景噪声抑制到远端用户可能误以为呼叫已经被断开的程度。
因此,为了提高远端用户的通信质量,当回声抑制器130工作时,当前的系统经常向电话音频信号135提供舒适噪声。在图1B的系统中,舒适噪声经合成装置150被添加给抑制器输出信号135。另外,合成装置50可以用一个开关替代以便将抑制器输出信号135或舒适噪声选择发送给远端用户。生成和使用舒适噪声的改进方法例如在标题为“在通信系统中提供舒适噪声的方法和设备”和与此同时提交的美国专利申请US 09/005,145中被描述,在此全文引用作为参考。
当上述系统提供高级回声抑制时,控制这种系统的已知方法在若干方面是不充分的。例如,已知的回声抑制器130的控制方法经常致使远端用户察觉到无法接受的失真的近端话音。换句话说,已知的控制方法有时在不应激活回声抑制器130时(例如在近端单方讲话时)使其工作,和/或使回声抑制器不必要地或不合乎需要地(例如在双方交谈时)衰减近端信号。另外,某些控制残余回声抑制器的已知方法(例如根据近端语音的存在与否闭合和打开前端回声消除器之后的单掷开关)有时可能提供不充分的回声抑制。因此,需要控制回声抑制的改进方法和设备。
发明概述通过提供回声抑制器的控制方法和设备以在使回声抑制器在任意给定时间引入比所需更多的衰减因而更多失真的可能性最小的同时,提供所需级别的回声衰减,本发明满足上述及其它需要。本发明的方法和设备有利地允许在优化各种条件下被察觉的信号质量时提供出色回声抑制的通信系统的结构。
在第一种示范性实施例中,根据本发明的回声抑制设备包括配置以衰减第一通信信号(例如近端音频信号)的回声抑制器。更具体地,回声抑制器衰减第一通信信号以抑制第一通信信号的回声分量,其中回声分量因第二通信信号(例如远端音频信号)的反射产生。示范性回声抑制设备还包括配置以提供第二通信信号是否包括话音分量的指示的话音激励检测器,当话音激励检测器指示第二通信信号并不包括引起回声的话音分量时停止回声抑制器的使用。因此,仅在需要时激活回声抑制器(并在第一通信信号上引入失真)。
在第二种示范性实施例中,根据本发明的回声抑制设备包括配置以使一部分第一通信信号乘以衰减因子从而抑制其回声分量的回声抑制器,该回声分量因第二通信信号的反射产生。示范性回声抑制设备还包括配置以检测通信信号的主要条件并据此调整抑制器衰减因子的增益控制处理器。例如,增益控制处理器可以根据第一通信信号是否包括近端话音分量将抑制器衰减因子设置成两个值之一。因此,示范性的回声抑制设备可以在引入最小信号失真时提供合理级别的回声衰减。
在第三种示范性实施例中,根据本发明的回声抑制设备包括配置以衰减第一通信信号从而抑制其回声分量的回声抑制器,该回声分量因第二通信信号的反射产生。回声抑制设备还包括配置以检测第一通信信号中的信噪比和根据所检测的信噪比调整由回声抑制器提供的衰减级别的增益控制处理器。例如,增益控制处理器在该比值等于或低于预定阈值时停止回声抑制器的工作。另外,增益控制处理器也可以调整回声抑制器的衰减因子以确保回声抑制设备输出中的回声噪声比等于或低于预定阈值。因此,示范性的回声抑制设备可以在引入最小信号失真时提供合理级别的整个回声衰减。
下文将参考附图中图示的说明性例子详细说明本发明的上述和其它特征。本领域的技术人员将意识到所述实施例是为了说明和理解目而提供的,并在此将考虑多种等价的实施例。
附图的简要说明图1A图示在其中可实施本发明教导的一种示范性回声抑制系统。
图1B图示在其中可实施本发明教导的另一种示范性回声抑制系统。
图2图示根据本发明的一种示范性回声抑制系统,该示范系统包括配置以向声音回声抑制器提供控制输入的话音激励检测器。
图3图示根据本发明的另一种回声抑制系统,该系统包括配置以调整声音回声抑制器衰减因子的增益控制处理器。
图4图示根据本发明一种控制回声抑制器示范性方法中的步骤。
本发明的详细说明图2图示根据本发明第一方面构成的示范性回声抑制系统200。如图所示,示范性系统100包括图1A和1B的话筒110、扬声器120和回声抑制器130和话筒话音激励检测器210。话筒110的音频输出被连接到回声抑制器130的音频输入,回声抑制器130的音频输出135用作电话(未图示)的近端音频输入。来自电话的远端音频输出125被连接到话筒120的音频输入以及回声抑制器130和话音激励检测器210的参考输入。话音激励检测器210的二进制输出215被连接到回声抑制器130的控制输入。
通常,图2的系统200的操作类似于图1A的系统100的操作。换句话说,回声抑制器130根据远端音频信号125衰减话筒信号115,以便从扬声器120到话筒110的音频回声不被反向传送回远端电话用户。然而,在图2的系统中,还根据话音激励检测器215的二进制输出215进行回声抑制器130的操作。更具体地,仅当话音激励检测器210指示远端信号215包括话音分量时(例如当检测器输出215等于二进制1时)回声抑制器130工作。
通过调节回声抑制器130在话音激励检测器输出215上的激活,图2的系统200更加不可能在话筒信号115上引入不希望的失真,当不需要这样做时。换句话说,因为在远端用户不讲话的时间内不可能有远端回声,在该时间内不需要启动回声抑制器130。因此,通过在话音激励检测器210指示没有远端话音时停止使用回声抑制器130,在不需要远端回声抑制的时间内,图2的系统200降低回声抑制器130衰减和因而使近端话音和噪声失真的可能性。
然而,注意,因为扬声器话音激励检测器210有时可能出错,无法确保回声抑制器130在远端用户不讲话时始终不工作。尽管如此,与不调整抑制器工作的现有技术系统相比,图2的系统200提供更好的近端信号质量。而且,与根据话筒话音激励检测器调整抑制器工作的现有技术系统相比,图2的系统提供防止回声抑制器130不必要衰减的更好的保护。因为扬声器信号一般具有比话筒信号更安静的背景(例如在汽车免提应用中),扬声器话音激励检测器10通常比话筒话音激励检测器更加可靠。换句话说,在安静的背景扬声器信号中检测没有话音比在有噪声的背景话筒信号中检测低电平话音更加容易。
还注意上述讨论假定近端和远端用户之间的网络设备足以防止可能在频率上出现的往返回程增益大于1(即从远端用户经网络并返回远端用户的信号增益)的啸声。换句话说,如果根据不存在远端话音完全停止使用回声抑制器130,应当使用其它设备(例如网络回声消除器)防止啸声。也可以在没有远端话音的时间内不完全停止使用回声抑制器130,回声抑制器130可以保持工作,并可以被调整(在削波、定标和混合抑制器的情况下)以提供刚好足以防止啸声的正常水平的衰减(例如-6至10 dB)。
本领域的普通技术人员将理解话筒话音激励检测器210的实现方法是公知的。例如,欧洲电信标准协会(ETSI)文件GSM-06.82描述了一种适合于本发明目的的实现。这种话音激励检测器当前在多种通信系统中用于噪声抑制和/或间断传输(DTX)目的。典型地,这种噪声激励检测器偏向于话音,换句话说,它们将在话音未出现时指示话音出现,但它们很少在话音出现时指示未出现话音。因为本发明的扬声器话音激励检测器210具有类似的要求(即情愿在提醒方面犯错误并设法衰减并不存在的回声,而不情愿实际存在的回声被发送回远端用户),在图2的示范性系统200中可以使用相同类型的话音激励检测器。
如上面参考图1A和1B所描述的,图2的回声抑制器130可以是削波抑制器、定标抑制器、混合抑制器,或者当包括远端回声抑制器140时可以是断路开关。因此,根据使用何种类型的抑制器,可以实施在没有远端话音的时间内停止回声抑制器130工作的多种方法中的任一种方法。例如,通过使用旁路开关以完全绕过抑制器可以有效地停止任一种抑制器的工作。也可以简单地通过强制开关闭合停止使用断路抑制器。通过将削波窗口的大小设置为零可以停止削波抑制器的工作或使其进入直接通过模式。另一方面,通过将衰减因子设置为1可以使定标抑制器进入直接通过状态。而且,通过将衰减窗口设置为零和/或将衰减因子设置为1可以使混合抑制器进入直接通过状态。
注意如果包括图1B的前端回声消除器140,图2的实施例将特别有效地工作。这因为在话音激励检测器210错误地指示在扬声器信号125中未出现话音时,在没有回声抑制器130的协助下,回声消除器140通常可以提供充分回声抑制的事实。换句话说,仅当扬声器信号125噪声较大时(因而远端话音稍微掩盖在可能的噪声中),话音检测器210可能犯这种错误,并且在第一个例子中远端用户对受噪声掩盖的回声较不敏感。然而无论是否包括回声消除器140,图2的系统200都提供出色的近端信号质量。
图3图示根据本发明另一方面构成的另一种回声抑制系统300。如图所示,示范性系统300包括图1A和1B的话筒110、扬声器120、回声抑制器130、回声消除器140和合成装置150,和增益控制处理器310和音量增益部件320。话筒输出115被连接到声音回声消除器140的音频输入和增益控制处理器310的第一参考输入。声音回声消除器140的声音输出130被连接到回声抑制器130的音频输入和增益控制处理器310的第二参考输入。抑制器音频输出135和舒适噪声信号被分别连接到合成装置150的第一和第二输入,合成装置150的音频输出155用作电话(未图示)的近端音频输入。
电话的远端音频输出125被连接到音量增益部件320的音频输入,音量增益部件320的音频输出被连接到话筒120的音频输入和回声抑制130和声音回声消除器140的参考输入。音量增益部件320的音频输出325还被连接到增益控制处理器310的第三参考输入,增益控制处理器310的控制输出315被连接到回声抑制器130的控制输入。音量控制信号324被连接到增益控制处理器310的第四参考输入和音量增益部件320的控制输入。
通常,图3的系统300的操作与图1B的系统101的操作相同。换句话说,声音回声消除器140动态地模拟从扬声器120到话筒110的声音路径,并消除由话筒110接收的任何扬声器声音。然后,回声抑制器130在需要时提供附加的回声衰减,并通过合成装置150选择添加舒适噪声以补偿由回声抑制器130衰减的近端噪声。然而,在图3的系统300中,增益控制处理器310根据本发明的特征控制回声抑制器130提供的衰减级别。
在图3的系统300中包括音量增益部件320以更好地解释增益控制处理器310的操作。通常,音量增益部件320根据音量控制信号324衰减电话音频信号125,并将衰减后的音频信号325发送给扬声器120。例如可以由近端用户调整音量控制信号。
根据本发明的一个方面,假定回声抑制器130是使至少一部分音频信号145乘以衰减因子α的定标抑制器或混合抑制器。在这种情况下,增益控制处理器310使用音量控制信号324、话筒信号115、扬声器信号125和/或消除器输出信号145通过控制处理器输出信号315提供衰减因子α。
具体地,增益控制处理器310使用参考信号115、145、324、325动态地测量环路或往返回程回声增益,该回声增益又用于计算抑制器衰减因子α。环路增益表示当电话音频信号125中的远端话音通过音量控制部件320,经扬声器120到话筒110的声音路径并通过回声抑制器140时被衰减的程度。因此,环路增益可以用于计算回声抑制器130应当提供的附加衰减的量,以便近端音频信号135中的回声被衰减到特定目标级别。
注意音量增益部件320提供的衰减级别是从音量控制信号324得知的。然而,根据话筒信号115、扬声器信号325和消除器输出信号145计算声音路径提供的衰减级别(称作信道增益)和回声消除器140提供的衰减级别(称作消除器增益)。例如在上面引入的美国专利申请US 09/005,149(标题为“在通信系统中改进回声抑制的方法和设备”和与此同时提交的)中描述了用于计算信道和消除器增益的改进方法。因为信道和消除器增益计算的相关具体细节对于理解本发明并不重要,因此为了简洁在此省略该计算的具体说明。
如上所述,给出从音量控制部件320的输入到回声消除器140的输出(或者如果不包括回声消除器140到扬声器1115的输出)的环路增益,增益控制处理器310可以计算抑制器衰减因子α,以便将近端音频信号155中的回声抑制到特定目标级别。然而,通过与目标级别固定的现有技术系统比较,图3的系统300的增益控制处理器310根据主要条件调整目标级别,以便回声抑制器130在近端音频信号155上引入最小失真。
换句话说,虽然现有技术系统一般将目标级别设置成相对严格固定的值(例如考虑单一的最坏情况,例如在没有近端背景噪声的情况下远端单方讲话),因而当不需要严格的目标级别时(例如当不存在单一的最坏情况时),使近端信号155的失真超过所需要的,图3的增益控制处理器310选择多个可能目标级别中最合适的一个,可能目标级别中的每一个最适合于一种特定的主要条件。例如,目标级别应当是等量严格的(例如-45dB或更低)。然而在双方讲话的时间内,远端用户对回声较不敏感,目标级别可以被稍微放松(例如-25dB或更低)。有利地,增益控制处理器310能够检测这些和其它主要条件并据此设置目标级别(因而抑制器衰减因子α)。因此,图3的系统300在任意给定的时间上在近端信号155上不引入比所需要的更多的失真。
为了检测近端单方讲话、远端单方讲话、双方讲话和高近端噪声等条件,增益控制处理器310使用话筒信号115、扬声器信号325和/或消除器输出信号145。例如,为了检测远端话音,增益控制处理器310可包括参考图2所述的扬声器话音激励检测器210。另外,增益控制处理器310可以包括话筒话音激励检测器以根据话筒信号115和/或消除器输出信号145检测近端话音。
本领域的技术人员将理解仅根据话筒信号115实现粗略话筒话音激励检测器的方法是公知的。另外,下面将利用伪代码描述根据回声消除器的输入和输出信号(例如根据话筒信号115和消除器输出145)检测近端话音的改进方法。因为检测近端话音的相关具体细节对于理解本发明并不重要,因此在此省略该细节。
特别应当说明当回声抑制器130工作并将音频信号145至少衰减到某一程度时(即当未如上所述使回声抑制器130旁路或进入直接通过模式时),上述目标级别选择处理是可以应用的。因此,本发明区别于根据近端话音的检测(例如在双方讲话的时间内)完全停止回声抑制器130的工作来避免近端信号失真的系统。因为这种系统在停止回声抑制器130工作时仅依靠回声抑制器140提供充分的回声抑制,这种系统经常不能满足当前电信标准的推荐目标(例如IS-55A推荐远端单方讲话时回声衰减-45dB和双方讲话时回声衰减-25dB)。
通过比较,本发明允许回声抑制器130在双方讲话的时间内保持工作,因而可以在所有时间上轻易地满足所推荐的目标。实验研究已经表明在远端单方讲话和双方讲话的时间内分别使用-56dB和-25dB的回声抑制目标,在最大回声抑制和最小近端信号失真的矛盾需要之间提供很好的平衡。本领域的技术人员将理解,尽管仅为两种主要条件(即远端单方讲话和双方讲话)明确提供目标级别,可以考虑其它多种主要条件(例如高和低电平的近端和远端噪声),并可以考虑提供其它可能的目标级别。
根据本发明的另一方面,图3的增益控制处理器310根据抑制器输入信号145中的回声噪声比的测量调整回声抑制器130。具体地,增益控制处理器310在抑制器输入145上动态地测量回声噪声比,并通过处理器控制信号315向回声抑制器130提供合适的控制信号。
在一种示范性实施例中,当所测量的回声噪声比低于预定阈值时。增益控制处理器310停止回声抑制器130的工作。换句话说,当回声实际上隐藏在背景噪声中或被其掩盖时,远端用户察觉不到回声,并且回声抑制器130在试图进一步抑制回声时不需要引入近端信号失真。因此,可停止使用或调整回声抑制器130以提供恰好足以防止啸声的正常级别的衰减。
实验研究已经表明从远端用户的角度来看-10dB或更低的回声噪声比提供足够的噪声掩盖。然而,可以将停用回声消除器130的噪声掩盖阈值实际设置得低于-10dB以避免由于回声噪声比的计算错误而错误地通过可察觉的回声。实验研究已经表明-18dB的噪声掩盖阈值对于此目的是有效的。
如上所述,可以以各种方式停止回声抑制器130工作。例如,可以使用旁路开关有效地停用任意类型的回声抑制器130,通过强制断路开关闭合可以停用断路开关抑制器。另外,通过将削波窗口大小设置为零可以停用削波抑制器,通过将抑制器衰减因子设置为1可以停用定标抑制器。通过将衰减窗口设置为零和/或将衰减因子设置为1可以停用混合抑制器。
在回声抑制器130是定标抑制器或混合抑制器时(即回声抑制器使至少一部分抑制器输入信号乘以衰减因子α时),回声与噪声比测量可以与上述环路增益概念组合以提供其它优点。例如,在本发明的一种实施例中,增益控制处理器310如上所述计算从音量增益部件320的输入到回声抑制器130的输入的环路增益,然后计算在背景噪声中掩盖回声所需要的抑制器衰减因子α(即衰减因子α将使音频输出信号155具有例如-18dB的回声与噪声比)。注意,因为回声抑制器130衰减整个音频信号145(包括回声、话音和噪声),本实施例预先假定舒适噪声被添加到抑制器输出信号135以补偿由回声抑制器130去除的背景噪声。
根据示范性实施例,通过测量音频输入中的总能量并通过估计音频输入中的噪声能量级别计算回声抑制器130音频输入中的回声与噪声比。具体地,从总能量测量中减去噪声能量估计,并使结果差值(表示回声能量级别)除以噪声能量估计以提供估计的回声与噪声比。本领域的技术人员将理解信号中能量和估计信号中噪声电平的测量方法是公知的。另外,利用下面的伪代码说明计算噪声电平估计的改进方法。因为噪声电平估计的相关具体细节对于理解本发明并不重要,因而在此省略这些细节。
有利地,本发明的所有上述特征可以组合在单个回声抑制系统中以提供高级的回声抑制器控制和最佳的近端信号质量。为证明这一点,图4图示一种示范性算法400,在该算法中使用本发明的多个方面调整用于回声抑制器130的衰减因子α。因为示范性算法400使用环路增益的概念,算法400主要可应用于定标抑制器和混合抑制器。然而,本领域的技术人员将理解示范性算法400的某些方面可应用于上述所有类型的抑制器。
如图所示,算法400开始于步骤S10,并在步骤S20进行扬声器话音激励检测器210是否指示出现远端话音的判决。如果没有,则回声消除器130进入直接通过模式并且该程序在步骤S60结束。然而,如果扬声器话音激励检测器210指示远端话音,则在步骤S30进行关于是否已经检测到近端话音的判断。
如果尚未检测到近端话音,则在步骤S35计算实现预定远端单方讲话目标所需的衰减因子。然而,如果已经检测到近端话音,则在步骤S40计算实现预定双方讲话目标所需的衰减因子。在任一种情况下,在步骤S45计算实现预定噪声掩盖目标所需的衰减因子。因而,在步骤S60,将衰减因子α设置成根据噪声掩盖(在步骤S45)和话音检测(在步骤S40或S35)计算的衰减因子中较不严格的衰减因子。然后该程序在步骤S60结束。
用下面的伪代码提供图4的算法400的示范性实施例。在伪代码中,假定定标或混合回声抑制器使用衰减或增益因子echoSuppressorGain操作。
If farEndVoiceFlag==0,EchoSuppressorGain=1Else,If nearEndVoiceFlag==1,LoopEchoGainGoal=-56dBElse,LoopEchoGainGoal=-56dBEndEchoSuppressorGainMax(loopEchoGainGoal/loopEchoGain,…EchoToNoiseGoal/echoToNoise)End注意在图4的算法中,根据是否检测到近端话音(在步骤S30)计算噪声掩盖目标(在步骤S45)。然而,实际上,实验研究表明当包括前端回声消除器140时,根据典型的双方讲话目标计算的衰减因子α(例如-25dB)始终大于(并因而导致较小的失真)根据典型的噪声掩盖目标计算的衰减因子α(例如-18dB)。结果,当已经检测到双方讲话时不必为噪声掩盖目标计算衰减因子α,实际上可以节省DSP周期。
还注意到图4的算法400在抑制器输入上的回声噪声比已经等于或低于噪声掩盖目标时,并不试图使回声抑制器130不工作。原因在于实验研究已经表明,对于定标和混合抑制器,最好使回声抑制器130继续工作(使用根据噪声掩盖目标的衰减因子α),以便不会由于不正确的回声和噪声估计错误地通过可察觉的错误(例如用于计算回声与噪声比本身的估计)。
计算机仿真已经表明根据本发明教导(即根据图4的算法)构成的回声抑制系统可以显著地降低近端话音失真和一般由非线性回声抑制器引入的背景噪声。例如,当扬声器话音激励检测器210指示没有远端话音时停止回声抑制器130的工作产生远端单方讲话条件下的理想、无失真近端话音和噪声。即使当扬声器信号中有恒定噪声时这也是正确的。
另外,根据近端话音的检测为工作回声抑制器调整回声抑制目标产生双方讲话条件下大为改进的近端话音和噪声(在组合音量控制、声音回声路径和线性回声消除器的增益时,理想近端话音和噪声是-25dB或更好,通常是这种情况)。当扬声器话音激励检测器210错误地将噪声检测为话音时,为工作回声抑制器调整回声抑制目标还用于提高近端单方讲话条件下的近端话音和噪声。
而且,根据抑制器输入上回声和噪声的测量控制回声抑制器改善了噪杂汽车条件下的近端话音和噪声。例如,在远端单方讲话时,降低近端背景噪声的衰减。结果,需要较少的舒适噪声以使远端用户放心,远端用户觉察到的背景噪声特征被更好地保持。而且,在双方讲话或近端单方讲话的周期内,即使在扬声器话音激励检测器210和近端话音检测器故障时也可以改善近端话音和噪声。因此,在带有大量近端噪声的近端单方讲话的过程中(即汽车免提应用中的道路和车辆噪声),本发明提供三种机制以不管恒定扬声器噪声而确保减少近端话音失真和噪声。
通过例子,如在实际回声抑制系统中所结合的,图4算法400的另一种实施例在下面提供的伪代码中被描述。编写该伪代码以仿真如使用32位数字信号处理器所实现的示范性回声抑制系统。本领域的技术人员将理解该代码在本质上是示范性的,并且可以使用各种硬件配置来实现其等价代码。该示范性回声抑制系统包括在上面引用的美国专利申请US 08/852,729中描述的改进回声消除器的修改版本和在上面引用的美国专利申请_______(标题为“在通信系统中改进回声抑制的方法和设备”和与此同时提交的)中描述的AC-中心衰减器。
%用于MATLAB的AEC和ANLP模拟脚本程序
%在运行该脚本程序之前,设置下列变量%inFile=输入文件名称,left=远端,right=AEC输出。
%outFile=输出文件名称,left=ANLP输出,right=AEC输出。
%所有文件使用DAT-Link的原始格式。
%estnoise.m包括估计噪声功能。
%词表%EC=回声消除器=线性回声抑制器%AEC=音频回声消除器=扬声器-回声消除器%NLP=非线性处理=残余回声抑制器=AC中心衰减器%ANLP=音频非线性处理%VAD=话音激活检测器%用分数表示的最大正值。
0NE=32767/32768;%读取包含远端和近端信号的文件。
FidIn=fopen(inFile,‘r’);If fidIn==-1Error ([‘Error opening file’inFile])End[Lrmatrix,wordCount]=fread(fidIn,[2,inf],’int16’);fclose(fidIn);%在更新综合期间样本数量。
FRAME-SIZE=160;%给出的帧尺寸越大对双方谈话和近端噪声的坚固性越大%其往往趋于零。
%较大则改善了检测收敛的能力因为相关更新与帧尺寸成比例增长而非相关(噪声)随帧%尺寸平方根增长。
%较小则改善对变化的响应时间(回声路径,单一≥双方谈话)和加速收敛。
%较小也改善丢弃元音声音的能力。
%160用于容易移植每帧160个样本的TDMA电话。
%产生的20ms帧对于将语音分成静态信号段是近似最佳的。
NFRAMES=floor((wordCount/2)/FRAME-SIZE);%处理的帧数量。
Clear wordCountNsamples=NFRAMES*FRAME-SIZE;用于调试的样本形式向量%%从分开的文件加载话筒(上行)和扬声器(下行)VAD输出。如果没有找到每个文件,%运行近端和远端声音文件上的C可执行文件,并在具有相同前缀文件中存储VAD输出。%fidIn=fopen([inFile‘up vad’],‘r’);if fidIn==-1disp([‘File=’inFile‘up vad not found--creating… ’])fidout=fopen(‘vad in.raw’,‘ w’);fwrite(fidout,LRmatrix(2,),‘int16’); % 上行音频fclose (fidout);!nrsim-s=f vad_in.raw junk vad out.bit!rm vad in.raw!rm junk.fltfidIn=fopen(‘vad out.bit’,‘r’);if fidIn==-1error(‘ Error opening file=vad out.bit’)endmicVad=fread(fidIn,NFRAMES,‘int8’);!rm vad_out.bitfclose(fidIn);fidout=fopen([inFile‘_up_vad’],‘w’);fwrite(fidout,micVad,‘int8’);fclose(fidout); elsemicVad=fread(fidIn,NFRAMES,‘int8’);fclose(fidIn);endfidIn=fopen([inFile‘down vad’] ,‘r’);if fidIn==-1disp([‘File=’inFile‘down vad not found--creating…’])
fidout=fopen(‘vad_in.raw’,‘w’);fwrite(fidout,LRmatrix(1,),‘int16’); %下行音频fclose(fidout);!nrsim-s=f vad_in.raw junk vad_out.bit!rm vad_in.raw!rm junk.fltfidIn=fopen(‘vad_out.bit’,‘r’);if fidIn==-1error(‘Error opening file=vad_out.bit’)endspeakerVad=fread(fidIn,NFRAMES,‘int8’);!rm vad_out.bitfclose(fidIn);fidout=fopen([inFile‘_down_vad’],‘w’);fwrite(fidout,speakerVad,‘int8’);fclose(fidout);elsespeakerVad=fread(fidIn,NFRAMES,‘int8’);fclose(fidIn);end%将输入乘比例使用-1到1的范围。
Lrmatrix=Lrmatrix/32768;%在一个样本帧上累计右移位数值的比特数量。
FRAME-BITS=ceil(log2(FRAME-SIZE));%将能量量化成32位的比例因子(Z8.23格式w/FRAME-SIZE=160)ENERGY-SCALE=2^(31-FRAME-BITS);%在基准延迟线中的抽头数量。
%它必须足够长使高延迟抽头几乎与远端信号不相关而只具有近端能量。
AEC-REF-TAPS=512;%在FIR回声估计滤波器中的抽头数量。
AEC-COEF-TAPS=256;%用于计量近端能量的更新向量高延迟部分中的抽头数量。
AEC-NEAR-TAPS=128;
%捕获汽车噪声样本向量的长度。
COMFORT-NOISE-SIZE=128;%计算在更新向量峰值/基线比的阈值用于确定最大更新增益。对于统一在[-1,1]范围内的噪声,所希望的峰值更新幅度是g*FRAME-SIZE/3,同时所希望非相关抽头更新向量的RMS是g*sqrt(FRAME-SIZE)/3,其中g四回声路径增益。因此,最大更新向量峰值/基线比是sqrt(FRAME-SIZE)。
%可是,话音没有类似噪声的恒定包络。因为FRAME-SIZE远远小于更新向量长度,语音的一个突发有时在更新向量区内,其中峰值不在计量基线的区域中计量。因此,实际峰值/基线比可以非常高(>300)。将阈值设置太低会引起由于即使对噪声或双方谈话条件下高能量远端信号的高增益更新产生的不稳定。
%将阈值设置太高会引起由于只对大的回声路径变化高能量远端信号的高增益更新产生的慢衰减。
%经验化地确定该阈值作为一种折衷。
AEC-MAX-GAIN,THRESH=16;%对于噪声的峰值/RMS与帧尺寸无关。用于抵制近端话音/噪声和远端周期性信号(单音或元音)的阈值被以经验导出。
AEC-BASELINE-THRESH=5.5;%为状态尺度预先计算用作乘法器的常量。
AEC-STATUS-GAUGE-SCALER=floor( 32768/…… ( AEC-MAX-GAIN-THRESH-AEC-BASELINE-THRESH))/32768;%产生FIR系数的增益轮廓。该轮廓大致与汽车内系数的希望范围匹配。这样,包含周期性成分(元音)的更新被强迫服从合适的指数衰落特性和使分歧最小。在较高延迟抽头上的较低增益也减少了更新噪声对系数的影响。高轮廓的总效果是允许较高更新增益而没有不稳定。
%由于所有系数具有16位动态范围,较高延迟抽头也具有作为该轮廓结果的较好量化。该轮廓通过在右移位中间时刻计算FIR 64个抽头实现。profile=ones(AEC_COEF TAPS,1);for k=2(AEC COEF TAPS/64),profile((k*64-63)(k*64))=ones(64,1)*2^(1-k);end%分配调试向量以加速执行。aecUpdateFactor=zeros(1,NFRAMES);aecChanGainHist=zeros(1,NFRAMES);aecSpeedHist=zeros(1,NFRAMES);aecVoiceGainHist=zeros(1,NFRAMES);aecVoiceGainBaseHist=zeros(1,NFRAMES);aecNearRatioHist=zeros(1,NFRAMES);aecNearGainHist=zeros(1,NFRAMES);aecEchoGainHist=zeros(1,NFRAMES);aecInNoiseHist=zeros(1,NFRAMES);aecInEchoNoiseHist=zeros(1,NFRAMES);aecInVoiceHist=zeros(1,NFRAMES);aecInEchovoiceHist=zeros(1,NFRAMES);anlpInVoiceHist=zeros(1,NFRAMES);anlpInNoiseHist=zeros(1,NFRAMES);anlpDeltaHist=zeros(1,NSAMPLES);anlpGainHist=zeros(1,NFRAMES);%初始化变量aecRef=zeros(1,AEC REF TAPS); %使用量新值valuesaecCoef=zeros(AEC COEF TAPS,1); %注释thisaecInNoise=FRAME SIZE;%注释thisaecInEchoNoise=aecInNoise;%注释thisanlpInNoise=aecInNoise; %注释thisaecChanGain=ONE; %注释thisaecVoiceGain=ONE; %注释thisaecVoiceGainBase=aecVoiceGain; %注释thisaecNearGain=aecVoiceGain; %注释thisaecEchoGain=aecVoiceGain; %注释thisanlpComfortNoiseInold=0; %注释thisanlpComfortNoiseoutold=0; %注释thisanlpComfortNoise=zeros(1,COMFORT NOISE_SIZE); %注释thisanlpArCoef=0.75; %注释thisaecNearRatio=0; %只初始化记录aecInNoiseStateVars=[aecInNoise 0 0] ;aecInEchoNoiseStateVars=[aecInEchoNoise 0 0];anlpInNoiseStateVars =[anlpInNoise 0 0];anlpSeed=1;anlpArGain=1-anlpArCoef;anlpRefEnvelope=0;anlpoutLast=0;anlpNearSpeechCount=0;anlpNearSpeechFlag=0;%显示([‘aecCoef(1)=’dec2hex(aecCoef(1)*32768+(aecCoef(1)<0)*65536)])%显示([‘aecCoef(2)=’dec2hex(aecCoef(2)*32768+(aecCoef(2)<0)*65536)])%显示([‘aecInNoise=’dec2hex(aecInNoise*2^31)])%显示([‘anlpInNoise=’dec2hex(anlpInNoise*2^31)])%显示([‘aecChanGain=’dec2hex(aecChanGain*32768)])%显示([‘aecVoiceGain=’dec2hex(aecVoiceGain*32768)])%显示([‘aecVoiceGainBase=’dec2hex(aecVoiceGainBase*32768)])%显示([‘aecEchoGain=’dec2hex(aecEchoGain*32768)])%显示([‘anlpComfortNoiseInold=’dec2hex(=anlpComfortNoiseInold*32768)])%显示([‘anlpComfortNoiseoutold=’dec2hex(anlpComfortNoiseoutold*32768)])%显示([‘anlpArCoef=’dec2hex(anlpArCoef*2^31)])%显示([‘anlpArGain=’dec2hex(anlpArGain*32768)])fidout=fopen(outFile,‘w’);for frame=1NFRAMES,frame%显示帧数量以指示程序。progress.%%AEC帧前部分%%由于在用于更新FIR系数的基准向量抽头与用于近端能量相关的抽头之间有一个间隙,不需要对基准向量的每个抽头计算更新向量。因此,更新向量由特别用于两个目的的子向量代表。
%清除在一帧上积累的更新子向量。
aecUpdate=zeros(AEC-COEF-TAPS,1);%用于FIR系数更新
aecUpdateNear=zeros(AEC-NEAR-TAPS,1); %用于近端计量%清除其它帧积累aecEchoEstEnergy=0;%重新设置块浮点变量。
aecShiftPending=0;aecErrorShift=0;%使上行和下行PCM音频样本进入缓存器。
downlinkAudio=LRmatrix(1,(frame-1)*FRAME-SIZE+1frame*FRAME_SIZE);uplinkAudio=LRmatrix(2,(frame-1)*FRAME-SIZE+1frame*FRAME_SIZE);%在一个帧上积累AEC近端输入能量aecInEnergy=sum(uplinkAudio.^2);%量化能量为32位。
aecInEnergy=floor(aecInEnergy*ENERGY-SCALE)/ENERGY-SCALE;%AEC样本部分for k=1FRAME-SIZE,%将远端(扬声器)样本偏移到基准延迟线和计算FIR输出。在DSP中,两个操作在一个指令中。
aecRef=[downlinkAudio(k)aecRef(1AEC-REF-TAPS-1)];%测试码开始%下列码快速逼近注释,比特-精度码。
aecEchoEst=aecRef(1AEC-COEF-TAPS)*(aecCoef.*profile);aecEchoEst=max(min(round(aecEchoEst*32768)/32768,ONE),-1);
%测试码结束aecEchoEst=0;for m=(AEC-EOEF-TAPS/64)-12;aecEchoEst=aecEchoEst+aecRef(m*64-63m*64)*aecCoef(m*64-63m*64);aecEchoEst=max(min(aecEchoEst,ONE),-1)2;%量化S.15格式aecEchoEst=floor(aecEchoEst*2^31)/2^31;结束aecEchoEst=aecEchoEst+aecRef(164)*aecCoef(m*64);aecEchoEst=max(min(aecEchoEst,ONE),-1);%量化S.15格式%当将具有恰好0.5的分数的负数舍入时加入2^(-17)强制一补数浮点起与二补数的作用。
aecEchoEst=round(aecEchoEst*32768+2^(-17))/32768;aecEchoEst=max(min(aecEchoEst,ONE),-1);%在一个帧上积累回声估计能量。
%为改善小信号性能和进行相同方式的计量作为其它能量积累,在环路通路之间保留了整40位累加器。
aecEchoEstEnergy=aecEchoEstEnergy+aecEchoEst^2;%计算 AEC output=near-end (microphohe)input-回声估计值。
uplinkAudio(k)=max(min(uplinkAudio(k)-aecEchoEst,ONE),-1);%累计系数更新=误差相关(uplinkAudio(k))和基准。使用块浮点表达式,其中aecErrorShift是指数而aecUpdate/aecUpdateNear( )是尾数。
T=uplinkAudio(k)*2^aecErrorShift;%量化S.15格式T=floor(T*32768132768);if aecShiftPending,
ASM=-1aecErrorShift=aecErrorShift-1;aecShiftPending=0;elseASM=0;end%计算用于更新FIR系数的区间。
aecUpdate=aecUpdate+T*aecRef(1AEC-COEF-TAPS);%计算用于计量近端能量的区间。
aecUpdateNear=aecUpdateNear+T * aecRef(AEC-REF-TAPS-AEC-NEAR-TAPS+IAEC-REF-TAPS);%量化S.15格式%当将具有恰好为0.5的分数的负数舍入时加入2^(-17)强制一补数浮点起二补数作用。
aecUpdate=round(aecUpdate*32768+2^(-17))/32768;aecUpdateNear=round(aecUpdateNear*32768+2^(-17))/32768;aecUpdate=max(min(aecUpdate,ONE),-1);aecUpdateNear=max(min(aecUpdateNear,ONE),-1);aecUpdate=aecUpdate*2^ASM;aecUpdateNear=aecUpdateNear*2^ASM;%在可能的右位移之后量化S.15格式。
aecUpdate=floor(aecUpdate*32768)/32768;aecUpdateNear=floor(aecUpdateNear*32768)/32768;%找到更新向量的峰值平方(假设在前面128个抽头中)。
%目的是获得峰值的绝对值,但是在DSP中峰值平方占较少周期,甚至具有帧结尾的平方根。
aecUpdatePeak2=max(aecUpdate(1128).^2);%标志指示更新是否需要在下个环路中除以2。
aecShiftPending=aecUpdatePeak2>0.25; %0.25=0.5^2
end%量化能量为32位。
aecEchoEstEnergy=floor(aecEchoEstEnergy*ENERGY-SCALE)/ENERGY-SCALE;%%AEC帧后的部分%aecOut=uplinkAudio; %将输出保留在文件用于调试。
%在一个帧上积累AEC输出能量。
aecOutEnergy=sum(uplinkAudio.^2);%量化能量为32位。
aecOutEnergy=floor(aecOutEnergy*ENERGY-SCALE)/ENERGY-SCALE;%对于更新向量每个元素实际基准能量是不同的。aecUpdate(1)将使用来自aecRef(1)的能量,aecUpdate(2)将使用来自aecRef(2)的能量,等等。为减少复杂性,使用单一数字表示基准能量。
%当基准能量被用于计量信道回声增益以确定适应速度或标准化更新(NLMS),使用太小值将不会引起不稳定性。在此实现的折中方案使用端点的最大值,其中profile=1。
aecRefEnergy=max(sum(aecRef(1FRAME-SIZE).^2),……sum(aecRef(64FRAME-SIZE+63).^2));%量化Z8.7格式aecRefEnergy=floor(aecRefEnergy*128)/128;%计量更新基线作为高延迟单元的RMS,其中误差与远端信号之间的相关性希望为0。
%在最低有效位中加1以保证量化后aecUpdateBase较大和aecPeakToBase较小。这避免了对较高回声相关性的错误印象。
%在底层操作产生与顶层相同的结果后在最低有效位中加入1,除了所有截短位等于零的少有情况。
aecUpdateBase=sum(aecUpdteNear.^2)/AEC-NEAR-TAPS;
%对Z.31格式量化平方的中间结果aceUpdateBase=floor(aecUpdateBase*2^31)/2^31;aceUpdateBase=sqrt(aecUpdateBase);%量化Z.15格式aecUpdateBase=floor(aecUpdateBase*32768+1)/32768;%查找更新向量的峰值幅度。
aecupdatePeak=sqrt(aecUpdatePeak2);%计算更新峰值/基线比。
aecPeakToBase=aecUpdatePeak/aecUpdateBase;%从4分数为量化Z11.4格式足够了。
aecPeakToBase=floor(aecPeakToBase*16)/16;%根据更新峰值基线比计算状态尺度(范围=
)。即使峰值/基线比随帧尺寸和基线阈值的改变可能改变,用于下行数据流处理的该尺度保持相同。
%对于近端话音。噪声或远端周期信号(元音),尺度<0.1%例如,对于具有频率941Hz和1209Hz的DTMF单音的第一帧被发现产生%aecPeakToBase=3.5和,因此aecStatusGauge=0).%对于双方谈话,尺度<0.3%对于远端信号语音%不论噪声如何当消除器不收敛时,尺度=1%如果近端安静,尺度=1直到接近完全收敛。
%由于消除器收敛,只有能量比近端噪声高电平的残余回声使尺度=1。
%因此,近端噪声很少引起更新,不减少更新增益。
aecStatusGauge=(aecPeakToBase-AEC-BASELINE-THRESH)*…AEC-STATUS-GAUGE-SCALER;aecStatusGauge=max(min(aecStatusGauge,ONE),0);%对Z.15格式量化aecStatusGauge=floor(aecStatusGauge*32768)/32768%估计在AEC输入处的噪声帧能量。=estnoise(aecInEnergy,(micVad(frame=0)&(aecStatusGauge=0),aecInNoiseStateVars);aecInNoise=aecInNoiseStateVars(1);aecInNoise%显示状态aecInNoiseHist(frame)=aecInNoise; %保留用于调试%估计在AEC输入处的回声增益(信道增益)。
%只在远端信号语音期间更新估计值(speakerVad(frame)==1)&(aecStatusGauge>0.3),当该比值正确时不管基准计量包括话音和噪声同时AEC输入计量包括仅话音(aecInVoice>aecInNoise*8),和当基准能量不受量化的明显影响(aecRefEnergy>=10/128)。瞬时增益计量不非常准确,因为时间为校准和频谱改变。
%因此,使用一个平均处理。回声消除器滤波器系数的标准是信道增益的非常好的长期估计值。可是,它不能足够快地跟踪正改变的回声路径。
%由于信道增益估计值也控制线性回声消除器的自适应速度,如果估计值尽可能与线性回声消除器无关可以改善稳定性。因此,使用下列方案%如果瞬时计量(aecDhanGainTrial)少于估计值(aecGhanGain),该估计值呈指数急剧起伏。
为加速自适应,估计值被直接设置为瞬时计量,如果误差大于50%,和估计值呈指数急剧起伏如果误差小于12.5%即(aecChanGain-aecGhanGainTrial)/4>aecChanGain/32aecChanGain-aecChanGainTrial>aecChanGain/8=aecChanGain*0.125%如果瞬时计量大于估计值,如果近端话音在计量中不占明显优势(aecChanGainTrial<2)估计值呈指数上升。使用相对比较例如(aecChanGainTrial<2*aecChanGain)将无效,因为当实际信道增益快速跳动时没有更新出现。使用下降时间常数1/8的上升时间常数有助于在瞬时计量中容忍近端话音。很难区别近端语音和当信道回声增益变坏的情况。上升时间常数在此确定了跟踪速率,它按照经验被确定。aecInvoice=max(0,aecInEnergy-aecInNoise);aecInVoiceHist(frame)=aecInVoice;if(speakerVad(frame)==1)&(aecStatusGauge>0.3)&…(aecInVoice>aecInNoise*8)&(aecRefEnergy>=10/128),%量化acelNVoice为4Z8.20格式,以用作被除数获得商所需要的比例。
aecChanGainTrial=floor(aecInVoice*2^20)/2^20 / aecRefEnergy;%量化和限制系数为Z2.13格式aecChanGainTrial=min(4*ONE,floor(aecChanGainTrial*2^13)/2^13);%计算系数的平方根aecChanGainTrial=sqrt(aecChanGainTrial);%量化根为Z1.14格式aecChanGainTrial=floor(aecChanGainTrial*2^14)/2^14;if(aecChanGainTrial<aecChanGain/2),aecChanGain=aecChanGainTrial;elseif(aecChanGain>aecChanGainTrial),aecChanGain=aecChanGain-…max((aecChanGain-aecChanGainTrial)/4,aecChanGain/32);elseif(aecChanGainTrial< 2*ONE),aecChanGain=min(ONE,aecChanGain+max(aecChanGain/256,2^(-11)));end%量化为Z.15格式aecChanGain=f1oor(aecChanGain*32768)/32768;%保留调整aecChanGainHist(frame)=aecChanGainTrial;elseaecChanGainHist(frame)=ONE;endaecChanGain %显示状态aecSpeedHist(frame)=aecChanGain;%保留调整%再次确定更新。
%只要增益小于或等于1使用NLMS产生自适应速率常数(与远端信号幅度无关)。
%使用max运算产生更快收敛,然后在分母上加1,因为产生的增益较高。
%使用AEC基准和近端输入能量的最大值限制标准化增益,当有近端噪声和/或话音时。不使用AEC输出能量而使用AEC近端输入能量,因为在收敛后不需要高增益,和因为稳定性不是通过使用基于AEC输出的另一个参数控制AEC更新增益来改善。aecInEnergy将小于没有近端话音或噪声的aecRefEnergy,以便避免话筒过载(由于话筒增益是按照最大近端语音电平设置的)。如果保证远端信号语音具有低近端噪声(aecInEnergy/16>=aecOutEnergy)能量乘数被设置为8。反之,被设置为16。因此,当汽车安静时自适应更快。太小的能量乘数引起较小稳定性,在自适应中产生过大叫声在回声消除器输出中产生尖峰信号。过大叫声也阻碍了具有正改变回声路径的远端信号语音与近端语音之间的区别。太大乘数在混乱后立即增加了回声增益。在分子中,使用尺度改变按条件的增益。还使用信道回声增益作为乘数优化信道自适应速率。没有该乘数,自适应或对于高信道增益慢于需要或对于低信道增益不稳定。使用自适应滤波器系数标准而非基于能量信道增益产生长期更精确和连续的估计值,但是在回声路径改变的短期内速率和稳定性必须折中。
if(aecInEnergy/16>=aecOutEnergy),aecDenom=max(1,8*max(aecRefEnergy,aecInEnergy));%为调试,设置因子等于负尺度值aecUpdatePactor(frame)=-aecStatusGauge;elseaecDenom=max(1,16*max(aecRefEnergy,aecInEnergy));end%为调试,设置因子等于尺度值aceUpdateFactor(frame)=aecStatusGauge;end%量化Z12.3格式。
aecDenom=floor(8*aecDenom)/8aecNumer=aecChanGain*aecStatusGauge;%量化22Z.18格式。
aecNumer=floor(aecNumer*2^18)/2^18aecUpdateGain=min(aecNumer/aecDenom,ONE);%量化Z.15格式aecUpdateGain=floor(aecUpdateGain*32768)/32768;%使用自适应增益将更新向量加入到系数向量中。
%在作为FIR系数使用之前aecCoef被乘以轮廓aecCoef=aecCoef+(aecUpdate*2^(-aecErrorShift)*aecUpdateGain);%量化S.15格式
%加2^(-17)以强制一补数浮点起二补数浮点的作用,当舍入具有恰好0.5的分数的负数时。
AecCoef=round(aecCoef*32768+2^(-17))/32768;AecCoef=max(min(aecCoef,ONE,-1);%噪声抑制器将在此处理uplinkAudio。
%通过只在一个子程序中使用aecUpdate和aecUpdateNear,它们可以在临时存储器中,可%重叠使用。
%ANLP帧前部分%在ANLP输入处积累能量,该处通过噪声抑制器被连接到AEC输出。
anlpInEnergy=sum(uplinkAudio.2^);%量化能量为32位。
anlpInEnergy=floor(anlpInEnery*ENERGY-SCALE)/ENERGY-SCALE;%在ANLP输入处估计噪声帧能量。
%由于回声估计值来自扬声器信号而使用speakerVad。=estnoise(anlpInEnergy,…(micVad(fram)==0)&(aecStatusGauge==0),anlpInNoiseStateVars);anlpInNoise=anlpInNoiseStateVars(1);anlpInNoiseHist(frame)=anlpInNoisi;%保留调整%当确认没有话音时计算舒适噪声。
if confirmedNoVoiceFlag,anlpComfortNoise=uplinkAudio(1COMFORT-NOISE-SIZE);%在一阶ARMA噪声模型形式中使用NLMS算法估计anlpArCoef% (1-anlpArCoef)*(1-0.8125*z^-1)/(1-anlpArCoef*z^-1)%该ARMA模型将用于滤波白噪声以获得听起来象汽车噪声的噪声。
%NLMS算法努力使下列表达式最小% error=uplinkAudio*(1-anlpArCoef*z^-1)/(1+0.8125*z^-1)%误差与uplinkAudio*z^-1之间的相关性是对系数估计值的更新。
%anlpInEnergy用于标准化更新增益以提供与电平无关的自适应速率。计算环路外的非零分母以保留MIPS。
anlpDenom=4*max(1/128,floor(anlpInEnergy*128)/128);error=0for I=2FRAME-SIZEerror=-0.8125*error;%量化5S4.31格式(10*uplinkAudio的最大值)error=floor(error*2^31)/2^31;error=error+uplinkAudio(i-1i)*[-anlpArCoef;1];quotient=uplinkAudio(i-1i)*floor(error*2^12)/2^12/anlpDenom;quotien=max(min(quotient,ONE),-1);%量化S.15格式quotient=floor(quotient*32768)/32768;anplArCoef=anlpArCoef+quotient;anlpArCoef=max(min(anlpArCoef,ONE),-1);endanlpArGain=1-anlpArCoef;%标绘舒适噪声响应频率用于调整。
Plot((08191)/8192*4000,…20*log10(abs(freqz(anlpArGain*[10.8125],[1-anlpArCoef],8129))))axis(
)pause(1)end%在AEC输入处估计回声的噪声帧能量。
%由于回声估计值来自扬声器信号使用speakerVad。=estnoise(…aecEchoEstEnergy,(speakerVad(frame)==0)&(aecStatusGauge==0),…aecInEchoNoiseStateVars);aecInEchoNoise=aecInEchoNoiseStateVars(1);aecInEchoNoiseHist(frame)=aecInEchoNoise;%保留调整testlHist(frame)=aecInEchoNoiseStateVars(2);%保留调整test2Hist(frame)=aecInEchoNoiseStateVars(3);%保留调整aecInechoNoiseStateVars %显示状态状态%估计话音能量估计值。不使它们低于零。
aecInEchoVoice=max(0,aecEchoEstEnergy-aecInEchoNoise);aecInEchoVoiceHist(frame)=aecInEchoVoice;aecNearVoice=max(0,aecInVoice-aecInEchovoice);anlpInvoice=max(0,anlpInEnergy-anlpInNoise);anlpInVoiceHist(frame)=anlpInVoice;%向上渗漏线性回声消除器基线回声增益估计值。
%将其用于与瞬时回声增益比较以检测近端语音和近端语音期间的ANLP增益。
%当瞬时回声增益变差时上渗漏快得足以跟踪。该渗漏作为快速跟踪避免在具有变化回声路径远端单方谈话期间近端语音检测失败和在远端话音/噪声期间近端话音/噪声失真最小之间的折中。当远端单方谈话在回声路径已经改变后开始时,aecNearGain可能下降,上升一些,然后下降。如果aecNearGain上升明显高于aecVoiceGainBase,将检测近端语音。如果这些发生,在aecNearGain上的渗漏可以增加防止此事发生。经验性地找出5/4096的渗漏常数提供足够的跟踪速度。可是,增加渗漏减少了在双方谈话期间近端语音的检测。
aecVoicegainBase=min(aecVoicegainBase+1/8192,ONE);%再次计算线性回声消除器话音,排除该信道。
%涉及的信道增益将使近端语音检测不可靠。
%计算线性回声消除器输入和输出的话音能量比的根。
%原始计量不以话音是否来自近端,远端或两者为条件。
%在ANLP输入处提取线性回声消除器输出,因为该信号已经通过了噪声抑制器,使计量更精确。靠对能量的计量包括回声中扬声器的回声失真,不进行交叉相关。比较回声消除器输入和输出的能量也避免当比较回声消除器输出与基准时出现的时间排队问题(由于信道延迟)。
%只有当不被量化破坏(aecInVoice>8/2^7),当出现话音(aecInVoice>aecInNoise*8),和当残留回声可计量(anlpInVoice>anlpInNoise/2)时,计量增益。
%远端信号中的周期性成分不减少计量的精确度。
if(aecInVoice>max(8/2^7,aecInNoise*8))&…(anlpInVoice>anlpInNoise/2),aecVoiceGain=min(ONE,sqrt(anlpInVoice/(follr(aecInVoice*2^7)/2^7)));%量化Z.15格式aecVoicegain=floor(aecVoicegain*32768)/32768;%对总话音计量近端话音比。
%这产生很少的由于改变具有远端单方谈话的回声路径引起的近端话音失误指示,因为它只取决于回声估计值的能量,而不依赖在输出处回声被消除得如何好。可是,就象aecVoiceGain,当消除器是总的未训练时近端话音失误指示也是可能的。
%由于话音计量是能量单位常用比值包括一个平方根。可是,通过直接使用能量比值可以获得近端话音与不良消除器训练之间更大的差别。这也节省MIPS。
aecNearRatio=min(ONE,aecfNearVoice/(floor(aecInvoice*2^7)/2^7));%量化Z.15格式aecNearRatio=floor(aecfNearratio*32768)/32768;%在远端语音期间计量线性回声消除器基线回声增益估计值。无论何时存在远端单方谈话都计量(aecStatusGauge>0.1)以保证参数跟踪真实回声增益(不是噪声)。反之,可能听到回声。当话音增益低于基线估计值更新基线回声增益估计值,因为这指示远端单方谈话的高可能性。通过使用当它高于基线时通过使用渗漏和不使基线跟踪话音,基线对噪声和近端语音非常牢固。
if(aecStatusGauge>0.1),aecVoiceGainBase=min(aecVoicegainBase,aecvoiceGain);end%在近端语音期间计量线性回声消除器话音增益,和在远端单方谈话期间(采用话音增益的最小值)重新设置。这将用于对话音增益基线的比较以检测双方谈话。近端语音可能出现的唯一可使用指示符是回声消除器尺度(aecStatusgauge<0.3)和回声消除器输出包含足够能量,该能量可能不只是残余回声(anlpInVoice>anlpInNoise*8)。记住远端语音中的周期性成分该尺度低。因此,需要额外装置区别因回声路径改变或扬声器失真话音增益突然变坏的情况和有近端语音的情况。当在远端单方谈话期间话音增益突然变坏时,该持续时间往往很短。因此,滤除在该参数中的增量通常拒绝了远端单方谈话事件。滤波器的时间常数是远端单方谈话拒绝与双方谈话确认速度之间的折中,它被以经验确定。
aecNeargainLast=aecNearGain;aecNearGain=min(aecNearGain;,aecVoiceGain);if(aecStatusGauge<0.3)&(anlpInVoice>anlpInNoise*8),aecNearGain=aecNearGain+(aecNearGain-aecNearGain)/8;%量化为Z.15格式aecNearGain=floor(aecNearGain*32768)/32768;end%使用近端语音三个检测方法的任何一个。每个方法在某些条件下对近端语音更敏感。只有当总话音比绝对电平或拒绝只出现噪声的条件的噪声底足够大时才出现所有方法。
%方法1%(aecInechoVoice<aecInVoice/4)等效于(aecNearRatio>=0.75),但是前者对量化不敏感。在aecNearRatio上的尖峰信号对于远端单方谈话低电平是常有的。因此,预置必须高以避免错误检测。对该检测方法需要的唯一限制是状态尺度=0和话音增益基线低于0.4625=15155/32768。后者阈值是在当消除器基本为训练时避免错误检测与消除器开始训练后尽快检测双方谈话之间的经验折中。
%方法2%(aecInVoice>32/2^7&anlpInVoice)拒绝低电平话音。这样做,检测对近端话音与总话音的低比率更敏感。再次,仅当状态尺度=0有助于拒绝远端单方谈话时接受该条件。通过随aecVoiceGainBase改变阈值优化近端语音的敏感度。比例因子和偏移是当消除器基本未训练时避免错误检测与消除器开始训练后对近端语音尽可能敏感之间的经验折中。
%方法3%当回声抑制突然和连续变坏时将aecNearGain与aecVoiceGainBase检测近端语音比较。这是因为aecVoiceGainBase不反映突然的变化,而aecNearGain使用滤波器保证检测中的连续性。因为滤波器被用于计算aecNearGain,条件更放松,其允许对近端语音更大敏感度。这种条件包括使状态尺度<0.3而非=0,和没有对话音增加的最小绝对值电平。当回声路径已经改变而远端单方谈话开始时,aecNearGain可能下降但仍然在短时间保持高于aecVoiceGainBase。为避免这种情况下的音频回声,只有当aecNearGain大于其最后值时检测近端语音。if ((aecstatusGauge==0)&(aecInEchoVoice<aecInVoice/4)&…(aecVoiceGainBase<15155/32768))︱…((aecStatusGauge==0)&(aecInVoice>32/2^7)&…(anlpInVoice>anlpInNoise*8)&…(aecNearRatio-aecVoiceGainBase*l.5>=9830/32768))︱…((aecNearGain-aecVoiceGainBase>=6554/32768)& …(aecNearGain>aecNearGainLast)),%近端语音已经检测。
%如果该帧开始了近端语音的新周期(暂停时间已经过去而包含话音的最新帧只是回声),则设置线性回声消除器回声增益等于基线回声增益估计值。这只在近端语音周期开头处进行,以便在近端语音期间残余回声抑制器具有连续衰减而非因为基线向上渗漏而增加失真,同时不进行更新。
if (anlpNearSpeechCount==0)&(anlpNearSpeechflag==0),
aecEchoGain=aecVoiceGainBase;end%设置表示具有话音的最新帧包含在近端语音中的标志。在不检测话音帧期间将保留设置。
anlpNearSpeechflag=1;%重新开始近端语音暂停时间计数器。当非零时,在双方谈话期间或当话音能量低得不能检测时,将越过anlpNearSpeechflag由近端语音残余回声抑制器使失真最小。
%如果仅当远端单方谈话被检测时该计数器开始,在双方谈话期间将有更少的近端语音中断。可是,近端人员说话后远端人员每次开始说话将听到回声,即使在长中止后。
%当有从近端语音到远端单方谈话的快速转变时(例如当近端人员在远端人员语音中间谈话时),暂停时间将产生远端人员听到回声(在-25dB)的短时间段。这种人工产物是值得的,因为暂停时间获得的双方谈话期间的中断明显减少。
anlpNearSpeechCount=25; %25*20ms=500ms暂停时间endend%如果回声估计话音能量至少是近端话音能量的15/16,假设该帧只包含远端回声语音,并清除近端语音标志。如果近端语音暂停时间计数器已经超时,残余回声抑制器马上到远端单方谈话模式。反之,当近端语音暂停时间计数器超时时,残余回声抑制器马上到远端单方谈话模式。注意当该计数器正工作时可以再次检测近端语音,然后一旦计数器超时残余回声抑制器保持近端语音模式。
%该检测方案比较32位数字,而不使用基于能量电平、状态尺度或根据前面帧的计量的任何限制(除了噪声估计)。因此,该方案相当敏感而牢固。如果该方案检测远端语音失败,当近端人员说话后远端人员开始说话时,将听到回声,即使长中断后。
if (aecInEchoVoice>(aecInVoice-aecInVoice/16)),anlpNearSpeechFlag=0;end
%如果近端语音暂停时间计数器已经超时,和包含话音的最新帧只是回声,则设置线性回声消除器的回声增益再次等于最新计量出的线性回声消除器话音增益。假设没有出现近端语音,所以残余回声抑制器试图抑制所有话音。这种实验在清除anlpNearSpeechFlag之后,以便aecEchoGain马上反映该判决。if (anlpNearSpeechCount==0)&(anlpNearSpeechFlag==0),aecEchoGain=aecVoiceGain;endaecVoiceGainHist(frame)=aecVoiceGain;%保留调整aecVoiceGainBase %回声状态aecVoiceGainBaseHist(frame)=aecVoiceGainBase;%保留调整aecEchoGain %回声状态aecEchoGainHist(frame)=aecEchoGain; %保留调整aecNearRatioHist(frame)=aecNearRatio;%保留调整aecNearGainHist(frame)=aecNearGain; %保留调整anlpNearSpeechCount %回声状态anlpNearspeechFlag%回声状态%计算环路回声增益直到ANLP。当需要满足对该系统的总环路回声抑制目标时ANLP将衰减。
% 贯穿音量控制。
%aecChangain是从扬声器到话筒-信道。
%aecEchoGain是从线性回声消除器的输入到输出。
aecLoopEchoGain=aecChangain*aecEchoGain;%在此插入音量增益。
%量化为Z.15格式aecloopEchoGain=floor(aecLoopEchoGain*32768132768%设置ANLP窗口以捕获所希望的残余回声,但是不再有了。这使近端话音和噪声最小。由于AEC改善了其回声增益ANLP窗口尺寸缩小。音量控制增益不再使用,因为ANLP的检测器包络输入在音量控制之后到达。回声增益估计RMS方面的计量,但ANLP需要抑制包括峰值的全部残余回声。因此,使用峰值/RMS因子乘数(=3)。anlpWindowGain的动态范围是二,因为当线性回声消除器基本未训练时anlpWindowGain需要至少是二以捕获在该窗口内的回声。
anlpWindowGain=min(2*ONE,3*aecChangain*aecEchoGain);%量化为Z1.14格式anlpWindowGain=floor(anlpWindowGain*16384)/16384;%如果VAD指示在扬声器上只有噪声,则以通过模式输入ANLP(增益=1)。该VAD允许高质量的近端单方谈话,因为没有近端语音失真或噪声。当只有噪声时VAD经常告知有话音,所以需要其它装置使在此情况下的近端语音失真和噪声最小。当由低话音电平时VAD也经常告知只有噪声。此问题与扬声器上的噪声电平成某种比例。可是,在环路中具有线性回声消除器提供了足够的回声抑制,使这些情况下的回声不发声。
if speakerVad(frame)==0,%近端单方谈话条件anlpEchoGain=ONE;%由于speakerVad=1,扬声器最可能具有语音,但不一定。如果近端语音被检测,假设双方谈话。在此情况下,设置总环路回声抑制目标为-25dB(1843/32768),和设置ANLP增益为在环路其余部分中不提供的所需要的回声抑制。ANLP增益越高(抑制越低)和当用户将音量从最大刻度下调时失真被减少。当训练线性回声消除器时,ANLP增益在此模式中一般高于-10dB,所以噪声掩盖没有改善声音质量。远端用户在双方谈话期间将听到一些回声,但是这种人造产物比中断或近端话音的高失真更可取。
elseif(anlpNearSpeechCount>0)︱(anlpNearSpeechFlag==1),%双方谈话anlpEchoGain=1843/32768/aecLoopEchoGain;%由于seakerVad=1和近端语音没有检测,假设有远端单方谈话。总环路回声抑制目标是-56dB(52/32768)以便当两端具有安静背景时回声几乎不发声。如同在双方谈话模式,ANLP增益被设置为所需要的环路其余部分不提供的回声抑制,和当用户将音量从最大刻度下调时和当线性回声消除器训练时ANLP增益更高和减少失真。可是,衰减到回声不发声而低于噪声底所需要的增益可能更高,所以两个增益的较高者用于ANLP使失真最小。没有舒适噪声,用相同因子衰减回声和噪声两者将不改变信噪比;所以噪声掩盖不起作用。舒适噪声使ANLP输入和输出上的噪声为相同电平。因此,ANLP可以回声衰减到低于噪声底的可发声阈值,而没有不必要的失真。因为这些变量是能量单位的,采用噪声/话音比的平方根。将所需要的回声/噪声定量乘以实际噪声/回声比值使噪声析出。剩下的是所需要的实际回声比值,它是掩盖回声所需要的增益。
else %远端单方谈话条件ECHO-TO-NOISE-GOAL=1/8; %-18dBif(anlpInVioce>anlpInNoise),anlpEchoGin=max(52/32768/aecLoopEchoGain,…ECHO-TO-NOISE-GOAL*sqrt(anlpInNoise/anlpInVioce));else%在嘈杂条件下,该增益不超过ECHO-TO-NOISE-GOAL,尽管理论上它可以用于低能量话音,因为当噪声电平快速下降时噪声估计太大(汽车减速)。这使当ANLP回声增益太高时将听到回声。
anlpEchoGain=max(52/32768/aecLoopEchoGain,ECHO-TO-NOISE-GOAL);endendanlpEchoGain=min(ONE,anlpEchogain);%量化为Z.15格式anlpEchoGain=floor(anlpEchoGain*32768)32768anlpGainHist(frame)=anlpEchoGain;%保留调整%递减近端语音暂停计数器,如果需要,以便独立与扬声器VAD工作。
anlpNearSpeechCount=max(0,anlpNearSpeechCount-1);%%ANLP样本部分%%如果ANLP回声增益是1,ANLP不激活-跳过以保留MIPS。
if (anlpEchoGain==ONE),
%保持包络检测器运行。
for k=1FRAME-SIZE,anlpRef=aecRef(FRAME-SIZE+1);anlpRefEnvelope=max(abs(anlpRef),255/256*anlpRefEnvelope);anlpRefEnvelope=floor(anlpRefEnvelope*2^31)/2^31;end%将用于AC中心衰减器的变量更新成为与处理整个帧产生的变量相同。
anlpOutLast=uplinkAudio(FRAME-SIZE);elsefor k=1FRAME-SIZE,%ANLP远端基准=AEC基准。使用aecEchoEst替代或额外使用不给出更好的结果,因为aecEchoEst与残余回声很不相关。由于优先于在anlIn中最早的回声,AEC基准同样有效。在峰值检测器中的长时间常数是ANLP的关键,而它使anlpRef与残余回声的接近延迟匹配不必要。进入AEC基准延迟线的偏移可以改变以补偿由于上行采样、下行采样、缓存器,和/或最小信道延迟引起的回声路径中固定延迟。
anlpRef=aecRef(FRAME-SIZE-k+1);%包络检测(峰值检测)anlpRef信号。
%峰值检测器中的指数延迟模拟了汽车中的反射延迟。设置时间常数以处理预计的最慢延迟反射条件。
%少于255/256的极点导致回声通过。
%大于255/256的极点导致近端的过度失真。
anlpRefEnvelop=max(abs(anlpRef),255/256*anlpRefEnvelop)%anlpRefEnvelop对于存储是32位。
%16位左右的anlpRefEnvelop将不衰减到低于512/2^15。当低于256/2^15时截短到16位的anlpRefEnvelop每个样本衰减1位,而这太快了(导致回声通过)。
%量化为Z.31格式
anlpRefEnvelope=floor(anlpRefEnvelop*2^31)/2^31;%ANLP的增量值是由AEC控制的增益并限制为1。
anlpDelta=min(ONE,…anlpWindowGain*floor(anlpRefEnvelope*32768)/32768);%量化为Z.15格式anlpDelta=floor(anlpDelta*32768)/32768;anlpDeltaHist((frame-1)*FRAME SIZE+k)=anlpDelta%保留调整%%执行AC中心衰减器%%ANLP输入通过噪声抑制器连接到AEC输出。
anlpIn=uplinkAudio(k);%如果该输入低于窗口if(anlpOutLast-anlpIn)>=anlpDelta,%使用所有窗口外信号并衰减窗口内信号。
anlpOutLast=anlpIn+anlpDelta-…anlpEchoGain*anlpDelta;%此外如果输入高于该窗口,else if (anlpIn-anlpOutLast)>=anlpDelta,%使用所有窗口外信号并衰减窗口内信号。
anlpOutLast=anlpIn+anlpDelta-…anlpEchoGain*anlpDelta;%此外如果输入在该窗口内,else%衰减该信号。
anlpOutLast=anlpEchoGain*(anlpIn-anlpOutLast) +anlpOutLast;end%量化S.15格式anlpOutLast=floor(anlpOutLast*32768)/32768;%保留到下次。
%%加入舒适噪声以至ANLP输出噪声具有与输入到ANLP的汽车噪声输入相同的电平和相似频谱。
%%使用来自汽车的捕获噪声帧的随机样本。
%即使从汽车捕获的音频偶然包含话音,这产生与汽车噪声相同功率的白噪声。
anlpSeed=rem(48271*anlpSeed,2147483647);anlpComfortNoiseIn=anlpcomfortNoise(1+…rem(anlpSeed,COMFORT-NOISE-SIZE));%使用上面讨论的ARMA模型滤除白噪声。
%假设anlpArGain=1-anlpArCoef,下列是等效式,%anlpComfortNoiseOut=anlpArCoef*anlpComfortNoiseOutOld+…%anlpArGain*(anlpComfortNoiseIn+0.8125*anlpComfortNoiseInOld);ma=anlpComfortNoiseIn+0.8125*anlpComfortNoiseInOld;%移动平均maDiff=anlpComfortNoiseInOld-ma;%量化为S1.15格式%舍入是必须的以避免在舒适噪声上的偏移。
%当舍入具有刚好0.5分数的负数时,加入2^(-17)强制一补数浮点起二补数相同的作用。
maDiff=round(maDiff*32768+2^(-17))/32768;anlpComfortNoiseOut=ma+anlpArCoef*maDiff;%量化为S1.15格式%舍入是必须的以避免在舒适噪声上的偏移。
anlpComfortNoiseOut=round(anlpComfortNoiseOut*32768 +2^(-17))/32768;anlpComfortNoiseOut=max(-1,min(ONE,anlpComfortNoiseOut));%为下个环路延迟变量anlpComfortNoiseInOld=anlpComfortNoiseIn;
anlpComfortNoiseOutOld=anlpComfortNoiseOut;%限制舒适噪声到窗口尺寸。
anlpComfortNoiseOut=min(anlpdelta,…max(-anlpdelta,anlpComfortNoiseOut));%将舒适噪声乘以比例以便ANLP输出噪声等于ANLP输入噪声电平。
anlpComfortNoiseOut=anlpComfortNoiseOut*(ONE-anlpEchoGain);%量化为S.15格式anlpComfortNoiseOut=floor(anlpComfortNoiseOut*32768)/32768;%将舒适噪声加入到ANLP输出信号中。
uplinkAudio(k)=max(-1,min(ONE,anlpOutLast+anlpComfortNoiseOut));endend%将在整数帧中的帧上采集的输出保留在文件中。fwrite(fidOut,[uplinkAudio;aecOut]*32768,‘int16’);%显示([‘aecInEnergy=’dec2hex(aecInEnergy*ENERGY SCALE)])%显示([‘aecErrorShift=’dec2hex(aecErrorShift+(aecErrorShift<0)*65536)])%显示([‘aecUpdate(1)=’dec2hex(aecUpdate(1)*32768+(aecUpdate(1)<0)*65536)])%显示([‘aecUpdate(2)=’dec2hex(aecUpdate(2)*32768+(aecUpdate(2)<0)*65536)])%显示([‘aecUpdateNear(1)=’…% dec2hex(aecUpdateNear(1)*32768+(aecUpdateNear(1)<0)*65536)])%显示([‘aecUpdateNear(2)=’…% dec2hex(aecUpdateNear(2)*32768+(aecUpdateNear(2)<0)*65536)])%显示([‘aecUpdatepeak2=’dec2hex(aecUpdatePeak2*2^31)])%显示([‘aecOutEnergy=’dec2hex(aecOutEnergy*ENERGY SCALE)])%显示([‘ aecRefEnergy=’dec2hex(aecRefEnergy*128)])%显示([‘anlpInEnergy=’dec2hex(anlpInEnergy*ENERGY SCALE)])%显示([‘aecUpdateBase=’dec2hex(aecUpdateBase*32768)])%显示([‘aecUpdatePeak=’dec2hex(aecUpdatePeak*32768)])%显示([‘aecPeakToBase=’dec2hex(aecPeakToBase*16)])%显示([‘aecStatusGauge=’dec2hex(aecStatusGauge*32768)])%显示([‘aecInNoise=’dec2hex(aecInNoise*2^31)])%显示([‘anlpInNoise=’dec2hex(anlpInNoise*2^31)])%显示([‘anlpComfortNoise(1)=’…% dec2hex(anlpComfortNoise(1)*32768+(anlpComfortNoise(1)<0)*65536)])%显示([‘anlpComfortNoise(2)=’…% dec2hex(anlpComfortNoise(2)*32768+(anlpComfortNoise(2)<0)*65536)])%显示([‘anlpArCoef=’dec2hex(anlpArCoef*2^31)])%显示([‘ anlpArGain=’dec2hex(anlpArGain*32768)])%显示([‘aecChanGainTrial=’dec2hex(aecChanGainTrial* )])%显示([‘aecChanGain=’dec2hex(aecChanGain*32768)])%显示([‘ aecVoiceGainBase=’dec2hex(aecVoiceGainBase*32768)])%显示([‘aecVoiceGain=’dec2hex(aecVoiceGain*32768)])%显示([‘aecEchoGain=’dec2hex(aecEchoGain*32768)])%显示([‘aecDenom=’dec2hex(aecDenom*8)])%显示([‘aecNumer=’dec2hex(aecNumer*2^18)])%显示(‘aecUpdateGain=’dec2hex(aecUpdateGain*32768)])%显示([‘aecCoef(1)=’dec2hex(aecCoef(1)*32768+(aecCoef(1)<0)*65536)])%显示([‘aecCoef(2)=’dec2hex(aecCoef(2)*32768+(aecCoef(2)<0)*65536)])%显示([‘anlpWindowGain=’dec2hex(anlpWindowGain*16384)])%显示([‘anlpEchoGain=’dec2hex(anlpEchoGain*32768)])%显示([‘anlpEchoGain=’]);20*log10(anlpEchoGain)%显示([‘anlpComfortNoiseInold=’dec2hex(anlpComfortNoiseInold*32768)])%显示([‘anlpComfortNoiseOutold=’dec2hex(anlpComfortNoiseOutold*32768)])%显示([‘uplinkAudio(1)=’…% dec2hex(uplinkAudio(1)*32768+(uplinkAudio(1)<0)*65536)])%显示([‘uplinkAudio(2)=’…% dec2hex(uplinkAudio(2)*32768+(uplinkAudio(2)<0)*65536)])%暂停%标绘([abs(aecUpdate)/aecUpdateBase;…% zeros(AEC REF TAPS-AEC REF TAPS-AEC NEAR TAPS,1);…% abs(aecUpdateNear)/aecUpdateBase])%轴线(
)% 标签 (‘Update element’),ylabel(‘Normalized update magnitude’),pause% 标绘(20*log10(abs(aecCoef.*profile))),axis(
);%标签 (‘Coefficient number’),ylabel(‘Magnitude in dB’),pauseendfclose (fidOut);清除 AEC MAX GAIN THRESH AEC BASELINE THRESH AEC STATUS GAUGE SCALER ONE清除 confirmedNoVoiceFlag清除 LRmatrix downlinkAudio uplinkAudio aecRef aecUpdate aecUpdateNearaecout清除 frame m k i anlpSeed aecEchoEst aecShiftPending aecErrorShift ASM T清除 aecRefEnergy aecInEnergy aecOutEnergy anlpInEnergy aecEchoEstEnergy清除 anlpIn anlpRef anlpRefEnvelope anlpDelta anlpoutLast清除 aecUpdatePeak2 aecUpdatePeak aecUpdateBase aecPeakToBase清除 aecStatusGauge aecDenom aecNumer aecUpdateGain aecLoopEchoGain清除 aecInNoiseStateVars aecInEchoNoiseStateVars anlpInNoiseStateVars清除 aecInVoice anlpInVoice aecInEchoVoice aecNearVoice清除 aecNearRatio aecNearGainLast anIpEchoGain清除 aecChanGainTrial anlpComfortNoiseIn anlpComfortNoiseout清除 aecPeakGain anlpWindowGain anlpDenom anlpArGain error quotient ma清除 fidIn fidout anlpNearSpeechCount anlpNearSpeechFlagECHO TO NOISE GOAL
%根据一个信号的帧能量估计噪声帧能量。
%基于标准的噪声估计用32比特的变量提供更宽的动态范围,因此即使在非常低的噪声电平时(例如test_65.raw的远端)该运算也保持不变。然而,基于标准的算法要求平方根和32比特平方运算(更高的MIPS)。该基于能量的算法已经为低噪声电平的量化进行优化,并且它进行一个可以接受的工作-尤其考虑噪声电平估计对于非常低的噪声电平(话音始终远大于噪声)并不苛刻。还说明可以为基于标准和基于能量的算法使自适应速度相同。在此所有的调整操作使用移位-仅为基于标准的算法移位一个以上的比特。
%目标是在信号中没有语音时快速更新估计,否则慢速更新估计。需要恒定自适应以在汽车噪声快速变化时予以跟踪。话音活动性检测器(VAD)输出对于确定何时快速更新是一个好的开始,但当确实存在远高于噪声的话音低电平时它有时指示没有话音。NoVoiceFlag是由线性回声消除器的状态标准限定后的VAD输出以提高可靠性。然而,状态标准并不区分噪声和近端话音、双方讲话或音调。因此,该算法必须容许快速更新周期内的一些话音。状态标准顺利工作的时间是在远端单方讲话时,在此对于正确估计噪声以避免可以听到的回声是最重要的。在此使用以降低错误偏差(主要出现在近端话音过程中)的技巧是根据比较结果而不是线性滤波能量信号以固定速率提高和降低估计。使用提高时间常量为1/4的降低时间常量使估计偏向于噪声底,而不考虑某些噪声。通过固定增量而非固定时间常量提高和降低将导致与噪声电平成正比的时间常量。
%很难讲出上升噪声底和话音之间的差别。在此提高时间常量确定跟踪速率。然而,提高必须很慢以在话音过程中最小化错误增长。执行状态机以在某些条件下允许噪声估计更快的增加。如果状态机观察到在无话音的过程中在至少900毫秒的时间内信号能量大于噪声估计的八倍,假定噪声底已经增加,并设置噪声电平使其等于测试周期的测试噪声估计。当输入噪声由来自远端的噪声控制时,由于AMPS带内控制信道或者由于不良的射频条件的消隐将致使噪声底临时下降。状态机在消隐之后试图恢复噪声估计。首先确认能量下降在5和25个帧长度之间。然后确认能量返回到原始水平。如果能量保持在围绕原始噪声电平的窗口内,需要较短的确认周期。如果能量跳变得远高于原始水平,则可能出现噪声,并需要一个较长的确认周期以确保噪声底未下降。
%NoiseStateVars矩阵的定义(1)=噪声估计(2)=消隐之前的噪声估计或测试噪声估计(3)=状态变量/计数器function[confirmedNoVoiceFlag,noiseStateVars]=…estnoise(inEnergy,noVoiceFlag,noiseStateVars)%以与父程序相同的方式定义所需常量。
%更新综合周期内的抽样数。
FRAME SIZE=160;%向右移位在一个抽样帧上的累加值的比特数。
FRAME_BITS=ceil(log2(FRAME_SIZE));%将能量量化成32比特的比例因子(Z8.23格式w/FRAME SIZE=160)ENERGY SCALE=2^(31-FRAME BITS);%如果父程序已经初始化噪声估计,if noiseStateVars(1)==FRAME SIZE,%采取行动以加速呼叫开始的自适应;%设置标记以便舒适噪声将用该电平初始化;confirmedNoVoiceFlag=1;%开始于等于该能量的噪声估计。
NoisestateVars(1)=inEnergy;Else%更新噪声估计。
%通过缺省,清除标志以便指示没有舒适噪声训练。
ConfirmedNoVoiceFlag=0;%在白噪声上按Matlab执行下述偏向测试% >>n=160*3000;noise=zeros (1,m);% >>seed=1;for i=1n,[noise(i)seed]=noisegen(seed);end% >>m=3000;for i=1 m,noiseEnergy(i)=sum(noise(160*(i-1)+1160*i).^2);end% >>ne=100;for i=1m,if ne>noiseEnergy(i),% >>ne=ne-ne/16;else,ne=ne+ne/64;end,neh(i)=ne;end% >>plot(neh) %neh是噪声估计历史记录% >>axis(
) %注意neh在10帧之后调整。% >>1/(sum(neh(11m))/(m-10)/(sum(noiseEnerty)/m)-1)% ans=-14.2082%这表示噪声估计具有大约-1/14的偏置因子。
%为了简化运算,为了比较从噪声估计中减去1/16的因子以恢复偏置。
%在汇编时,为了比特的正确性在减法之前向右移位。
noiseBiased=noiseStateVars(1)-noiseStateVars(1)/16;%量化成32比特noiseBiased=cell(noiseBiased*ENERGY_SCALE)/ENERGY_SCALE;%如果VAD和状态标准指示没有话音,if noVoiceFlag,%快速调整噪声估计。
%如果噪声估计太高,if noiseBiased>inEnergy,%降低噪声估计。
%为加速跟踪下降的噪声底,如果噪声估计高至8倍,设法立即设置噪声估计使其等于信号能量,然而,这使得在激活时偏置很负,则产生错误检测问题。该时间常量太短以致于使噪声估计反而工作得很好。
%为了最小化偏差,在噪声估计等于信号能量时不要降低。
%除了零点之外,量化致使最小的改变1/ENERGY_SCALE。
%在汇编中,为了比特的正确性在右移之前取反。
noiseStateVars(1)=noiseStateVars(1)-noiseStateVars(1)/16;%为舒适噪声训练设置标记。输入能量低于噪声估计的要求提高了在话音期间不改变舒适噪声的可能性。
ConfirmedNoVoiceFlag=1;Else%提高噪声估计。
%使用最小增量以避免停滞在零点附近。
%改为不使用相加min(noiseStateVars(1)/64,1/ENERGY_SCALE),因为它导致较慢的自适应以致瞬间增加的噪声。
NoiseStateVars(1)=noiseStateVars(1)+noiseStateVars(1)/64+……1/ENERGY_SCALE;EndElse%缓慢提高噪声估计。
%因为正确跟踪递减噪声电平的重要性,在话音期间不停止自适应。噪声的估计过高导致话音能量的估计过低。由于较低的远端话音能量,这对NLP输入的影响比对线性回声消除器的影响更明显。因而,结果是不充分的回声抑制。所以最好过低估计噪声,而不要过高估计噪声。
%如果噪声估计过高,if noiseBiased>inEnergy,%降低噪声估计。
%除了在零点之外,量化致使最小的改变1/ENERGY_SCALE。
%在汇编中,为了比特的正确性在右移之前求反。
NoiseStateVats(1)=noiseStateVars(1)-noiseStateVars(1)/64;Else%提高噪声估计。
%乍看起来好象正确跟踪递减的噪声电平仅需要在话音期间降低。然而,这将致使偏置变得过于负。根据经验将提高确定成最快的可能,而不允许话音期间过多的错误变化。因为在暂停之间话音可以持续若干秒,结果变得非常慢。
%不使用最小增量,否则对于话音期间的低噪声电平的提高将过大。
NoiseStateVars(1)=noiseStateVars(1)+noiseStateVars(1)/1024;EndEnd%量化成32比特。
NoiseStateVars(1)=floor(noiseStateVars(1)*ENERGY_SCALE)/ENERGY_SCALE;%用于AMPS消隐和噪声跳变跟踪的状态机。
%不要在初始化时执行。
%如果状态机处于空闲状态,if noiseStateVars(3)==0,%如果信号能量已经明显低于噪声估计,并且如果inEnergy的量化并不给出错误结果,if noiseStateVars(1)>max(8*inEnergy,8/ENERGY_SCALE),%为状态机存储噪声估计。
NoiseStateVars(2)=noiseStateVars(1);%开始状态机以查找消隐。
NoiseStateVars(3)=1;%如果VAD和状态标准指示没有话音,信号能量明显高于噪声估计,并且如果噪声估计的量化并不给出错误结果,elseif noVoiceFlag &…(inEnergy>max(8*noiseStateVars(1),8/ENERGY_SCALE)),%初始化测试噪声估计。
NoiseStateVars(2)=inEnergy;%开始状态机以查找噪声跳变。
NoiseStateVars(3)=-1;End%否则如果状态机在查找噪声跳变,elseif noiseStateVars(3)<0,%如果VAD和状态继续指示没有话音,并且如果信号能量保持明显高于噪声估计,if noVoiceFlag & (inEnergy>8*noiseStateVars(1)),%偏置测试噪声估计就象正规的噪声估计一样。
%在汇编中,为了比特的正确性在相减之前右移。
NoiseBiased=noiseStateVars(2)-noiseStateVars(2)/16;%量化成32比特。
NoiseBiased=cell(noiseBiased*ENERGY_SCALE)/ENERGY_SCALE;%如果测试噪声估计过高,if noiseBiased>inEnergy,%降低测试噪声估计。
%量化导致最小变化1/ENERGY_SCALE。
%在汇编中,为了比特正确性在右移之前求反。
NoiseStateVars(2)=noiseStateVars(2)-noiseStateVars(2)/16;Else%提高测试噪声估计NoiseStateVars(2)=noiseStateVars(2)+noiseStateVars(2)/64;End%量化成32比特noiseStateVars(2)=floor(noiseStateVars(2)*ENERGY_SCALE)/ENERGY_SCALE;%递减也用作一个计数器的状态变量。
NoiseStateVars(3)=noiseStateVars(3)-1;%如果在一个足够长的周期内信号能量保持明显高于噪声估计。
%(测试跟踪s_top10_1.raw的回声需要45个帧)if noiseStateVars(3)==-45,%噪声估计跳转到测试噪声估计。
NoiseStateVars(1)=noiseStateVars(2);%将状态机重置回空闲状态。
NoiseStateVars(3)=0;EndElse,%否则状态机在查找消隐。
Else,%递增状态变量。
NoiseStateVars(3)=noiseStateVars(3)+1;%状态1-100计算所谓消隐周期内的帧数。
If noiseStateVars(3)<101,%如果能量再次变高,if 8*inEnergy>noiseStateVars(2),%如果消隐小于5帧,if noiseStateVars(3)-1<5,%检测是错误的或者不值得恢复噪声估计。使状态机返回空闲状态。
NoiseStateVars(3)=0Else%话音已经出现或者在消隐之前噪声返回。
%将状态变量设置为101以启动下一程序段。
NoiseStateVars(3)=101;End%如果低能量帧的计算过长,elseif noiseStateVars(3)-1==25,%消隐并未出现-而是噪声电平降低。
%使状态机返回空闲状态。
NoiseStateVars(3)=0;End%状态机已经检测到所谓消隐周期的结束。
%不考虑状态机是否在计算话音或噪声帧,首先检测能量是否又降低。
Elseif 8*inEnergy<noiseStateVars(2),
%消隐并未出现-而是噪声电平降低。
%使状态机返回空闲状态。
NoiseStateVars(3)=0;%状态101-200计算所谓消隐周期之后话音或噪声帧数。
Elseif noiseStateVars(3)<201,%如果能量变得很高,if inEnergy>noiseStateVars(2)*8,%假设这是话音。
%将状态变量设置为201以启动下一程序段。
noiseStateVars(3)=201;%在最大和最小能量接近于所存储的噪声估计时存在足够的帧数,elseif noiseStateVars(3)-101==10,确认消隐。
将噪声估计恢复成消隐之前的值。
NoiseStateVars(1)=noiseStateVars(2);%使状态机返回空闲状态。
NoiseStateVars(3)=0;End%状态201-300计算所谓消隐周期之后话音帧的个数。
%在最小能量接近于所存储的噪声估计时存在足够的帧数,elseif noiseStateVars(3)-201==50,%确认消隐。
%将噪声估计恢复成消隐之前的值。
NoiseStateVars(1)=noiseStateVars(2);%使状态机返回空闲状态。
NoiseStateVars(3)=0;EndEndEnd
本领域技术人员应当理解,本发明不限于为说明目的已经在此描述的特定示范性实施例。例如,所公开实施例的各种功能块实际上是概念化的。这些块功能的实际实施可以使用各种技术完成。此外,例如可以使用几个标准数字信号处理芯片、单一应用专用集成电路,或适当配置的计算机实现每个示范性系统。
还注意,尽管已经在在音频回声消除环境下描述了示范性实施例,本发明的教导同样可以应用于网络回声消除的环境中(例如,近端用户是陆地线路用户而远端用户是移动用户的场合)。此外,本发明的某些方面一般可以应用于通信系统而不限于回声抑制系统。因此,本发明的范围由附带的权利要求书而非前面的说明书所限定,所有与本发明思想相一致的等同发明均包含在其中。
权利要求
1.一种回声抑制设备,包括回声抑制器,配置以衰减第一通信信号从而抑制其回声分量,所述回声分量由第二通信信号的反射产生;和话音激励检测器,连接到所述回声抑制器和配置以提供所述第二通信信号是否包括话音分量的指示,其中当话音激励检测器指示所述第二通信信号并不包括话音分量时使所述回声抑制器不工作。
2.根据权利要求1的回声抑制设备,其中通过旁路使所述回声抑制器不工作。
3.根据权利要求1的回声抑制设备,其中通过调整回声抑制器使所述回声抑制器不工作以提供足以防止啸声的一定水平的衰减。
4.根据权利要求1的回声抑制设备,其中所述回声抑制器是单掷开关,并且其中通过闭合所述单掷开关使所述回声抑制器不工作。
5.根据权利要求1的回声抑制设备,其中所述回声抑制器是削波抑制器,并且其中通过将所述回声抑制器的削波阈值设置为零使所述回声抑制器不工作。
6.根据权利要求1的回声抑制设备,其中所述回声抑制器是定标抑制器,并且其中通过将所述回声抑制器的比例因子设置为1使所述回声抑制器不工作。
7.根据权利要求1的回声抑制设备,其中所述回声抑制器是混合抑制器,并且其中通过将所述回声抑制器的削波阈值设置为零和通过将所述回声抑制器的比例因子设置为1使所述回声抑制器不工作。
8.一种回声抑制设备,包括回声抑制器,配置以衰减第一通信信号从而抑制其回声分量,其中所述回声分量由第二通信信号的反射产生,并且其中所述回声抑制器使所述第一通信信号的至少一部分乘以一个衰减因子;和增益控制处理器,配置以检测所述通信信号的主要条件,并在所述回声抑制器工作时根据所述检测到的主要条件调整所述衰减因子。
9.根据权利要求8的回声抑制设备,其中所述增益控制处理器包括一个话音激励检测器,配置以检测所述第一通信信号是否包括近端话音分量,并且其中所述增益控制处理器根据所述话音激励检测器是否检测到所述近端话音分量来调整所述衰减因子。
10.一种回声抑制设备,包括回声抑制器,配置以衰减第一通信信号从而抑制其回声分量,其中所述回声分量由第二通信信号的反射产生;和增益控制处理器,配置以检测所述第一通信信号中的话音与噪声比,并且其中所述增益控制处理器根据所述比值调整由所述回声抑制器提供的一定级别的衰减。
11.根据权利要求10的回声抑制设备,其中所述话音与噪声比是回声与噪声比。
12.根据权利要求10的回声抑制设备,其中当所述比值等于或低于预定阈值时,所述增益控制处理器使所述回声抑制器不工作。
13.根据权利要求12的回声抑制设备,其中通过旁路使所述回声抑制器不工作。
14.根据权利要求12的回声抑制设备,其中所说增益控制处理器通过调整回声抑制器以提供足以防止啸声的一定水平的衰减使所述回声抑制器不工作。
15.根据权利要求12的回声抑制设备,其中所述回声抑制器是单掷开关,并且其中通过闭合所述单掷开关使所述回声抑制器不工作。
16.根据权利要求12的回声抑制设备,其中所述回声抑制器是削波抑制器,并且其中通过将所述回声抑制器的削波阈值设置为零使所述回声抑制器不工作。
17.根据权利要求12的回声抑制设备,其中所述回声抑制器是定标抑制器,并且其中通过将所述回声抑制器的比例因子设置为1使所述回声抑制器不工作。
全文摘要
用于控制回声抑制器的方法和设备在各种条件下优化可察觉的信号质量时提供优越的回声衰减。在使回声抑制器将引入比所需要更多的衰减因而更多的信号失真的可能性最小的同时,所公开的技术提供所需水平的回声衰减。在第一种示范性实施例中,当话音激励检测器指示远端通信信号并不包括话音分量时,停止声音回声抑制的工作。在第二种示范性实施例中,根据话音激励检测器指示近端通信信号是否包括近端话音分量来调整正在工作的声音回声消除器的衰减因子。在第三种示范性实施例中,根据所测量的声音回声消除器音频输入中话音和噪声比调整由声音回声消除器提供的一定水平的衰减。
文档编号H04B3/20GK1294814SQ98813858
公开日2001年5月9日 申请日期1998年12月22日 优先权日1998年1月9日
发明者E·D·罗梅斯博格 申请人:艾利森公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1