综合-分析线性预测语音编码中的增益量化方法

文档序号:2820044阅读:775来源:国知局

专利名称::综合-分析线性预测语音编码中的增益量化方法
技术领域
:本发明涉及一种在综合分析线性预测语音编码中的增益量化方法,具体说是用于移动电话上的增益量化方法。
背景技术
:综合分析线性预测语音编码器通常有一个长期预测程序或自适应码本,并带有几个固定码本。例如在(1)中就描述了这种语音编码器。在这种语音编码器中总的激励矢量可用码本矢量vi的线性组合描述,即每一个码本矢量vi与对应的增益相乘。顺序地搜索码本。通常在搜寻第二个码本前从目标信号(语音信号)中减去来自第一个码本的激励。另一本方式是正交搜索,其中在后一码本中的所有矢量与所选的码本矢量正交。因而,码本都是相互独立的,并都能朝着同一目标信号被搜索。在(2)中描述了一般的有任意数量码本的CELP编码器的搜索方式和增益量化。通常码本的增益是分别地进行量化,但也可是与增益一起量化矢量。在(3)中所描述的编码器中,两个固定码本和一个自适应码本一起使用。搜索固定码本并正交化。在变换到合适的域后,将固定码本增益与自适应码本增益一起进行矢量量化。并通过在新的综合-分析环中检测所有可能性发现最佳量化系数。在ACELP编码器中使用了相似的量化方式(4),但在这种情况中使用的是标准码本搜索方法。在(5,6)中描述了一种自适应地计算量化边界的方法它使用了所选的LTP(长期预测)矢量而对于第二码本,则使用了由第一码本中选择的矢量。在(2)中提出了一种方法,根据这种方法与正常码本矢量成比例地量化LTP码本增益。并与帧能量成比例地量化自适应码本增益。比率g2/g1,g3/g2,……是在不相同的量化器中进行量化。为使用增益的矢量量化,增益必须在激励矢量选择后进行量化。这意味着在搜索下一码本时不知道第一搜索码本的精确增益。如果使用传统的搜索方式,则不能为下一码本计算正确的目标信号,因而下一搜索不是最优的。如果使用正交搜索方式,则码本搜索是与前一码本增益相独立的。因此在码本搜索后再量化增益,并可使用矢量量化。然而,码本的正交化通常非常复杂,而通常并不可行,除非在(3)中,对码本进行特殊专门设计以得到有效率的正交化。当使用矢量量化时,正常地是在新综合分析环中选择最佳增益。由于增益是标量量化的,因此与滤波过程不相干,这相对于在码本搜索中的综合-分析环节而言简化了计算。但这种方式仍独立量化要更复杂。另一缺点是矢量系数对于信道差错很敏感,这是由于系数中一位的错误会带来不同的一组增益。从这一方面而言独立量化是一种更好的选择。但在这种方式中要实现与其它方式相同的性能必须使用更多位。有在(5,6)中描述的自适应量化限制的方式包含复杂的计算,因而在例如移动电话等低复杂度系统中并不实用。同样,由于最后码本的解码依赖于前面所有增益和矢量的正确传送,因此可见这种方式对于信道差错是很敏感的。如(2)中所描述的增益比率对于信道误差是健壮的,并且不太复杂,这种方式要求对不相同的量化器要进行训练,这可能使得编码器对于未在训练中使用的其它信道较不健壮。这种方式也非常不实用。发明概述本发明的一个目的是在综合分析线性预测语言编码中提出改进的增益量化方式以减少或消除大多数上述问题。具体说是,该方式应具有更低复杂度,并给出对于信道误差不敏感的量化增益和使用比独立增益量化方式更少比特数。上述目的可由根据权利要求1的方式实现。附图简述通过参照下列与附图一起进行的叙述,可以更好地理解本发明和它的其它目的与优点。其中图1是可使用本发明的方法的综合-分析线性预测语音编码器的一个实施例的框图;图2是可使用本发明的方法综合-分析线性预测语音编码器的另一实施例的框图;图3示出了多脉冲激励(MPE)的原理;图4示出了转换双脉冲激励(TBPE)的原理;图5示出了来自一个码本的最佳增益与来自下一码本的最佳增益的分布;图6示出了在来自一个码本的量化增益与来自下一码本的最佳增益之间的分布;图7示出了一个码本的最佳增益的动态范围;图8示出了一个参数σ的较小的动态范围,根据本发明,用σ代替了图7的增益g2;图9是显示本发明的方法的流程图;图10是使用本发明的方法的语音编码器的一个实施例;图11是使用本发明方法的语音编码器的另一实施例;图12是使用本发明方法的语音编码器的另一实施例。最佳实施例详述在随后的描述中的许多例子将参照欧洲GSM(全球移动通信系统)系统。然而,应该认识到本发明的原理也可用于其它蜂窝系统。在所有附图中对于对应的或相似的部件将使用相同的参照符号。在描述本发明的增益量化方法前,首先描述一下可能在其中使用本发明的语音编码器的例子是很有帮助的。下面将参照图1和2进行描述。图1显示了一个典型的综合-分析线性语音编码器的例子的框图。编码器包括了在垂直中心虚线左边的综合部件和在虚线右边的分析部件。综合部件基本上包括两个单元,分别叫作激励代码产生单元10和LPC(线性预测编码)综合滤波器12。激励代码产生单元10包含一个自适应码本14,一个固定码本16和一个加法器18。来自自适应码本14的所选矢量ar(n)与增益因子gIQ(Q表示量化值)相乘以形成信号p(n)。用同样方法将来自固定码本16的激励矢量与增益因子gJQ相乘以形成信号f(n)。信号p(n)与f(n)在加法器18中相加而形成激励矢量ex(n),它激励LPC综合滤波器12以形成预测的语音信号矢量(n)。在分析部分中,在加法器20中由实际语音信号矢量s(n)减去预测矢量(n)以形成误差信号e(n)。把这个误差信号送至加权滤波器22以形成加权的误差矢量ew(n)。在单元24中将这个加权误差矢量的各分量平方和求和以形成这个加权误差矢量的能量测量值。最小化单元26通过选择来自自适应码本12的增益gIQ和矢量与来自固定码本16的增益gJQ和矢量的组合来使这个加权误差矢量最小化,这一组合给出最小的能量值,即是说经过在滤波器12中的滤波后的值最接近于语音信号矢量。将最优化过程分成两步。第一步假设f(n)=0,并确定来自自适应码本14的最佳矢量和相应的gIQ。在附录中给出了确定这些参数的算法。当确定了这些参数之后,根据类似的算法再由固定码本16选取矢量与对应的gJQ。在这种情况中,自适应码本14的已确定的参数被锁定在其已确定的值上。通过在LPC分析器28中分析语音信号帧为每一语音信号帧(160个取样)更新滤波器12的滤波器参数。这种更新已通过在分析器28与滤波器12中的虚线连接进行标记。此外,在加法器18和自适应码本14之间有一延迟部分。用这种方法最后选择的激励矢量ex(n)更新了自适应码本。这些是在子帧基础上进行实现的,其中每帧被分为四帧(40个取样)。图2示出了可被使用本发明方法的语音编码器的另一实施例。图1中的语音编码器与图2的语音编码器的基本差异是图1的固定码本已被包括多脉冲激励发生器和转换双脉冲激励发生器36(TBPE)的固定激励发生器32代替。下面将对这两种激励进行简要描述。图2中对应块增益已被分别用gMQ,gTQ表示。来自发生器34,36的激励在加法器38中相加,而在加法器18中将混合激励加到自适应码本激励上。图3中示出了多脉冲激励,在(7)中详述,也和在所附的C++程序列表中作了详述。图3示出了在40个取样的子帧(=5ms)内的6个脉冲。可用这些脉冲的位置(在例子中为位置7,9,14,25,37)和脉冲的幅度(例子中为AMP1-AMP6)描述激发矢量。在(7)中描述了获得这些参数的方法。通常幅度只代表激励矢量的形状。因此块增益gMQ(见图2)被用来代表这基矢形状的幅度。图4示出了转换双脉冲激励的原理,这在(B)和在所附的程序列表中已有详细的描述。双脉冲码本可包含例如有10个分量的矢量。如图4中所示每个矢量的分量可指向上(+1)也可指向下(-1)。双脉冲码本包括这些矢量的所有可能的组合。这个码本的矢量可被认为是一系列所有指向一个十维“立方体”的各“顶角”的矢量。因而矢量顶点都均匀地分布在一个10维球体的表面。此外,TBPE包含一个或几个交换矩阵(MATRIX1和MATRIX2)。在ROM中存储了预先计算的矩阵。用这些矩阵对存储在双脉冲码本中的矢量进行运算以产生一系列变换的矢量。最后,将这些变换矢量分布在一系列激励脉冲栅格上。结果是对于每个矩阵有4种不同类型的规则分布的“随机”码本。图4中显示了一个作为最后结果的来自其中一个码本的矢量(基于格子2)。搜索过程的目的是获得双脉冲码本的双脉冲码本系数,变换矩阵和一起给出最小加权误差的激励脉冲栅格。这些参数与增益gTQ相组合(见图2)。在图1,2所示的语音编码器中,增益gIQ,gJQ,gMQ和gTQ已被相互完全独立地量化。然而,如图5中可见,在两个不同码本的增益之间有强的相关。图5中显示了在对应于MPE码本的增益g1的对数与对应于TBPE码本的增益g2的对数之间的分布。图6中显示了相似的分布图,但是,在此情况下增益g1已被量化。此外,图6中还显示了一条线L。这条线可通过回归分析发现,它可被用来从gIQ中预测g2,这将在下面进一步描述。图5和6中的数据总是从8000帧中获取的。如图5和6中所示,在属于不同码本的增益之间有强的相关。通过计算来自第一码本的大量量化增益gIQ和在对应帧和确定线L中的第二码本的对应增益(未量化)g2,这条线可被用作线性预测器,它可根据下列公式由gIQ的对数预测g2的对数。log(g^2)=b+c·log(g1Q)]]>其中代表预测增益g2。根据本发明的一个实施例,不量化g2而根据下列公式计算在实际和预测增益g2的对数之间的差σδ=log(g2)-log(g^2)=log(g2)-(b+c·log(g1Q))]]>然后再进行量化。图7和8示出了一个由上述方法而得到的优点。图7示出了8000帧的增益g2的动态范围。图8示出了在对应的相同帧中的σ的动态范围。由图7和8中可见,σ的动态范围比g2的动态范围小了很多。这意味着,对比g2所要求的量化级数,用于σ的量化级数可以显著减少。为在量化中实现较好性能,通常要在增益量化中用16级。采用本发明的σ量化,只需6个量化级就可获得同样的性能,这等于节约了0.3kb/s的比特率。由于值b和c是存储于编码器与解码器中预确定和固定的值,故在解码器中可根据下列公式重构增益g2。g2=[g1Q]c·exp(b+δQ)其中g1Q和σQ已在解码器处被发送和接收。在码本增益之间的相关性很依赖于在码本矢量中的能级。如果在码本中能量正在变化,则可将矢量能量包括进预测中以改善性能。在(2)中使用了归一化码本矢量,它消除了这一问题。然而,如果这个码本不是自动进行归一化并有许多非零分量则这种方法可能会很复杂,代之以可以在用于预测前修正因子g1以更好地代表前面码本的激励矢量。因此,计算σ的公式可修正为下式。δ=log(g2)-(b+c·log(E1/2·g1Q))]]>其中E代表由码本1选取的矢量的能量。激励能量被计算并被用于码本的搜索中,所以不必进行额外计算。如果第一码本身是自适应码本,则能量变化很大,并且许多分量非零。归一化这些矢量将是一种计算复杂的过程。然而,如果没有归一化而使用码本,则量化增益可被矢量能量的平方根乘,如上所述,以便为下一码本增益的预测打下好的基础。一个MPE码本矢量有很少幅度和符号变化的非零脉冲。通过对脉冲幅度的平方和给出矢量能量。为了预测下一码本增益,例如TBPE码本增益,可象自适应码本中情况一样,用能量的平方根修正MPE增益。然而如果使用的是平均脉冲幅度(幅度总是正的),可获得相同性能,而这种计算较不复杂。图6中的量化增益采用这种方法进行修正。上面讨论的能量修正为在解码器处的g2给出下式g2=[E1/2·g1Q]c·exp(b+δQ)]]>因为在解码器处也可得到激励矢量,则不必传送能量E但可在解码器处进行重算。下面总结一个算法例子,其中第一增益为MPE增益而第二增益为TBPE增益。LPC分析子帧_nr=1…4LTP分析MPE分析搜索最佳矢量计算最优增益量化增益更新目标矢量TBPE分析搜索最佳矢量最化增益计算最优增益根据MPE脉冲平均幅度*MPE增益的对数来计算预测值计算σ量化σ计算量化增益状态更新在这一算法中以帧为基础在帧上实现LPC分析,同时以子帧为基础在子帧上实现余下步骤的LTP分析,MPE激励,TBPE激励和状态更新。在此算法中展开了MPE和TBPE激励步骤以显示那些与本发明相关的步骤。在图9中给出了一个本发明的流程图。图10图示了一个与图1中语音编码器对应的语音编码器,但提供了用于完成本发明的装置。在块50中确定了对应于来自固定码本16的最优矢量的增益g2,而将激励矢量能量E(在块54中确定)送至块52,它计算σQ和量化增益g2Q。最好用微处理器进行以上计算。图11图示了本发明的另一实施例,它对应于上面给出的举例算法。在此情况中,g1Q对应于来自MPE码本34的具有能量E的最优矢量,同时增益g2对应来自TBPE码本36的激励矢量。图12图示了语音编码器的另一实施例,它综合了上述方法。由于已显示了在对应不同码本的增益之间有很强相关性,在有多于两个码本的情况下很自然通过重复这一算法来综合这一构想。在图12中,根据上述方法在块52中计算第一参数σ1。在此情况中,第一码本是一自适应码本14,第2码本是一MPE码本34。然而,为第二码本计算了g2Q后,可通过将MPE码本34认作“第一”码本而将TBPE码本认作“第二码本”而重复这一过程。因此,块52′可以根据上述相同的原理计算σ2和g3Q。差别是现在需要两个线性预测,一个为g2而一个为g3,分别有不同常数“a”和“b”。在上面描述中已假设只在当前子帧中进行线性预测。然而,由于在当前子帧的增益与前面子帧的增益之间可能存在相关,因此也可能存储在前面子帧中已确定的增益和包括前面在线性预测中确定的增益。象在上述实施例中一样,线性预测的常数可通过经验获得并存储在编码和解码器中。这种方法将进一步提高预测的准确度,同时将进一步减少σ的动态范围。这将导致或是改进的质量(σ的可提供的量化级可用于覆盖较小的动态范围)或是进一步减少的量化级数。因而,通过考虑到在增益间的相关性,本发明的量化方式相对于独立增益量化方式减少了增益比特率。由于在计算的复杂度上的增加是较少的,因而本发明的方法也仍是一种低复杂性方法。此外,相对于矢量量化方式,位误码的稳定性也有改进。相对于独立量化,第一码本的增益的敏感度增加了,因为它也将影响第二码本的增益的量化。然而,参数σ的位误码敏感度低于在独立量化中第二增益g2的位误码敏感度。如果这在信道编码中被考虑,则总的稳定性相对于独立量化将确实被改善,因为σ量化的位误码敏感度更不等,当使用不等差错保护时这是较佳的。一种用于减少增益动态范围的常用方法是在量化前用帧能量参数归一化增益。于是对每帧只发送一次帧能量参数。这种方法不是本发明所要求的,但为其它原因可以使用增益的帧能量归一。在附录的程序列表中使用于帧能量归一。熟悉本
技术领域
人士可理解对本发明可做修正和改变,但这些修正与改变不背离本发明的附属权利要求中确定的精神与范围。附录附录概述了确定在一个彻底的搜索中的自适应码本系数;和对应增益gi的算法。图1中也显示了这些信号。ex(n)=p(n)激励矢量(f(n)=0)p(n)=gi·ai(n)定标的自适应矢量(n)=h(n)*p(n)合成语音(*=卷积)h(n)=冲激响应e(n)=s(n)-(n)误差矢量ew(n)=w(n)*(s(n)-(n))加权误差E=∑[ew(n)]2n=0..N-1加权误差的平方和N=40(forexample)矢量长度sw(n)=w(n)*s(n)加权语音hw(n)=w(n)*h(n)综合滤波器的加权冲激响应minEi=min&Sigma;n=0N-1[ewi(n)]2]]>在自适应码本中搜索最优系数&PartialD;Ei&PartialD;gi=0&DoubleRightArrow;gi=&Sigma;n=0N-1sw(n)&CenterDot;ai(n)*hw(n)&Sigma;n=0N-1[ai(n)*hw(n)]2]]>相对于系数i的增益<prelisting-type="program-listing"><![CDATA[MAIN.CC/**classF_SpeMain*mainclassforspeechencoder*COPYRIGHT(C)1995ERICSSONRADIOSYSTEMSAB*/#include"F_SpeMain.hh"#include<iostream.h>F_SpeMain∷F_SpeMain()F_speechSave(F_savedSpeechLength),F_lspPrev(F_nrCoeff),F_ltpHistory(F_historyLength),F_weightFilterRingState(F_nrCoeff),F_syFilterState(F_nrCoeff){/*clearsavedspeech*/for(inti=0;i<F_savedSpeechLength;i++)F_speechSave[i]=0.0;for(i=0;i<F_nrCoeff;i++)F_lspPrev[i]=F_lspInit[i];for(i=0;i<F_historyLength;i++)F_ltpHistory[i]=0.0;for(i=0;i<F_nrCoeff;i++)F_weightFilterRingState[i]=0.0;for(i=0;i<F_nrCoeff;i++)F_syFilterState[i]=0.0;}/**functionF_SpeMainmain*/voidF_SpeMain∷main(constFloatVec&amp;F_speechFrame,ShortVec&amp;F_analysisData)}/*localvariables*/FloatVecF_lspCurr(F_nrCoeff);ShortVecF_lspVQCodes(F_nLspTables);FloatF_energy;FloatF_accPower;ShortintF_energyCode;FloatVecF_hpSpeech(F_frameLength);ShortVecF_ltpLagCodes(F_nrOfSubframes);ShortVecF_ltpGainCodes(F_nrOfSubframes);ShortVecF_mpeBlockMaxCodes(F_nrOfSubframes);ShortVecF_mpeAmpCodes(F_nrOfSubframes);ShortVecF_mpeSignCodes(F_nrOfSubframes);ShortVecF_mpePositionCodes(F_nrOfSubframes);ShortVecF_tbpeGainCodes(F_nrOfSubframes);ShortVecF_tbpeGridCodes(F_nrOfSubframes);ShortVecF_tbpeMatrixCodes(F_nrOfSubframes);ShortVecF_tbpeIndexCodes(F_nrOfSubframes);F_speFrame.main(F_speechFrame,F_lspPrev,F_speechSave,F_lspCurr,F_lspVQCodes,F_energy,F_accPower,F_energyCode,F_hpSpeech);for(intF_subframeNr=0;F_subframeNr<F_nrOfSubframes;F_subframeNr++){/*subframelocalvariables*/FloatF_excNormFactor;FloatVecF_wCoeff(F_nrCoeff);FloatVecF_aCoeff(F_nrCoeff);FloatVecF_wSpeechSubframe(F_subframeLength);FloatVecF_impulseResponse(F_subframeLength);FloatVecF_ltpExcitation(F_subframeLength);FloatVecF_wLtpResidual(F_subframeLength);FloatF_avgMpeAmp;FloatVecF_mpeInnovation(F_subframeLength);FloatVecF_wMpeResidual(F_subframeLength);FloatVecF_tbpeInnovation(F_subframeLength);F_speSubPre.main(F_hpSpeech,F_subframeNr,F_lspCurr,F_lspPrev,F_energy,F_weightFilterRingState,F_excNormFactor,F_wCoeff,F_aCoeff,F_wSpeechSubframe,F_impulseResponse);F_speSubLtp.main(F_wSpeechSubframe,F_wCoeff,F_ltpHistory,F_wLtpResidual,F_ltpExcitation,F_ltpLagCodes[F_subframeNr],F_ltpGainCodes[F_subframeNr]);F_speSubMpe.main(F_wCoeff,    F_excNormFactor,    F_wLtpResidual,    F_impulseResponse,    F_mpeInnovation,    F_mpePositionCodes[F_subframeNr],    F_mpeAmpCodes[F_subframeNr],    F_mpeSignCodes[F_subframeNr],   F_mpeBlockMaxCodes[F_subframeNr],    F_wMpeResidual,    F_avgMpeAmp); F_speSubTbpe.main(F_wMpeResidual,    F_wCoeff,    F_excNormFactor,    F_avqMpeAmp,   F_impulseResponse,    F_tbpeInnovation,    F_tbpeGainCodes[F_subframeNr],    F_tbpeIndexCodes[F_subframeNr],    F_tbpeGridCodes[F_subframeNr],   F_tbpeMatrixCodes[F_subframeNr]);   F_speSubPost.main(F_ltpExcitation,   F_tbpeInnovation,   F_mpeInnovation,   F_wCoeff,   F_aCoeff,   F_ltpHistory,   F_weightFilterRingState,   F_svFilterState,   F_accPower);} F_spePost.main(F_energy,   F_lspCurr,   F_accPower,   F_enerqyCode,   F_lspVQCodes,   F_ltpGainCodes,   F_ltpLaqCodes,  F_mpeBlockMaxCodes,   F_mpeAmpCodes,  F_mpeSiqnCodes,  F_mpePositionCodes,   F_tbpeGainCodes,   F_tbpeIndexCodes,   F_tbpeMatrixCodes,   F_tbpeGridCodes,  F_ltpHistory,   F_syFilterState,   F_lspPrev,   F_analysisData);}SPEDEF.CC/**moduleF_speDef**constantdefinitionsforspeechencoder**COPYRIGHT(C)1995ERICSSONRADIOSYSTEMSAB**/#include"F_speDef.hh"#include<iostream.h>#include<math.h>constFloatF_tbpeDeltaQuantInit[F_nrTbpeDeltaGainLevel]={  -2.3,-2.04286,-1.78571,-1.52857,  -1.27143,-1.01429,-0.757143,-0.5,};constFloatVecF_tbpeDeltaQuantTable(F_nrTbpeDeltaGainLevel,  F_tbpeDeltaQuantInit);constFloatF_tbpeDeltaLimitInit[F_nrTbpeDeltaGainLevel-1]={  -2.17143,-1.91429,-1.65714,-1.4,  -1.14286,-0.885714,-0.628571};constFloatVecF_tbpeDeltaLimitTable(F_nrTbpeDeltaGainLevel-1,  F_tbpeDeltaLimitInit);SUB_MPE.CC/**classF_SpeSubMpe**Multipulseinnovationanalysis**COPYRIGHT(C)1995ERICSSONRADIOSYSTEMSAB**/#include"F_SpeSubMpe.hh"#include"ShortVec.hh"#include<iostream.h>#include<stdlib.h>#include<math.h>F_SpeSubMpe∷F_SpeSubMpe(){}/**functionF_SpeSubMpe∷main**/voidF_SpeSubMpe∷main(constFloatVec&amp;F_wCoeff,FloatF_excNormFactor,constFloatVec&amp;F_wLtpResidual,constFloatVec&amp;F_impulseResponse,FloatVec&amp;F_mpeInnovation,Shortint&amp;F_mpePositionCode,Shortint&amp;F_mpeAmpCode,Shortint&amp;F_mpeSignCode,Shortint&amp;F_mpeBlockMaxCode,FloatVec&amp;F_wMpeResidual,Float&amp;F_avgMpeAmp){/*temporaryvariables*/FloatVecF_autoCorr(F_subframeLength);FloatVecF_crossCorr(F_subframeLength);ShortVecF_seqPosVector(F_nMpeSeqPulses);FloatVecF_pulseAmp(F_nMpePulses);ShortVecF_mpePosVector(F_nMpePulses);ShortVecF_mpeAmpVector(F_nMpePulses);ShortVecF_mpeSignVector(F_nMpePulses);/*calculateautocorrelation*/F_autoCorrelate(  F_impulseResponse,  F_autoCorr);/*calculatecrosscorrelation*/F_crossCorrelate(  F_impulseResponse,  F_wLtpResidual,  F_crossCorr);/*dosequentialsearch(5pulses)withnorestrictions*/FsearchUnRestricted(  F_autoCorr,  F_crossCorr,  F_seqPosVector);/*doreoptimizationwithrespecttopossiblepositions*/F_reoptSearch(  F_autoCorr,  F_crossCorr,  F_impulseResponse,  F_wLtpResidual,  F_segPosVector,  F_mpePosVector,  F_pulseAmp);/*quantizeblockmaxandpulseamplitudes*/F_openLoopQuantize(  F_excNormFactor,  F_pulseAmp,  F_mpeAmpVector,  F_mpeSignVector,  F_mpeBlockMaxCode);/*makeinnovationvector*/F_makeInnVector(  F_pulseAmp,  F_mpePosVector,  F_mpeInnovation);/*orderpulseposition*/F_orderPositions(  F_mpePosVector,  F_mpeAmpVector,  F_mpeSignVector);/*makecodewordsposition*/F_makeCodeWords(  F_mpePosVector,  F_mpePositionCode,  F_mpeAmpVector,  F_mpeAmpCode,  F_mpeSignVector,  F_mpeSignCode);/*makenewweigthedresidual*/F_makeMpeResidual(  F_mpeInnovation,  F_wCoeff,  F_wLtpResidual,  F_wMpeResidual);/*computeaveragepulseamplitude*/F_avgMpeAmp=F_computeAvgAmp(  F_excNormFactor,F_pulseAmp);}/**functionF_SpeSubMpe∷F_maxMagIndex*/ShortintF_SpeSubMpe∷FmaxMagIndex(  constFloatVec&amp;F_corrVec,  constShortVec&amp;F_posTaken){  /*temporaryvariables*/  Floatmax  Floattemp;  inti;  ShortintmaxI=0;  /*initvariables*/  max=-1;  /*findpositionwithgreatestcorrelation  *excludingusedpositions*/  for(i=0;i<F_subframeLength;i++){  temp=fabs(F.corrVec[i]);  if(!F_posTaken[i]&amp;&amp;temp>max){  max=temp;  maxI=i;  }  }  returnmaxI;}/**functionF_SpeSubMpe∷F_maxMagIndexRestr*/ShortintF_SpeSubMpe∷F_maxMagIndexRestr(constFloatVec&amp;F_corrVec,constShortVec&amp;F_phaseTaken){/*temporaryvariables*/Floatmax;Floattemp;inti,j;ShortintmaxI=0;/*initvariables*/max=-1;/*findpositionwithgreatestcorrelation  *excludingusedphases*/for(i=0;i<F_nMpePhases;i++)  if(!F_phaseTaken[i])  for(j=i;j<F_subframeLength;j+=F_nMpePhases){  temp=fabs(F_corrVec[j]); if(temp>max){ max=temp;  maxI=j;  }}  returnmaxI;}/**functionF_SpeSubMpe∷F_calc2OptAmps*Computeoptimalamplitudesfor2selectedpulses*/voidF_SpeSubMpe∷F_calc2OptAmps(constShortVec&amp;F_posVec,constFloatVec&amp;F_autoCorr,constFloatVec&amp;F_crossCorr,FloatVec&amp;F_optAmp){/*temporaryvariables*/FloatVeca(2);FloatVecc(2);Floatden,denInv;/*initvectors*/a=F_autoCorr;a[1]=F_autoCorr[abs(F_posVec-F_posVec[1])];c=F_crossCorr[F_posVec];c[1]=F_crossCorr[F_posVec[1]];den=a*a-a[1]*a[1];if(den==0.0){  cerr<<"MPEsingular2*2matrix"<<endl;  return;}denInv=1.0/den;F_optAmp=(c*a-c[1]*a[1])*denInv;F_optAmp[1]=(c[1]*a-c*a[1])*denInv;}/**functionF_SpeSubMpe∷F_calc3OptAmps*Computeoptimalamplitudesfor3selectedpulses*/voidF_SpeSubMpe∷F_calc3OptAmps(constShortVec&amp;F_posVec,constFloatVec&amp;F_autoCorr,constFloatVec&amp;F_crossCorr,FloatVec&amp;F_optAmp){/*temporaryvariables*/FloatVeca(4);FloatVecc(3);Floatden,denInv;/*initvectors*/a=F_autoCorr;a[1]=F_autoCorr[abs(F_posVec-F_posVec[1])];  a[2]=F_autoCorr[abs(F_posVec-F_posVec[2])];  a[3]=F_autoCorr[abs(F_posVec[1]-F_posVec[2])];  c=F_crossCorr[F_posVec];  c[1]=F_crossCorr[F_posVec[1]];  c[2]=F_crossCorr[F_posVec[2]];  /*Kramersrule*/  den=a*a*a+a[1]*a[3]*a[2]+a[2]*a[1]*a[3]- a[1]*a[1]*a-a*a[3]*a[3]-a[2]*a*a[2];  if(den==0.0){  cerr<<"MPEsingular3*3matrix"<<endl;  return  }  denInv=1.0/den;  F_optAmp=(c*a*a+c[1]*a[3]*a[2]  +c[2]*a[1]*a[3]-c[1]*a[1]*a  -c*a[3]*a[3]-c[2]*a*a[2])*denInv;  F_optAmp[1]=(a*c[1]*a+a[1]*c[2]*a[2]  +a[2]*c*a[3]-a[1]*c*a  -a*c[2]*a[3]-a[2]*c[1]*a[2])*denInv;  F_optAmp[2]=(a*a*c[2]+a[1]*a[3]*c  +a[2]*a[1]*c[1]-a[1]*a[1]*c[2]  -a*a[3]*c[1]-a[2]*a*c)*denInv;}/**functionF_SpeSubMpe∷F_calc4OptAmps*Computeoptimalamplitudesfor4selectedpulses*(Choleskydecomposition)*/voidF_SpeSubMpe∷F_calc4OptAmps(constShortVec&amp;F_posVec,constFloatVec&amp;F_autoCorr,constFloatVec&amp;F_crossCorr,FloatVec&amp;F_optAmp){/*temporaryvariables*/Shortinti,j,k;Floatsum,tmp;FloatVecv(4*4);FloatVecw(4*4);FloatVecd(4);FloatVecy(4);FloatVecc(4);FloatVeca(4*4);/*initvectors*/for(i=0;i<4;i++)  for(j=0;j<=i;j++){  a[i*4+j]=  F_autoCorr[abs(F_posVec[i]-F_posVec[j])];  a[j*4+i]=a[i*4+j];  }for(i=0;i<4;i++)  c[i]=F_crossCorr[F_posVec[i]];  /*triangulardecomposition*/  for(j=0;j<4;j++){  sum=a[j*4+j];  for(k=0;k<j;k++){  tmp=v[j*4+k];  sum=sum-tmp*tmp*d[k];  }  if(fabs(sum)<1.0e-14){  cerr<<"MPEsingular4*4matrix"<<endl;  for(k=0;k<4;k++)  F_optAmp[k]=0;  break;  }  d[j]=sum;  for(i=j+1;i<4;i++){  sum=a[i*4+j];  for(k=0;k<j;k++)  sum=sum-v[i*4+k]*w[j*4+k];  w[i*4+j]=sum;  v[i*4+j]=sum/d[j];  }  }  /*invertthematrix,andgetthesolutionrecursively*/  for(i=0;i<4;i++){  sum=c[i];  for(j=0;j<i;j++)  sum=sum-v[i*4+j]*y[j];  y[i]=sum;  }  /*finally,collecttheresults*/  for(i=4-1;i>=0;i--){  sum=y[i]/d[i];  for(j=i+1;j<4;j++)  sum=sum-v[j*4+i]*F_optAmp[j];  F_optAmp[i]=sum;  }}/**functionF_SpeSubMpe∷F_updateCrossCorr**/voidF_SpeSubMpe∷F_updateCrossCorr(constFloatVec&amp;F_autoCorr,constShortintF_pos,constFloatF_gain,FloatVec&amp;F_crossCorrUpd){/*temporaryvariables*/inti;inttemp;  /*updatecrosscorrelationvector*/  temp=-F_mpeTruncLen+F_pos+1;  if(temp<0)  temp=0;  for(i=temp;i<F_pos;i++)  F_crossCorrUpd[i]=F_crossCorrUpd[i]  -F_gain*F_autoCorr[F_pos-i];  temp=F_pos+F_mpeTruncLen;  if(temp>F_subframeLength)  temp=F_subframeLength;  for(i=F_pos;i<temp;i++)  F_crossCorrUpd[i]=F_crossCorrUpd[i]  -F_gain*F_autoCorr[i-F_pos];}/**functionF_SpeSubMpe∷F_autoCorrelate**/voidF_SpeSubMpe∷F_autoCorrelate(constFloatVec&amp;F_impulseResponse,FloatVec&amp;F_autoCorr){/*temporaryvariables*/inti,j;/*calculateautocorrelationvector*/for(i=0;i<F_mpeTruncLen;i++){  F_autoCorr[i]=0.0;  for(j=i;j<F_mpeTruncLen;j++)  F_autoCorr[i]=  F_autoCorr[i]  +F_impulseResponse[j]*F_impulseResponse[j-i];};for(i=F_mpeTruncLen;i<F_subframeLength;i++)  F_autoCorr[i]=0.0;}/**functionF_SpeSubMpe∷F_crossCorrelate**/voidF_SpeSubMpe∷F_crossCorrelate(constFloatVec&amp;F_impulseResponse,constFloatVec&amp;F_wSpeechSubframe,FloatVec&amp;F_crossCorr){/*temporaryvariables*/inti,j,lastpos;/*calculatecrosscorrelationvector*/for(i=0;i<F_subframeLength;i++){F_crossCorr[i]=0.0;  lastpos=i+F_mpeTruncLen;  if(lastpos>F_subframeLength)  lastpos=F_subframeLength;  for(j=i;j<lastpos;j++)  F_crossCorr[i]=  F_crossCorr[i]  +F_wSpeechSubframe[j]*F_impulseResponse[j-i];  }}/**functionF_SpeSubMpe∷F_searchUnRestricted*Search5pulseswithnorespecttopossiblepositions*/voidF_SpeSubMpe∷F_searchUnRestricted(constFloatVec&amp;F_autoCorr,constFloatVec&amp;F_crossCorr,ShortVec&amp;F_seqPosVector){/*temporaryvariables*/FloatVecF_crossCorrUpd(F_subframeLength);FloatVecF_pulseAmp(F_nMpeSeqPulses-1);ShortVecF_posTaken(F_subframeLength);intpulse;inti;intpos;/*searchinit*/for(i=0;i<F_subframeLength;i++)  F_posTaken[i]=0;for(i=0;i<F_subframeLength;i++)  F_crossCorrUpd[i]=F_crossCorr[i];/*getfirstposition*/pos=F_maxMagIndex(F_crossCorr,F_posTaken);F_seqPosVector=pos;F_posTaken[pos]=1;/*updatecrosscorrelationvector*/F_updateCrossCorr(F_autoCorr,  pos,  F_crossCorr[pos]/F_autoCorr,  F_crossCorrUpd);/*getpositions2through5*/for(pulse=1;pulse<F_nMpeSeqPulses;pulse++){  /*getpositionwithmaximumvalue*/  pos=F_maxMagIndex(F_crossCorrUpd,F_posTaken);  F_seqPosVector[pulse]=pos;  F_posTaken[pos]=1;  if(pulse!=(F_nMpeSeqPulses-1)){  /*calculateoptimalamplitudesfor*selectedpositions*/  switch(pulse+1){  case2  F_calc2OptAmps(F_seqPosVector,  F_autoCorr,  F_crossCorr,  F_pulseAmp);  break;  case3  F_calc3OptAmps(F_seqPosVector,  F_autoCorr,  F_crossCorr,  F_pulseAmp);  break;  case4  F_calc4OptAmps(F_seqPosVector,  F_autoCorr,  F_crossCorr,  F_pulseAmp);  break;  };  /*updatecrosscorrelationvector*/  for(i=0;i<F_subframeLength;i++)  F_crossCorrUpd[i]=F_crossCorr[i];  for(i=0;i<pulse+1;i++)  F_updateCrossCorr(F_autoCorr,  F_seqPosVector[i],  F_pulseAmp[i],  F_crossCorrUpd);  }  }}/**functionF_SpeSubMpe∷F_searchRestricted*search3pulseswithrestrictiontopossiblepositions*/voidF_SpeSubMpe∷F_searchRestricted(constFloatVec&amp;F_autoCorr,constFloatVec&amp;F_crossCorr,ShortVec&amp;F_posVec,ShortVec&amp;F_phaseTaken,FloatVec&amp;F_pulseAmp){/*temporaryvariables*/FloatVecF_crossCorrUpd(F_subframeLength);Shortintpos;inti,pulse;/*updatecrosscorrelationvector*/for(i=0;i<F_subframeLength;i++)  F_crossCorrUpd[i]=F_crossCorr[i];F_updateCrossCorr(F_autoCorr,F_posVec,  F_pulseAmp,  F_crossCorrUpd);  /*searchpulse2and3*/  for(pulse=1;pulse<F_nMpePulses;pulse++){  pos=F_maxMagIndexRestr(F_crossCorrUpd,F_phaseTaken);  F_phaseTaken[pos%F_nMpePhases]=1;  F_posVec[pulse]=pos;  /*calculateoptimalamplitudesforselectedpositions*/  switch(pulse+1){  case2  F_calc2OptAmps(F_posVec,  F_autoCorr,  F_crossCorr,  F_pulseAmp);  break;  case3  F_calc3OptAmps(F_posVec,  F_autoCorr,  F_crossCorr,  F_pulseAmp);  break;  }  if(pulse!=(F_nMpePulses-1)){  /*updatecrosscorrelationvector*/  for(i=0;i<F_subframeLength;i++)  F_crossCorrUpd[i]=F_crossCorr[i];  for(i=0;i<pulse+1;i++)  F_updateCrossCorr(F_autoCorr,  F_posVec[i],  F_pulseAmp[i],  F_crossCorrUpd); }}}/**functionF_SpeSubMpe∷F_calcMpePredErr**Calculatepredictionerrorofcandidatempepulsevector**/FloatF_SpeSubMpe∷F_calcMpePredErr(constShortVec&amp;F_posVec,constFloatVec&amp;F_pulseAmp,constFloatVec&amp;F_impulseResponse,constFloatVec&amp;F_wTarget){/*temporaryvariables*/intpos,start,stop,i;FloatVecerror(F_subframeLength);FloaterrorEnergy;/*initerrorvector*/  for(i=0;i<F_subframeLength;i++)  error[i]=F_wTarget[i];  /*subtractfromtargetalinearcombinationof  *shiftedimpulseresponses*/  for(pos=0;pos<F_nMpePulses;pos++){  start=F_posVec[pos];  stop=start+F_mpeTruncLen;  if(stop>F_subframeLength)  stop=F_subframeLength;  for(i=start;i<stop;i++)  error[i]=error[i]-  F_pulseAmp[pos]*F_impulseResponse[i-start];  }  /*computeenergyinresultingerrorvector*/  errorEnergy=0;  for(i=0;i<F_subframeLength;i++)  errorEnergy=errorEnergy+error[i]*error[i];  returnerrorEnergy;}/**functionF_SpeSubMpe∷F_reoptSearch**Donewsearchwithstartpositionsequalto*thepreviousfound5positions**/voidF_SpeSubMpe∷F_reoptSearch(constFloatVec&amp;F_autoCorr,constFloatVec&amp;F_crossCorr,constFloatVec&amp;F_impulseResponse,constFloatVec&amp;F_wTarget,constShortVec&amp;F_seqPosVector,ShortVec&amp;F_mpePosVector,FloatVec&amp;F_mpePulseAmp){/*updatesposEncandfpulseGainwiththebest  *encodablealternativeusesidealPosand  *idealPulseGainsasstartingpoints  *forseveralsequentialsearches*//*temporaryvariables*/intstart,i;Floaterror,minError;ShortVecF_phaseTaken(F_nMpePhases);ShortVecF_tempPosVec(F_nMpePulses);FloatVecF_tempPulseAmp(F_nMpePulses);/*initvariables*/minError=1.0e30;/*searchforthebestoutof5pulseposition  *combinations*/for(start=0;start<F_nMpeSeqPulses;start++){  /*computefirstamplitude*/  F_tempPulseAmp=  F_crossCorr[F_seqPosVector[start]]/F_autoCorr;  /*resettaken-positionvector*/  for(i=0;i<F_nMpePhases;i++)  F_phaseTaken[i]=0;  /*reservethephasecorrespondingto  *seqPosVector[start]*/  F_phaseTaken[F_seqPosVector[start]%F_nMpePhases]=1;  F_tempPosVec=F_seqPosVector[start];  F_searchRestricted(F_autoCorr,  F_crossCorr,  F_tempPosVec,  F_phaseTaken,  F_tempPulseAmp);  error=F_calcMpePredErr(F_tempPosVec,  F_tempPulseAmp,  F_impulseResponse,  F_wTarget);  if(minError>error){  minError=error  for(i=0;i<F_nMpePulses;i++){  F_mpePulseAmp[i]=F_tempPulseAmp[i];  F_mpePosVector[i]=F_tempPosVec[i];  }  }}}/**functionF_SpeSubMpe∷openLoopQuantize*/voidF_SpeSubMpe∷F_openLoopQuantize(constFloat&amp;F_excNormFactor,FloatVec&amp;F_pulseAmp,ShortVec&amp;F_mpeAmpVector,ShortVec&amp;F_mpeSignVector,Shortint&amp;F_mpeBlockMaxCode){/*temporaryvariables*/FloatblockMax;FloatidealBlockMax;FloatblockMaxNorm;FloatnormPulseAmp;intpulse;Floattemp;/*getblockmaxvalue*/blockMax=0.0;  for(pulse=0;pulse<F_nMpePulses;pulse++){  temp=fabs(F_pulseAmp[pulse]);  if(temp>blockMax)  blockMax=temp;  }  idealBlockMax=blockMax;  /*quantizeblockmax*/  blockMaxNorm=blockMax/F_excNormFactor;  if(blockMaxNorm>  F_mpeBlockMaxQLimits[F_nMpeBlockMaxQLevels-2])  F_mpeBlockMaxCode=F_nMpeBlockMaxQLevels-1;  else  {  F_mpeBlockMaxCode=0;  while(blockMaxNorm>  F_mpeBlockMaxQLimits[F_mpeBlockMaxCode])  F_mpeBlockMaxCode++;  }  blockMax=F_mpeBlockMaxQLevels[F_mpeBlockMaxCode]*  F_excNormFactor;  /*quantizepulseamplitudes*/  for(pulse=0;pulse<F_nMpePulses;pulse++){  normPulseAmp=fabs(F_pulseAmp[pulse])/blockMax;  if(normPulseAmp>  F_mpeAmpQLimits[F_nMpeAmpQLevels-2])  F_mpeAmpVector[pulse]=F_nMpeAmpQLevels-1;  else  {  F_mpeAmpVector[pulse]=0;  while(normPulseAmp>  F_mpeAmpQLimits[F_mpeAmpVector[pulse]]}  FmpeAmpVector[pulse]++;  }  if(F_pulseAmp[pulse]>0.0){  F_mpeSignVector[pulse]=1;  F_pulseAmp[pulse]=  F_mpeAmpQLevels[F_mpeAmpVector[pulse]]*  blockMax;  }else{  F_mpeSignVector[pulse]=0;  F_pulseAmp[pulse]=  -1.0*F_mpeAmpQLevels[F_mpeAmpVector[pulse]]*  blockMax;  }}}/**functionF_SpeSubMpe∷F_makeInnVector*/voidF_SpeSubMpe∷F_makeInnVector(constFloatVec&amp;F_pulseAmp,  constShortVec&amp;F_mpePosVector,  FloatVec&amp;F_mpeInnovation){  /*temporaryvariables*/  inti;  /*createinnovationvector*/  for(i=0;i<F_subframeLength;i++)  F_mpeInnovation[i]=0.0;  for(i=0;i<F_nMpePulses;i++)  F_mpeInnovation[F_mpePosVector[i]]=F_pulseAmp[i];}/**functionF_SpeSubMpe∷F_orderPositions*/voidF_SpeSubMpe∷F_orderPositions(ShortVec&amp;F_mpePosVector,ShortVec&amp;F_mpeAmpVector,ShortVec&amp;F_mpeSignVector){/*temporaryvariables*/ShortVectempPosVector(F_nMpePulses);ShortVectempAmpVector(F_nMpePulses);ShortVectempSignVector(F_nMpePulses);intmaxVal,maxPhase;intmaxI=0;inti,j;/*Createtemporaryvectors*/for(i=0;i<F_nMpePulses;i++){  tempPosVector[i]=F_mpePosVector[i];  tempAmpVector[i]=F_mpeAmpVector[i];  tempSignVector[i]=F_mpeSignVector[i];}/*fixordering,thepositionphasesareordered  *decreasingly*/for(i=0;i<F_nMpePulses;i++){  maxVal=-1;  maxPhase=-1;  for(j=0;j<F_nMpePulses;j++){  if((tempPosVector[j]%F_nMpePhases)>maxPhase&amp;&amp;  tempPosVector[j]!=-10){  maxPhase=tempPosVector[j]%F_nMpePhases;  maxVal=tempPosVector[j];  maxI=j;  }  }  /*excludefoundvectorfromsearch*/  tempPosVector[maxI]=-10;  /*orderpulses*/  F_mpePosVector[i]=maxVal;  F_mpeAmpVector[i]=tempAmpVector[maxI];F_mpeSignVector[i]=tempSignVector[maxI];}}/**functionF_SpeSubMpeF_makeCodeWords**/voidF_SpeSubMpe∷F_makeCodeWords(constShortVec&amp;F_mpePosVector,Shortint&amp;F_mpePositionCode,constShortVec&amp;F_mpeAmpVector,Shortint&amp;F_mpeAmpCode,constShortVec&amp;F_mpeSignVector,Shortint&amp;F_mpeSignCode){/*temporaryvariables*/inti,phaseIndex;/*codepositionvectorinto13bits*//*putphaseindicesintocodeword*/phaseIndex=0;for(i=0;i<F_nMpePulses;i++)  phaseIndex+=(1<<  (F_mpePosVector[i]%F_nMpePhases));F_mpePositionCode=F_mpePhaseCodeTable[phaseIndex];/*putgroupindices*/for(i=F_nMpePulses-1;i>=0;i--){  F_mpePositionCode<<=F_nMpeGroupBits;  F_mpePositionCode=F_mpePosVector[i]/F_nMpePhases;}/*codeMpesigns*/F_mpeSignCode=0;for(i=0;i<F_nMpePulses;i++)  F_mpeSignCode=(F_mpeSignVector[i]<<i);/*codeMpeamps*/F_mpeAmpCode=0;for(i=0;i<F_nMpePulses;i++)  F_mpeAmpCode=(F_mpeAmpVector[i]<<i*F_mpeAmpBits);}/**functionF_SpeSubMpe∷F_makeMpeResidual**/voidF_SpeSubMpe∷F_makeMpeResidual(constFloatVec&amp;F_mpeInnovation,constFloatVec&amp;F_wCoeff,constFloatVec&amp;F_wLtpResidual,FloatVec&amp;F_wMpeResidual){/*temporaryvariables*/inti,m;Floatsignal;  FloatVecstate(F_nrCoeff);  /*setzerostate*/  for(i=0;i<F_nrCoeff;i++)  state[i]=0.0;  /*calculatenewtargetforsubsequentTBPEsearch*/  for(i=0;i<F_subframeLength;i++){  signal=F_mpeInnovation[i];  for(m=F_nrCoeff-1;m>0;m--){  signal-=F_wCoeff[m]*state[m];  state[m]=state[m-1];  }  signal-=F_wCoeff*state;  state=signal;  F_wMpeResidual[i]=F_wLtpResidual[i]-signal;}}/**functionF_SpeSubMpe∷F_computeAvgAmp**/FloatF_SpeSubMpe∷F_computeAvgAmp(FloatF_excNormFactor,constFloatVec&amp;F_pulseAmp){/*temporaryvariables*/Floattemp;inti;/*computeaveragepulseamplitude*/temp=0;for(i=0;i<F_nMpePulses;i++)  temp=temp+fabs(F_pulseAmp[i]];temp=temp/(F_nMpePulses*F_excNormFactor);returntemp;}SUB_IBPE.CC/**classF_SpeSubTbpe*TransformedBinaryPulseExcitedcodebook*COPYRIGHT(C)1995ERICSSONRADIOSYSTEMSAB*/#include"F_SpeSubTbpe.hh"#include<iostream.h>#include<math.h>F_SpeSubTbpe∷F_SpeSubTbpe(){}/**functionF_SpeSubTbpe∷main*/voidF_SpeSubTbpe∷main(constFloatVec&amp;F_wMpeResidual,  constFloatVec&amp;F_wCoeff,  constFloat&amp;F_excNormFactor,  constFloat&amp;F_avgMpeAmp,  constFloatVec&amp;F_impulseResponse,  FloatVec&amp;F_tbpeInnovation,  Shortint&amp;F_tbpeGainCode,  Shortint&amp;F_tbpeIndexCode,  Shortint&amp;F_tbpeGridCode,  Shortint&amp;F_tbpeMatrixCode){  FloatF_optGain=F_search(F_wMpeResidual,  F_wCoeff,  F_impulseResponse,  F_tbpeInnovation,  F_tbpeIndexCode,  F_tbpeGridCode,  F_tbpeMatrixCode);  FloatF_tbpeGain;  F_gainQuant(F_excNormFactor,  F_avgMpeAmp,  F_optGain,  F_tbpeGainCode,  F_tbpeGain);  for(Shortinti=0;i<F_subframeLength;i++)  F_tbpeInnovation[i]=F_tbpeInnovation[i]*F_tbpeGain;}/**functionF_SpeSubTbpe∷F_crossCorr**/voidF_SpeSubTbpe∷F_crossCorr(constFloatVec&amp;v1,  constFloatVec&amp;v2,  FloatVec&amp;F_corr){for(Shortinti=0;i<F_subframeLength;i++){  Floatacc=0.0;  for(Shortintj=i;j<F_subframeLength;j++)  acc+=v1[j]*v2[j-i];  F_corr[i]=acc;}}/**functionF_SpeSubTbpe∷F_crossCorrOfTransfMatrix*/voidF_SpeSubTbpe∷F_crossCorrOfTransfMatrix(constFloatVec&amp;v1,  constShortintgrid,  constShortintmatrix,  FloatVec&amp;F_crossCorr){for(Shortintm=0;m<F_nrTbpePulses;m++){  Floatacc=0.0;  for(Shortintn=0;n<F_nrTbpePulses;n++)  acc+=v1[grid+n*F_tbpeGridSpace]*  F_tbpeTransfTable[(m+matrix*F_nrTbpePulses)*F_nrTbpePulses+n];  F_crossCorr[m]=acc;}}/**functionF_SpeSubTbpe∷F_zeroStateFilter**/voidF_speSubTbpe∷F_zeroStateFilter(constFloatVec&amp;in,  constFloatVec&amp;F_denCoeff,  FloatVec&amp;out){  /*zerostatesearchfilter*/  FloatVecF_state(F_nrCoeff);  for(inti=0;i<F_nrCoeff;i++) F_state[i]=0.0;  for(i=0;i<F_subframeLength;i++){  Floatsignal=in[i];  for(Shortintm=F_nrCoeff-1;m>0;m--){  sigmal-=F_denCoeff[m]*F_state[m];  F_state[m]=F_state[m-1];  }signal-=F_denCoeff*F_state;  F_state=signal;  out[i]=signal;}}/**functionF_SpeSubTbpe∷F_construct**/voidF_SpeSubTbpe∷F_construct(constShortintindex,  constShortintgrid,  constShortintmatrix,  FloatVec&amp;vec){  /*zeroresultvector*/  for(inti=0;i<F_subframeLength;i++)  vec[i]=0.0;  for(Shortintj=0;j<F_nrTbpePulses;j++){  Floatsum=0.0;  Shortintitemp=index;  for(Shortinti=0;i<F_nrTbpePulses;i++){  if(itemp&amp;1)  sum+=F_tbpeTransfTable[(i+matrix*F_nrTbpePulses)*F_nrTbpePulses+j];  else  sum-=F_tbpeTransfTable[(i+matrix*F_nrTbpePulses)*F_nrTbpePulses+j];  itemp>>=1;  }  vec[grid+j*F_tbpeGridSpace]=sum;}}/**functionF_SpeSubTbpe∷F_calcPower**/voidF_SpeSubTbpe∷F_calcPower(constFloatVec&amp;F_in,  Float&amp;F_power){F_power=0.0;for(inti=0;i<F_subframeLength;i++)  F_power+=F_in[i]*F_in[i];}/**functionF_SpeSubTbpe∷F_calcCorr**/voidF_SpeSubTbpe∷F_calcCorr(constFloatVec&amp;F_cross,  constFloatVec&amp;F_signVector,Float&amp;F_corr){ F_corr=0.0; for(inti=0;i<F_nrTbpePulses;i++) F_corr+=F_cross[i]*F_signVector[i];}/**functionF_SpeSubTbpe∷F_decision**/voidF_SpeSubTbpe∷F_decision(constFloatF_corr,  constFloatF_power,  constShortintF_index,  constShortintF_grid,  constShortintF_matrix,  Float&amp;F_bestCorr,  Float&amp;F_bestPower,  Shortint&amp;F_bestIndex,  Shortint&amp;F_bestGrid,  Shortint&amp;F_bestMatrix,  Shortint&amp;F_updated){  F_updated=0;  if(F_corr*F_corr*F_bestPower>F_bestCorr*F_bestCorr*F_power){  F_bestCorr=F_corr;  F_bestPower=F_power;  F_bestIndex=F_index;  F_bestGrid=F_grid;  F_bestMatrix=F_matrix;  F_updated=1;  }}/**functionF_SpeSubTbpe∷F_search**F_zeroStateFilter8*F_calcPower8*F_calcCorr8*F_decision8*F_crossCorr1*F_crossCorrOfTransfMatrix8*F_construct9*/FloatF_SpeSubTbpe∷F_search(constFloatVec&amp;F_wMpeResidual,  constFloatVec&amp;F_wCoeff,  constFloatVec&amp;F_impulseResponse,  FloatVec&amp;F_tbpeInnovation,  Shortint&amp;F_tbpeIndexCode,  Shortint&amp;F_tbpeGridCode,  Shortint&amp;F_tbpeMatrixCode){  FloatVecF_filtered(F_subframeLength);  /*computecorrelationbetweenimpulseresponseandspeech*/  FloatVecF_corrIS(F_subframeLength);  F_crossCorr(F_wMpeResidual,F_impulseResponse,F_corrIS);  /*testforallgridsandallmatrices*/  FloatF_bestCorr=0.0;  FloatF_bestPower=1.0;  F_tbpeIndexCode=0;  F_tbpeGridCode=0;  F_tbpeMatrixCode=0;  for(ShortintF_matrix=0;F_matrix<F_nrTbpeMatrices;F_matrix++)  for(ShortintF_grid=0;F_grid<F_nrTbpeGrids;F_grid++){  /*calculatecrosscorrelations*/  FloatVecF_cross(F_nrTbpePulses);  F_crossCorrOfTransfMatrix(F_corrIS,  F_grid,  F_matrix,  F_cross);  /*approximatethepulseswithsignofcrosscorrelation  */  ShortintF_index=0;  FloatVecF_signVector(F_nrTbpePulses);  for(inti=0;i<F_nrTbpePulses;i++)  F_signVector[i]=-1.0;  for(i=0;i<F_nrTbpePulses;i++)  if(F_cross[i]>0){  F_signVector[i]=1;  F_index=(1<<i);  }  /*constructfilteredexcitationvector*/  F_construct(F_index,F_grid,F_matrix,F_tbpeInnovation);  F_zeroStateFilter(F_tbpeInnovation,F_wCoeff,F_filtered);  /*computepowerandcorrelations*/  FloatF_power;  FloatF_corr;  F_calcPower(F_filtered,  F_power);  F_calcCorr(F_cross,  F_signVector,  F_corr);  /*makedecision*/  ShortintF_updated;  F_decision(F_corr,F_power,  F_index,  F_grid,  F_matrix,  F_bestCorr,  F_bestPower,  F_tbpeIndexCode,  F_tbpeGridCode,  F_tbpeMatrixCode,  F_updated);  }  F_construct(F_tbpeIndexCode,F_tbpeGridCode,F_tbpeMatrixCode,  F_tbpeInnovation);  returnF_bestCorr/F_bestPower;}/**functionF_SpeSubTbpe∷F_gainQuant**/voidF_SpeSubTbpe∷F_gainQuant(constFloat&amp;F_excNormFactor,constFloat&amp;F_avgMpeAmpmp,constFloat&amp;F_optGain,  Shortint&amp;F_tbpeGainCode,  Float&amp;F_tbpeGain){FloatF_logGain;if(F_optGain>0)/*sanitycheck*/  F_logGain=log(F_optGain);else{  F_logGain=F_tbpeDeltaQuantTable;  cerr<<"ERRORF_SpeSubTbpe∷F_gainQuantF_optGain<=0"  <<endl;}FloatF_predGain;if((F_excNormFactor>0)&amp;&amp;(F_avgMpeAmp>0))/*sanitycheck*/  F_predGain=log(F_excNormFactor)+  F_tbpeDeltaPredCoeff*log(F_avgMpeAmp);else{  F_predGain=F_tbpeDeltaQuantTable;  cerr<<"ERRORF_SpeSubTbpe∷F_gainQuantF_excNormFactor  <=0orF_avgMpeAmp<=0"<<endl;}FloatF_delta=F_logGain-F_predGain;F_tbpeGainCode=F_quantize(F_delta);F_tbpeGain=exp(F_predGain+  F_tbpeDeltaQuantTable[F_tbpeGainCode]);}/**functionF_SpeSubTbpe∷F_quantize*ShortintF_SpeSubTbpe∷F_quantize(constFloatvalue){Shortinti=0;if(value>F_tbpeDeltaLimitTable[F_nrTbpeDeltaGainLevel-2])  i=F_nrTbpeDeltaGainLevel-1;else  while(value>F_tbpeDeltaLimitTable[i])  i++;returni;}MAIN.HH/**classF_SpeMain**mainclassforspeechencoder**COPYRIGHT(C)1995ERICSSONRADIOSYSTEMSAB**/#ifndefF_SpeMain_h#defineF_SpeMain_h#include"F_SpeDef.hh"#include"F_SpeFrame.hh"#include"F_SpeSubPre.hh"#include"F_SpeSubLtp.hh"#include"F_SpeSubMpe.hh"#include"F_SpeSubTbpe.hh"#include"F_SpeSubPost.hh"#include"F_SpePost.hh"classF_SpeMain{publicF_SpeMain();/*in,firstsamples*//*constructor*/voidmain(  constFloatVec&amp;F_speechFrame,  /*in,16bitspeechframe*/  ShortVec&amp;F_analysisData);  /*out,analysisdataframe*//*mainroutine*/privateF_SpeFrameF_speFrame;/*frameprocessing*/F_SpeSubPreF_speSubPre;/*subframepreprocessing*/F_SpeSubLtpF_speSubLtp;/*LTPanalysis*/F_SpeSubMpeF_speSubMpe;/*MPEanalysis*/F_SpeSubTbpeF_speSubTbpe;/*"TBPEanalysis*/F_SpeSubPostF_speSubPost;/*subframepostprocessing*/F_SpePostF_spePost;/*postprocessing*/FloatVecF_speechSave;/*speechsavedbetween*  *frames*/FloatVecF_lspPrev;/*previousLSPparameters*/FloatVecF_ltpHistory;/*LTPhistory*/FloatVecF_weightFilterRingState;/*Weightingfilter  *ringingstates*/FloatVecF_syFilterState;/*Synthesisfilterstates*/};#endifSPE_DEF.HH/**moduleF_speDef**constantdefinitionsforspeechencoder**/#ifndefF_speDef_h#defineF_speDef_h#include"typedefs.h"#include"FloatVec.hh"#include"ShortVec.hh"#include"LongVec.hh″constFloatF_tbpeDeltaPredCoeff=1.03;  /*Deltapredictioncoefficient*/externconstFloatVecF_tbpeDeltaQuantTable;  /*QuantizertableforTBPEdeltagain*/externconstFloatVecF_tbpeDeltaLimitTable;  /*Limitsforgaindeltaquantizer*/#endifSUB_MPE.HH/**classF_SpeSubMpe**Multipulseinnovationanalysis**COPYRIGHT(C)1995ERICSSONRADIOSYSTEMSAB**/#ifndefF_SpeSubMpe_h#defineF_SpeSubMpe_h#include"F_speDef.hh"classF_SpeSubMpe{public;F_SpeSubMpe();/*constructor*/voidmain(  constFloatVec&amp;F_wCoeff,/*in*/  FloatF_excNormfactor,/*in*/  constFloatVec&amp;F_wLtpResidual,/*in*/  constFloatVec&amp;F_impulseResponse,/*in*/  FloatVec&amp;F_mpeInnovation,/*out*/  Shortint&amp;F_mpePositionCode,/*out*/  Shortint&amp;F_mpeAmpCode,/*out*/  Shortint&amp;F_mpeSignCode,/*out*/  Shortint&amp;F_mpeBlockMaxCode,/*out*/  FloatVec&amp;F_wMpeResidual,/*out*/  Float&amp;F_avgMpeAmp);/*out*/ /*MainroutineformoduleF_SpeSubMpe*/ ShortintF_maxMagIndex(  constFloatVec&amp;F_corrVec,/*in*/  constShortVec&amp;F_posTaken);/*in*/ /*Searchforpulsepositionwithmaxcorrelationsofar*/  ShortintF_maxMagIndexRestr(  constFloatVec&amp;F_corrVec,/*in*/  constShortVec&amp;F_phaseTaken);/*in*/  /*Searchforpulsepositionwithmaxcorrelationsofar*/  voidF_calc2OptAmps(  constShortVec&amp;F_posVec,/*in*/  constFloatVec&amp;F_autoCorr,/*in*/  constFloatVec&amp;F_crossCorr,/*in*/  FloatVec&amp;F_optAmp);/*out*/  /*Solvefor2optimalamplitudes*/  voidF_calc3OptAmps(  constShortVec&amp;F_posVec,/*in*/constFloatVec&amp;F_autoCorr,/*in*/  constFloatVec&amp;F_crossCorr,/*in*/  FloatVec&amp;F_optAmp);/*out*//*Solvefor3optimalamplitudes*/voidF_calc4OptAmps(constShortVec&amp;F_posVec,/*in*/constFloatVec&amp;F_autoCorr,/*in*/constFloatVec&amp;F_crossCorr,/*in*/FloatVec&amp;F_optAmp);/*out*//*Solvefor4optimalamplitudes*/voidF_updateCrossCorr(constFloatVec&amp;F_autoCorr,/*in*/constShortintF_pos,/*in*/constFloatF_gain,/*in*/FloatVec&amp;F_crossCorrUpd);/*out*//*Updatecrosscorrelationvector*/voidF_autoCorrelate(constFloatVec&amp;F_impulseResponse,/*in*/FloatVec&amp;F_autoCorr);/*out*//*Computeautocorrelationvectorofimpulseresponse*/voidF_crossCorrelate(constFloatVec&amp;F_impulseResponse,/*in*/constFloatVec&amp;F_wLtpResidual,/*in*/FloatVec&amp;F_crossCorr);/*out*//*Computecrosscorrelationbetweeninputspeech*andimpulseresponse*/voidF_searchUnRestricted(constFloatVec&amp;F_autoCorr,/*in*/constFloatVec&amp;F_crossCorr,/*in*/ShortVec&amp;F_seqPosVector);/*out*//*Searchfor5pulseswithnorestrictionsregarding*possiblepositions*/voidF_searchRestricted(constFloatVec&amp;F_autoCorr,/*in*/constFloatVec&amp;F_crossCorr,/*in*/ShortVec&amp;F_posVec,/*in*/ShortVec&amp;F_phaseTaken,/*in*/FloatVec&amp;F_pulseAmp);/*in*//*Searchfor3pulseswithrestrictionsregardnig*possiblepositions*/FloatF_calcMpePredErr(constShortVec&amp;F_posVec,/*in*/constFloatVec&amp;F_pulseAmp,/*in*/ constFloatVec&amp;F_impulseResponse,/*in*/ constFloatVec&amp;F_wTarget);/*in*//*Calculatethepredictiongainofthecandidate*mpevector*/voidF_reoptSearch(constFloatVec&amp;F_autoCorr,/*in*/constFloatVec&amp;F_crossCorr,/*in*/constFloatVec&amp;F_impulseResponse,/*in*/constFloatVec&amp;F_wTarget,/*in*/constShortVec&amp;F_segPosVector,/*in*/ShortVec&amp;F_mpePosVector,/*out*/FloatVec&amp;F_mpePulseAmp);/*out*//*Findthepositioncombinationthatgives*thebestpredictiongain*/voidF_openLoopQuantize(constFloat&amp;F_excEnergy,/*in*/FloatVec&amp;F_pulseAmp,/*out*/ShortVec&amp;F_mpeAmpVector,/*out*/ShortVec&amp;F_mpeSignVector,/*out*/Shortint&amp;F_mpeBlockMaxCode);/*out*//*CalculateblockMaxandopenloopquantize*blockmaxandpulses*/voidF_makeInnVector(constFloatVec&amp;F_pulseAmp,/*in*/constShortVec&amp;F_mpePosVector,/*in*/FloatVec&amp;F_mpeInnovation);/*out*//*Makeinnovationvector*/voidF_orderPositions(ShortVec&amp;F_mpePosVector,/*in/out*/ShortVec&amp;F_mpeAmpVector,/*in/out*/ShortVec&amp;F_mpeSignVector);/*in/out*//*Orderpositions(optimumpositionencoding)*/voidF_makeCodeWords(constShortVec&amp;F_mpePosVector,/*in*/Shortint&amp;F_mpePositionCode,/*out*/constShortVec&amp;F_mpeAmpVector,/*in*/Shortint&amp;F_mpeAmpCode,/*out*/constShortVec&amp;F_mpeSignVector,/*in*/Shortint&amp;F_mpeSignCode);/*out*//*Constructcodewords*/voidF_makeMpeResidual(constFloatVec&amp;F_mpeInnovation,/*in*/constFloatVec&amp;F_wCoeff,/*in*/constFloatVec&amp;F_wLtpResidual,/*in*/FloatVec&amp;F_wMpeResidual);/*out*//*MakenewweigthedresidualwithMPEcontribution  *removed*/  FloatF_computeAvgAmp(  FloatF_excNormFactor,/*in*/  constFloatVec&amp;F_pulseAmp);/*in*/  /*Computeaveragemultipulseamplitude*/};#endifSUBTBPE.HH/**classFSpeSubTbpe**TransformedBinaryPulseExcitedcodebook**COPYRIGHT(C)1995ERICSSONRADIOSYSTEMSAB**/#ifndefF_SpeSubTbpe_h#defineF_SpeSubTbpe_h#include"F_speDef.hh"#include"FloatVec.hh"classF_SpeSubTbpe{publicF_SpeSubTbpe();/*constructor*/voidF_SpeSubTbpe::main(  constFloatVec&amp;F_wMpeResidual,              /*in,WeightedMPE  *residual=*/  *F_wLtpResidualwithMPE*/  constFloatVec&amp;F_wCoeff,  /*in,weighteddirectform  *coeff*/  constFloat&amp;F_excNormFactor,  /*in,Excitation  *normalizationfactor*/  constFloat&amp;F_avgMpeAmp,/*in,averageMp  *amplitude*/  constFloatVec&amp;F_impulseResponse,  /*in,impulseresponsefor  *thesearchfilter*/  FloatVec&amp;F_tbpeInnovation,/*out,TBPEinnovation,  *quanTizedgainincluded*/  Shortint&amp;F_tbpeGainCode,/*our,TBPEgaincode*/  Shortint&amp;F_tbpeIndexcode,/*out,TBPEpulse  *signcode*/  Shortint&amp;F_tbpeGridCode,/*out,TBPEgridcode*/  Shortint&amp;F_tbpeMatrixCode);/*out,TBPEtransform  *matrixcode*/ /*MainroutinforTBPEcodebooksearch*/ voidFcrossCorr(  constFloatVec&amp;v1,/*in,TargetVector1*/  constFloatVec&amp;v2,/*in,TargetVector2*/  FloatVec&amp;F_corr);/*out,Crosscorrelated  *vector*/ /*Calculatecrosscorrelation*/voidF_crossCorrOfTransfMatrix(constFloatVec&amp;vl,/*in,Targetvector*/constShortintgrid,/*in,Thegridnumber*/constShortintmatrix,/*in,Thematrixnumber*/FloatVec&amp;F_crossCorr);/*out,Crosscorrelated  *vector*//*Calculatecrosscorrelationforthe*transformationmatrix*/voidF_zeroStateFilter(constFloatVec&amp;in,/*in,Vectortobe  *filtered*/constFloatVec&amp;F_denCoeff,/*in,Directform  *coefficient*/FloatVec&amp;out);/*out,Filteredvector*//*ZerostatefilterwithcoefficientsF_denCoeff*/voidF_construct(constShortintindex,/*in,Indexcode*/constShortintgrid,/*in,Gridcode*/constShortintmatrix,/*in,Matrixcode*/FloatVec&amp;vec);/*out,Constructed  *excitation*//*Constructaexcitationvector*/voidF_calcPower(constFloatVec&amp;F_in,/*in,inputvector*/Float&amp;F_power);/*out,powerofinput  *vector*//*Calculatepowerofinputvector*/voidF_calcCorr(constFloatVec&amp;F_cross,/*in,crosscorrof  *transfmatrix*/constFloatVec&amp;F_signVector,  /*in,vectorofsigns*/Float&amp;F_corr);/*out,correlationof  *inputvectors*//*Calculatepowerofinputvector*/voidF_decision(constFloatF_corr,/*in,testedcorrelation*/constFloatF_power,/*in,testedpower*/constShortintF_index,/*in,testedindex*/constShortintF_grid,/*in,testedgrid*/constShortintF_matrix,/*in,testedmatrix*/Float&amp;F_bestCorr,/*in/out,savedbest  *correlation*/Float&amp;F_bestPower,/*in/out,savedbest  *power*/Shortint&amp;F_tbpeIndexCode,/*in/out,savedbest*index*/Shortint&amp;F_tbpeGridCode,/*in/out,savedbestgrid*/Shortint&amp;F_tbpeMatrixCode,/*in/out,savedbest  *matrix*/Shortint&amp;F_updated);/*out,TRUEifparameters  *hasbeenupdated.  *usedfortestingonly*//*Makedecision*/FloatF_search(  constFloatVec&amp;F_wMpeResidual,  /*in,WeightedMPEresidual=F_wLtpResidual  *withMPEinnovationremoved*/  constFloatVec&amp;F_wCoeff,  /*in,Weighteddirectformcoeffs*/  constFloatVec&amp;F_impulseResponse,  /*in,impulseresponseforthesearchfilter*/  FloatVec&amp;F_tbpeInnovation,  /*out,TBPEinnovation,quantizedgain  included*/  Shortint&amp;F_tbpeIndexCode,  /*out,TBPEpulsesigncode*/  Shortint&amp;F_tbpeGridCode,  /*out,TBPEgridcode*/  Shortint&amp;F_tbpeMatrixCode);  /*out,TBPEtransformmatrixcode*//*searchforbestindex,*approximateindexwithsignofcorrelation,*examineallgridsandmatrices*returnoptimalinnovation,gainCode,index,grid,matrix*/voidF_gainQuant(  constFloat&amp;F_excNormFactor,  /*in,Excitationnormalizationfactor*/  constFloat&amp;F_avgMpeAmp,  /*in,averageMPamplitude*/  constFloat&amp;F_optGain,  /*in,optimalTBPEgain*/  Shortint&amp;F_tbpeGainCode,  /*out,TBPEgaincode*/  Float&amp;F_tbpeGain);/*out,TBPEgain*//*PredictandquantizeTBPEgain*/ShortintF_quantize(  constFloatvalue);/*in,valuetobequantized*//*QuantizeTBPEgain*/};#endif]]></pre>权利要求1.一种在综合分析线性预测编码中用于激励的增益量化方法为来自第一码本的最优第一矢量确定最优第一增益;量化所说的最优第一增益;为来自第二码本的最优第二矢量确定最优第二增益;由至少是所说的量化最优第一增益确定所说的最优第二增益的对数的第一线性预测;量化所说的最优第二增益的对数与所说的第一线性预测之间的第一误差。2.根据权利要求1的一种方法,其中所说的第一线性预测包括所说的量化最优第一增益与所说的最优第一矢量的能量的平方根测量值的乘积的对数。3.根据权利要求2的一种方法,其中所说的第一码本是自适应码本,而所说的第二码本是一固定码本。4.根据权利要求2的一种方法,其中所说的第一码本是多脉冲激励码本,而所说的第二码本是转换双脉冲激励码本。5.根据权利要求3或4的一种方法,其中所说的测量值包括所说最优第一矢量的分量的平方和的平方根。6.根据权利要求4的一种方法,其中所说测量值包括所说的最优第一矢量的平均脉冲幅度。7.根据权利要求1的一种方法,包括更多的步骤由所说的量化第一差值确定和量化所说的最优第二增益;由第三码本最优第三矢量确定最优第三增益;由至少是所说的量化最优第二增益确定所说的最优第三增益的对数的第二线性预测;量化在所说的最优第三增益的对数与所说的第二线性预测之间的第二差值。8.根据权利要求7的方法,其中所说的第一码本是自适应码本,所说的第二码本是多脉冲激励码本,而所说的第三码本是转换双脉冲激励码本。9.根据权利要求1的方法,其中所说的第一线性预测也包括来自前面所确定的激励的量化增益。10.根据权利要求7的方法,其中所说的第一和第二线性预测也包括来自前面所确定的激励的量化增益。全文摘要在综合-分析线性预测编码中的一种增益量化方法,包括步骤:为来自第一码本的最优激励矢量确定第一增益(GAIN1);量化第一增益(GAIN1);为来自第二码本的最优激励矢量确定最优第二增益;由量化第一增益(GAIN1)确定第二增益(GAIN2)的对数的线性预测;量化在第二增益的对数与线性预测之间的误差(σ)。文档编号G10L19/083GK1188556SQ9619491公开日1998年7月22日申请日期1996年4月12日优先权日1995年5月3日发明者Y·蒂内尔申请人:艾利森电话股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1