法律状态公告日
法律状态信息
法律状态
2012-12-19
授权
授权
2011-12-28
实质审查的生效 IPC(主分类):G10L19/02 申请日:20100413
实质审查的生效
2011-10-19
公开
公开
技术领域
本发明涉及音频编解码技术,尤其涉及一种可分层音频编解码方法、系统及瞬态信号可分层编解码方法。
背景技术
可分层音频编码是指以分层的方式组织音频编码的码流,一般分成一个核心层和若干个扩展层,解码器可以在没有高层(譬如扩展层)编码码流的情况下实现只对低层(譬如核心层)编码码流进行解码,解码的层数越多,音质提高得越大。
可分层编码技术对于通信网络有非常重要的实用价值。一方面,数据的传输可以由不同信道共同合作完成,而每个信道的丢包率都有可能不同,这时候往往需要对数据进行可分层处理,将数据中重要的部分放在丢包率相对较低的稳定信道中传输,而将数据中次要的部分放在丢包率相对较高的非稳定信道中传输,从而保证当非稳定信道丢包时只会产生相对的音质下降,而不会出现一帧数据完全无法解码的情况。另一方面,某些通信网络(比如因特网)的带宽很不稳定,不同用户之间的带宽各不相同,不能采用一个固定的码率来兼顾不同带宽用户的需求,而采用可分层的编码方案就可以使得不同用户在各自所拥有的带宽条件下获得最佳的音质享受。
传统的可分层音频编码方案,比如ITU(International TelecommunicationUnion,国际电信联合会)的标准G.729.1和G.VBR,都没有针对瞬态信号帧实施针对性的处理,因此对于含有较多瞬态成分的信号(比如打击乐信号)编码效果较低,尤其是在中低码率的传输条件下。
发明内容
本发明所要解决的技术问题是,提供一种高效的可分层音频编码、解码方法及系统及瞬态信号可分层编解码方法,以改善可分层音频编解码的质量。
为解决上述问题,本发明提供了一种可分层音频编码方法,包括:
对当前帧的音频信号进行瞬态判决;
瞬态判决为稳态信号时,对加窗后的音频信号直接进行时频变换得到总的频域系数;瞬态判决为瞬态信号时,将音频信号分成M个子帧,对每个子帧进行时频变换,变换得到的M组频域系数构成当前帧总的频域系数,对总的频域系数按照编码子带从低频到高频的顺序进行重排,其中,所述总的频域系数包括核心层频域系数和扩展层频域系数,所述编码子带包括核心层编码子带和扩展层编码子带,核心层频域系数构成若干个核心层编码子带,扩展层频域系数构成若干个扩展层编码子带;
对核心层编码子带和扩展层编码子带的幅值包络值进行量化和编码,得到核心层编码子带和扩展层编码子带的幅值包络量化指数及其编码比特;其中,若为稳态信号,则对核心层编码子带和扩展层编码子带的幅值包络值进行统一量化;若为瞬态信号,则对核心层编码子带和扩展层编码子带的幅值包络值分别进行单独量化,以及对核心层编码子带的幅值包络量化指数和扩展层编码子带的幅值包络量化指数分别进行重排;
根据核心层编码子带的幅值包络量化指数对核心层编码子带进行比特分配,然后对核心层频域系数进行量化和编码得到核心层频域系数的编码比特;
对前述核心层中经过矢量量化的频域系数进行反量化,并与原始的经过时频变换后得到的频域系数进行差计算,得到核心层残差信号;
根据核心层编码子带的幅值包络量化指数和比特分配数计算核心层残差信号的幅值包络量化指数;
根据核心层残差信号的幅值包络量化指数和扩展层编码子带的幅值包络量化指数对扩展层编码信号的编码子带进行比特分配,然后对扩展层编码信号进行量化和编码得到扩展层编码信号的编码比特,其中,所述扩展层编码信号由核心层残差信号和扩展层频域系数构成;
将核心层和扩展层编码子带的幅值包络编码比特、核心层频域系数编码比特和扩展层编码信号的编码比特复用打包后,传送给解码端。
为解决上述问题,本发明还提供了一种可分层音频解码方法,该方法包括:
对编码端传送过来的比特流进行解复用,对核心层编码子带和扩展层编码子带的幅值包络编码比特解码,得到核心层编码子带和扩展层编码子带的幅值包络量化指数;若瞬态判决信息表明为瞬态信号,还对核心层编码子带和扩展层编码子带的幅值包络量化指数按照频率从小到大的顺序分别进行重排;
根据核心层编码子带的幅值包络量化指数,对核心层编码子带进行比特分配,并由此计算核心层残差信号的幅值包络量化指数,根据核心层残差信号的幅值包络量化指数和扩展层编码子带的幅值包络量化指数对扩展层编码信号的编码子带进行比特分配;
根据核心层编码子带和扩展层编码信号的编码子带的比特分配数,分别对核心层频域系数的编码比特和扩展层编码信号的编码比特解码,得到核心层频域系数和扩展层编码信号,将扩展层编码信号按照子带顺序重新排列,并和核心层频域系数相加,得到全体带宽的频域系数;
若所述瞬态判决信息表明为稳态信号,则对全体带宽的频域系数直接进行时频逆变换,得到输出的音频信号;若所述瞬态判断信息表明为瞬态信号,则将全体带宽的频域系数进行重排,然后分成M组频域系数,对每一组频域系数进行时频逆变换,根据变换得到的M组时域信号计算得到最终的音频信号。
为解决上述问题,本发明还提供了一种瞬态信号的可分层音频编码方法,该方法包括:
将音频信号分成M个子帧,对每个子帧进行时频变换,变换得到的M组频域系数构成当前帧总的频域系数,对总的频域系数按照编码子带从低频到高频的顺序进行重排,其中,所述总的频域系数包括核心层频域系数和扩展层频域系数,所述编码子带包括核心层编码子带和扩展层编码子带,核心层频域系数构成若干个核心层编码子带,扩展层频域系数构成若干个扩展层编码子带;
对核心层编码子带和扩展层编码子带的幅值包络值进行量化和编码,得到核心层编码子带和扩展层编码子带的幅值包络量化指数及其编码比特,其中对核心层编码子带和扩展层编码子带的幅值包络值分别进行单独量化,以及对核心层编码子带的幅值包络量化指数和扩展层编码子带的幅值包络量化指数分别进行重排;
根据核心层编码子带的幅值包络量化指数对核心层编码子带进行比特分配,然后对核心层频域系数进行量化和编码得到核心层频域系数的编码比特;
对前述核心层中经过矢量量化的频域系数进行反量化,并与原始的经过时频变换后得到的频域系数进行差计算,得到核心层残差信号;
根据核心层编码子带的幅值包络量化指数和核心层编码子带的比特分配数计算核心层残差信号编码子带的幅值包络量化指数;
根据核心层残差信号的幅值包络量化指数和扩展层编码子带的幅值包络量化指数对扩展层编码信号的编码子带进行比特分配,然后对扩展层编码信号进行量化和编码得到扩展层编码信号的编码比特,其中,所述扩展层编码信号由核心层残差信号和扩展层频域系数构成;
将核心层编码子带和扩展层编码子带的幅值包络编码比特、核心层频域系数的编码比特和扩展层编码信号的编码比特复用打包后,传送给解码端。
为解决上述问题,本发明还提供了一种瞬态信号的可分层解码方法,该方法包括:
对编码端传送过来的比特流进行解复用,对核心层编码子带和扩展层编码子带的幅值包络编码比特解码,得到核心层编码子带和扩展层编码子带的幅值包络量化指数,对核心层编码子带和扩展层编码子带的幅值包络量化指数按照频率从小到大的顺序分别进行重排;
根据重排后的核心层编码子带的幅值包络量化指数,对核心层编码子带进行比特分配,并由此计算核心层残差信号的幅值包络量化指数;
根据核心层残差信号的幅值包络量化指数和重排后的扩展层编码子带的幅值包络量化指数对扩展层编码子带进行比特分配;
根据核心层编码子带和扩展层编码信号的编码子带的比特分配数,分别对核心层频域系数编码比特和扩展层编码信号编码比特解码,得到核心层频域系数和扩展层编码信号,将扩展层编码信号按照子带顺序重新排列,并和核心层频域系数相加,得到全体带宽的频域系数;
将全体带宽的频域系数进行重排,然后分成M组,对每一组频域系数进行时频逆变换,根据变换得到的M组时域信号计算得到最终的音频信号。
为解决上述问题,本发明还提供了一种可分层音频编码系统,该系统包括:
频域系数生成单元、幅值包络计算单元、幅值包络量化和编码单元、核心层比特分配单元、核心层频域系数矢量量化和编码单元以及比特流复用器;其特征在于,该系统还包括:瞬态判决单元、扩展层编码信号生成单元、残差信号幅值包络生成单元、扩展层比特分配单元以及扩展层编码信号矢量量化和编码单元;其中:
所述瞬态判决单元,用于对当前帧的音频信号进行瞬态判决;
所述频域系数生成单元,与所述瞬态判决单元连接,瞬态判决为稳态信号时,用于对加窗后的音频信号直接进行时频变换得到总的频域系数;瞬态判决为瞬态信号时,用于将音频信号分成M个子帧,对每个子帧进行时频变换,变换得到的M组频域系数构成当前帧总的频域系数,对总的频域系数按照编码子带从低频到高频的顺序进行重排,其中,所述总的频域系数包括核心层频域系数和扩展层频域系数,所述编码子带包括核心层编码子带和扩展层编码子带,核心层频域系数构成若干个核心层编码子带,扩展层频域系数构成若干个扩展层编码子带;
所述幅值包络计算单元,与所述频域系数生成单元连接,用于计算核心层编码子带和扩展层编码子带的幅值包络值;
所述幅值包络量化和编码单元,与所述幅值包络计算单元以及瞬态判决单元连接,用于对核心层编码子带和扩展层编码子带的幅值包络值进行量化和编码,得到核心层编码子带和扩展层编码子带的幅值包络量化指数及其编码比特;其中,若为稳态信号,则对核心层编码子带和扩展层编码子带的幅值包络值进行统一量化;若为瞬态信号,则对核心层编码子带和扩展层编码子带的幅值包络值分别进行单独量化,以及对核心层编码子带的幅值包络量化指数和扩展层编码子带的幅值包络量化指数分别进行重排;
所述核心层比特分配单元,与所述幅值包络量化和编码单元连接,用于根据核心层编码子带的幅值包络量化指数对核心层编码子带进行比特分配,得到核心层编码子带的比特分配数;
所述核心层频域系数矢量量化和编码单元,与所述频域系数生成单元、幅值包络量化和编码单元及核心层比特分配单元连接,用于使用根据核心层编码子带的幅值包络量化指数重建的核心层编码子带的量化幅值包络值和核心层编码子带的比特分配数对核心层编码子带的频域系数进行归一化、矢量量化和编码,得到核心层频域系数编码比特;
所述扩展层编码信号生成单元,与所述频域系数生成单元及核心层频域系数矢量量化和编码单元连接,用于生成核心层残差信号,得到由核心层残差信号和扩展层频域系数构成的扩展层编码信号;
所述残差信号幅值包络生成单元,与所述幅值包络量化和编码单元及核心层比特分配单元连接,用于根据核心层编码子带的幅值包络量化指数与对应的核心层编码子带的比特分配数,得到核心层残差信号的幅值包络量化指数;
所述扩展层比特分配单元,与所述残差信号幅值包络生成单元及幅值包络量化和编码单元连接,用于根据核心层残差信号幅值包络量化指数和扩展层编码子带的幅值包络量化指数对扩展层编码信号编码子带进行比特分配,得到扩展层编码信号编码子带的比特分配数;
所述扩展层编码信号矢量量化和编码单元,与所述幅值包络量化和编码单元、扩展层比特分配单元、残差信号幅值包络生成单元及扩展层编码信号生成单元连接,用于使用根据扩展层编码信号编码子带的幅值包络量化指数重建的扩展层编码信号编码子带的量化幅值包络值和扩展层编码信号编码子带的比特分配数对扩展层编码信号进行归一化、矢量量化和编码,得到扩展层编码信号编码比特;
所述比特流复用器与所述幅值包络量化和编码单元、核心层频域系数矢量量化和编码单元、扩展层编码信号矢量量化和编码单元连接,用于将核心层边信息比特、核心层编码子带的幅值包络的编码比特、核心层频域系数编码比特、扩展层边信息比特,扩展层编码子带的幅值包络的编码比特和扩展层编码信号编码比特进行打包。
为解决上述问题,本发明还提供了一种可分层音频解码系统,该系统包括:比特流解复用器、幅值包络解码单元、核心层比特分配单元、核心层解码和反量化单元;其特征在于,该系统还包括:残差信号幅值包络生成单元、扩展层比特分配单元、扩展层编码信号解码和反量化单元、全体带宽频域系数恢复单元、噪声填充单元和音频信号恢复单元;其中:
所述幅值包络解码单元,与所述比特流解复用器连接,用于对所述比特流解复用器输出的核心层和扩展层编码子带的幅值包络编码比特进行解码,得到核心层编码子带和扩展层编码子带的幅值包络量化指数;若瞬态判决信息表明为瞬态信号,还对核心层编码子带和扩展层编码子带的幅值包络量化指数按照频率从小到大的顺序进行重排;
所述核心层比特分配单元,与所述幅值包络解码单元连接,用于根据核心层编码子带的幅值包络量化指数,对核心层编码子带进行比特分配,得到核心层编码子带的比特分配数;
所述核心层解码和反量化单元,与所述比特流解复用器、幅值包络解码单元及核心层比特分配单元连接,用于根据核心层编码子带的幅值包络量化指数计算得到核心层编码子带的量化幅值包络值,使用核心层编码子带的比特分配数和量化幅值包络值对所述比特流解复用器输出的核心层频域系数编码比特进行解码、反量化及反归一化处理,得到核心层频域系数;
所述残差信号幅值包络生成单元,与所述幅值包络解码单元及核心层比特分配单元连接,用于根据核心层编码子带的幅值包络量化指数与对应核心层编码子带的比特分配数,查找核心层残差信号幅值包络量化指数的修正值统计表,得到核心层残差信号的幅值包络量化指数;
所述扩展层比特分配单元,与所述残差信号幅值包络生成单元及幅值包络解码单元连接,用于根据核心层残差信号的幅值包络量化指数和扩展层编码子带的幅值包络量化指数进行扩展层编码信号编码子带的比特分配,得到扩展层编码信号编码子带的比特分配数;
所述扩展层编码信号解码和反量化单元,与比特流解复用器、所述幅值包络解码单元、扩展层比特分配单元及残差信号幅值包络生成单元连接,用于使用扩展层编码信号编码子带的幅值包络量化指数计算得到扩展层编码信号编码子带的量化幅值包络值,使用扩展层编码信号编码子带的比特分配数和量化幅值包络值对所述比特流解复用器输出的扩展层编码信号编码比特进行解码、反量化及反归一化处理,得到扩展层编码信号;
所述全体带宽频域系数恢复单元,与所述核心层解码和反量化单元以及扩展层编码信号解码和反量化单元连接,用于根据子带顺序对所述扩展层编码信号解码和反量化单元输出的扩展层编码信号进行重新排序,然后与所述核心层解码和反量化单元输出的核心层频域系数做和计算,得到全体带宽频域系数;
所述噪声填充单元,与所述全体带宽频域系数恢复单元及幅值包络解码单元连接,用于对编码过程中未分配编码比特的子带进行噪声填充;
所述音频信号恢复单元,与所述噪声填充单元连接,若所述瞬态判决信息表明为稳态信号,用于对全体带宽的频域系数直接进行时频逆变换,得到输出的音频信号;若所述瞬态判决信息表明为瞬态信号,用于将全体带宽的频域系数进行重排,然后分成M组频域系数,对每一组频域系数进行时频逆变换,根据变换得到的M组时域信号计算得到最终的音频信号。
综上所述,本发明通过在可分层音频编解码方法中引入针对瞬态信号帧的处理方法,对瞬态信号帧进行分段时频变换,然后对变换得到的频域系数在核心层和扩展层范围内分别进行重排,以便与稳态信号帧进行相同的比特分配、频域系数编码等后续编码处理,提高了瞬态信号帧的编码效率,改善了可分层音频编解码的质量。
附图说明
图1是本发明可分层音频编码方法的示意图;
图2是本发明可分层音频编码方法实施例的流程图;
图3是本发明矢量量化后进行比特分配修正的方法流程图;
图4是本发明可分层编码码流的示意图;
图5是本发明根据频带范围分层和根据码率分层的关系示意图;
图6是本发明可分层音频编码系统的结构示意图;
图7是本发明可分层音频解码方法的示意图;
图8是本发明可分层音频解码方法实施例的流程图;
图9是本发明可分层音频解码系统的结构示意图。
具体实施方式
本发明可分层音频编解码方法和系统的主要思想是通过在可分层音频编解码方法中引入针对瞬态信号帧的处理方法,对瞬态信号帧进行分段时频变换,然后对变换得到的频域系数在核心层和扩展层范围内分别进行重排,以便与稳态信号帧进行相同的比特分配、频域系数编码等后续编码处理,提高了瞬态信号帧的编码效率,改善了可分层音频编解码的质量。
编码方法及系统
如图1所示,基于以上发明思想,本发明可分层音频编码方法包括以下步骤:
步骤10:对当前帧的音频信号进行瞬态判决;
步骤20:根据瞬态判决结果对音频信号进行处理,获得核心层和扩展层频域系数;
具体地,瞬态判决为稳态信号时,对加窗后的音频信号直接进行时频变换得到总的频域系数;瞬态判决为瞬态信号时,将音频信号分成M个子帧,对每个子帧进行时频变换,变换得到的M组频域系数构成当前帧总的频域系数,对总的频域系数按照编码子带从低频到高频的顺序进行重排,其中,所述总的频域系数包括核心层频域系数和扩展层频域系数,所述编码子带包括核心层编码子带和扩展层编码子带,核心层频域系数构成若干个核心层编码子带,扩展层频域系数构成若干个扩展层编码子带。
当瞬态判决为瞬态信号时,当前帧总的频域系数的获取方法为:
将当前帧的N点时域采样信号x(n)与上一帧的N点时域采样信号xold(n)组成2N点时域采样信号,然后对实施加窗和时域抗混叠处理得到N点时域采样信号
对时域信号做对称变换,接着在信号两端各添加一段零序列,将加长后的信号分成M个互相交迭的子帧,然后对每个子帧的时域信号实施加窗、时域抗混叠处理和时频变换,得到M组频域系数,构成当前帧总的频域系数。
当瞬态判决为瞬态信号时,对频域系数进行重排时,在核心层和扩展层范围内按照编码子带从低频到高频的顺序分别进行频域系数重排。
步骤30:对核心层编码子带和扩展层编码子带的幅值包络值进行量化和编码,得到核心层编码子带和扩展层编码子带的幅值包络量化指数及其编码比特;
具体地,对核心层编码子带和扩展层编码子带的幅值包络值进行量化和编码,得到核心层编码子带和扩展层编码子带的幅值包络量化指数及其编码比特;其中,若为稳态信号,则对核心层编码子带和扩展层编码子带的幅值包络值进行统一量化;若为瞬态信号,则对核心层编码子带和扩展层编码子带的幅值包络值分别进行单独量化,以及对核心层编码子带的幅值包络量化指数和扩展层编码子带的幅值包络量化指数分别进行重排。
所述对幅值包络量化指数进行重排具体包括:
将同一子帧内的编码子带的幅值包络量化指数按照频率递增或递减的顺序重新排列在一起,在子帧连接处采用分属于两个子帧的代表对等频率的两个编码子带来连接。
当瞬态判决为稳态信号时,对量化得到的核心层编码子带的幅值包络量化指数进行霍夫曼编码,若所有核心层编码子带的幅值包络量化指数经过霍夫曼编码后所消耗比特的总数小于所有核心层编码子带的幅值包络量化指数经过自然编码所消耗比特的总数,则使用霍夫曼编码,否则使用自然编码,并设置核心层编码子带的幅值包络霍夫曼编码标识信息;对量化得到的扩展层编码子带的幅值包络量化指数进行霍夫曼编码,若所有扩展层编码子带的幅值包络量化指数经过霍夫曼编码后所消耗比特的总数小于所有扩展层编码子带的幅值包络量化指数经过自然编码所消耗比特的总数,则使用霍夫曼编码,否则使用自然编码,并设置扩展层编码子带的幅值包络霍夫曼编码标识信息。
步骤40:根据核心层编码子带的幅值包络量化指数对核心层编码子带进行比特分配,然后对核心层频域系数进行量化和编码得到核心层频域系数的编码比特;
得到核心层频域系数编码比特的方法为:
根据由核心层编码子带的幅值包络量化指数重建的核心层编码子带的量化幅值包络值对核心层频域系数进行归一化,根据编码子带的比特分配数分别使用塔型格型矢量量化方法和球型格型矢量量化方法进行量化和编码,得到核心层频域系数的编码比特;
对核心层所有使用塔型格型矢量量化得到的量化索引进行霍夫曼编码;
若所有使用塔型格型矢量量化得到的量化索引经过霍夫曼编码后所消耗比特的总数小于所有使用塔型格型矢量量化得到的量化索引经过自然编码所消耗比特的总数,则使用霍夫曼编码,利用霍夫曼编码节省下来的比特、初次比特分配剩余比特数、对单个频域系数所分配到的比特数为1或2的所有编码子带编码所节省比特的总数对核心层编码子带的比特分配数进行修正,以及对修正了比特分配数的核心层编码子带再次进行矢量量化和霍夫曼编码;否则使用自然编码,利用初次比特分配剩余比特数、对单个频域系数所分配到的比特数为1或2的所有编码子带编码所节省比特的总数对核心层编码子带的比特分配数进行修正,以及对修正了比特分配数的核心层编码子带再次进行矢量量化和自然编码。
步骤50:对前述核心层中经过矢量量化的频域系数进行反量化,并与原始的经过时频变换后得到的频域系数进行差计算,得到核心层残差信号;
步骤60:根据核心层编码子带的幅值包络量化指数和核心层编码子带的比特分配数计算核心层残差信号的幅值包络量化指数;
采用如下方法计算核心层残差信号编码子带的幅值包络量化指数:
根据核心层编码子带的比特分配数,推算核心层残差信号幅值包络量化指数的修正值;对核心层编码子带的幅值包络量化指数和对应编码子带的核心层残差信号幅值包络量化指数的修正值进行差计算,得到核心层残差信号幅值包络量化指数。
各编码子带的核心层残差信号幅值包络量化指数修正值大于等于0,且对应核心层编码子带的比特分配数增加时不减小;
当某个核心层编码子带的比特分配数为0时,核心层残差信号幅值包络量化指数修正值为0,当某个核心层编码子带的比特分配数为所限定的最大比特分配数时,对应的核心层残差信号的幅值包络值为零。
步骤70:根据核心层残差信号的幅值包络量化指数和扩展层编码子带的幅值包络量化指数对扩展层编码信号的编码子带进行比特分配,然后对扩展层编码信号进行量化和编码得到扩展层编码信号的编码比特,其中,所述扩展层编码信号由核心层残差信号和扩展层频域系数构成;
得到扩展层编码信号编码比特的方法为:
根据由扩展层编码信号编码子带的幅值包络量化指数重建的扩展层编码信号编码子带的量化幅值包络值对扩展层编码信号进行归一化,根据扩展层编码信号各编码子带的比特分配数分别使用塔型格型矢量量化方法和球型格型矢量量化方法进行量化和编码,得到扩展层编码信号的编码比特。
在对核心层频域系数和扩展层编码信号进行量化和编码的过程中,对比特分配数小于分类阈值的编码子带的待量化矢量采用塔型格型矢量量化方法进行量化和编码,对比特分配数大于所述分类阈值的编码子带的待量化矢量采用球型格型矢量量化方法进行量化和编码;
比特分配数是一个编码子带中单个系数所分配到的比特数。
可理解地,对于扩展层编码信号来说,其是由核心层残差信号及扩展层频域系数构成的,某种意义上核心层残差信号也是由系数构成的。
对扩展层所有使用塔型格型矢量量化得到的量化索引进行霍夫曼编码;
若所有使用塔型格型矢量量化得到的量化索引经过霍夫曼编码后所消耗比特的总数小于所有使用塔型格型矢量量化得到的量化索引经过自然编码所消耗比特的总数,则使用霍夫曼编码,利用霍夫曼编码节省下来的比特、初次比特分配剩余比特数、对单个频域系数所分配到的比特数为1或2的所有编码子带编码所节省比特的总数对扩展层编码信号编码子带的比特分配数进行修正,以及对修正了比特分配数的扩展层编码信号编码子带再次进行矢量量化和霍夫曼编码;否则使用自然编码,利用初次比特分配剩余比特数、对单个频域系数所分配到的比特数为1或2的所有编码子带编码所节省比特的总数对扩展层编码信号编码子带的比特分配数进行修正,以及对修正了比特分配数的扩展层编码信号编码子带再次进行矢量量化和自然编码。
进行核心层编码子带和扩展层编码信号编码子带比特分配时,根据编码子带的幅值包络量化指数对各编码子带进行变步长比特分配;
在比特分配过程中,对比特分配数为0的编码子带分配比特的步长是1个比特,比特分配后重要性降低的步长为1,对比特分配数大于0且小于分类阈值的编码子带追加分配比特时的比特分配步长为0.5个比特,比特分配后重要性降低的步长为0.5,对比特分配数大于等于所述分类阈值的编码子带追加分配比特时的比特分配步长为1,比特分配后重要性降低的步长为1;
所述对编码子带的比特分配数进行修正的过程如下:
计算可用于修正的比特数;
在所有编码子带中寻找重要性最大的编码子带,如果该编码子带所分配的比特数已经达到可能分配给与的最大值,则将该编码子带的重要性调整到最低,不再对该编码子带修正比特分配数,否则对该重要性最大的编码子带进行比特分配修正;
在比特分配修正过程中,对比特分配数为0的编码子带分配1个比特,比特分配后重要性降低1;对比特分配数大于0且小于5的编码子带分配0.5个比特,比特分配后重要性降低0.5;对比特分配数大于5的编码子带分配1个比特,比特分配后重要性降低1。
比特分配数每修正1次,则将比特分配修正迭代次数count加1,当比特分配修正迭代次数count达到预设上限值或可用于修正的剩余比特数小于比特分配修正所需要的比特数时,比特分配修正流程结束。
步骤80:将核心层和扩展层编码子带的幅值包络编码比特、核心层频域系数的编码比特和扩展层编码信号的编码比特复用打包后,传送给解码端。
按照如下码流格式进行复用打包:
首先将核心层的边信息比特写入码流的帧头后面,将核心层编码子带的幅值包络编码比特写入比特流复用器MUX(Multiplexer),然后将核心层频域系数的编码比特写入MUX;
然后将扩展层的边信息比特写入MUX,然后将扩展层频域系数的编码子带的幅值包络编码比特写入MUX,然后将扩展层编码信号的编码比特写入MUX;
根据所要求的码率,将满足码率要求的比特数传送到解码端。
下面将结合附图和实施例对本发明进行详细描述。
图2是本发明第一实施例可分层音频编码方法的流程图。本实施例中以帧长为20ms、采样率为32kHz的音频流为例具体说明本发明的可分层音频编码方法。在其它帧长和采样率条件下,本发明的方法同样适用。如图2所示,该方法包括:
101:对帧长为20ms、采样率为32kHz的音频流进行瞬态判决,判断该帧音频信号是瞬态信号还是稳态信号,当判断该帧信号是瞬态信号时,置瞬态判决标识位Flag_transient=1;当判断该帧信号是稳态信号时,置瞬态判决标识位Flag_transient=0;
本发明采用的瞬态判决技术可以是简单的门限检测,也可以是一些较复杂的技术,包括但不限于感知熵方法、多级判决方法等。
102:对帧长为20ms、采样率为32kHz的音频流实施时频变换得到N个频域采样点上的频域系数;
本步骤的具体实现方式可以是:
将当前帧的N点时域采样信号x(n)与上一帧的N点时域采样信号xold(n)组成2N点时域采样信号,2N点的时域采样信号可由下式表示:
对实施加窗处理,得到加窗后的信号:
其中h(n)是窗函数,定义为:
加窗后的40ms帧信号xw使用时域抗混叠处理变换为20ms帧长的信号操作方法如下:
其中,
如果瞬态判决标识位Flag_transient为0,则表示当前帧为稳态信号,直接对时域抗混叠信号进行IV类离散余弦变换(DCTIV变换)或其他类离散余弦变换,得到如下频域系数:
如果瞬态判决标识位Flag_transient为1,则表示当前帧为瞬态信号,需要首先对时域抗混叠信号做对称变换以减少寄生的时域和频域响应。接着,在信号两端各添加长度为N/8的零序列,将加长后的信号分成4个互相交迭的等长子帧。每个子帧的长度是N/2,以50%的比例互相交迭。两个中间的子帧各用一个长度为N/2的正弦窗实施加窗,两端的两个子帧各用长度为N/4的半个正弦窗对内侧的半个子帧实施加窗。然后,对每个加窗后的子帧信号进行时域抗混叠处理和DCTIV变换,得到4组长度为N/4的频域系数,构成总长度为N的频域系数Y(k),k=0,...,N-1。
此外,当帧长为20ms,采样率为32kHz时,N=640(其他帧长及采样率可同样算出相应的N)。
103:将N点频域系数分成若干个编码子带,计算各个编码子带的频域幅值包络(简称幅值包络);
所述编码子带可以是均匀划分,也可以是非均匀划分,在本实施例中采用非均匀子带划分。
本步骤可以采用如下子步骤实现:
103a:将所需编码的频带范围内的频域系数分成L个子带(可以称为编码子带);
本实施例中,所需编码的频带范围是0~13.6kHz,可以按照人耳感知特性进行非均匀子带划分,表1和表2分别给出了当瞬态判决标识位Flag_transient为0和1时一种具体的划分方式。
在表1和表2中,将0~13.6kHz频带范围内的频域系数划分成30个编码子带,即L=30;并将13.6kHz以上的频域系数置为0。
在本实施例中,还划分出核心层的频域范围。当瞬态判决标识位Flag_transient为0和1时,分别选择表1和表2中的0~17号子带作为核心层的子带,核心层编码子带的个数L_core=18。核心层的频带范围是0~7kHz。
当瞬态判决标识位Flag_transient为1时,对所需编码的频带范围内的4组频域系数进行子带划分,再对核心层的频带范围和扩展层的频带范围内的频域系数按照编码子带从低频到高频的顺序分别进行重排。当组内剩余的频域系数不够构成一个子带(如表2,少于16个)时,则用下一组频域系数中相同或相近频率的频域系数进行补充,如表2中的核心层子带16、17。表2中的编码子带即为完成重排的一种具体结果。
可理解地,组成核心层编码子带的频域系数称为核心层频域系数,组成扩展层编码子带的频域系数称为扩展层频域系数,也可描述为,将频域系数划分为核心层频域系数和扩展层频域系数,将核心层频域系数划分为若干个核心层编码子带,将扩展层频域系数划分为若干个扩展层编码子带。可理解地,频域系数层(指核心层和扩展层)的划分与编码子带的划分的先后顺序并不影响本发明的实现。
表1当瞬态判决标识位Flag_transient为0时的子带划分示例
表2当瞬态判决标识位Flag_transient为1时的子带划分示例
103b:按照以下公式计算各编码子带的幅值包络值:
其中,LIndex(j)和HIndex(j)分别表示第j个编码子带的起始频域系数索引和结束频域系数索引,其具体数值如表1(当瞬态判决标识位Fla_transient为0时)和表2(当瞬态判决标识位Flag_transient为1时)所示。
104:当瞬态判决标识位Flag_transient为1时,对核心层编码子带和扩展层编码子带的幅值包络值进行量化和编码,得到核心层编码子带和扩展层编码子带的幅值包络量化指数和核心层编码子带和扩展层编码子带的幅值包络编码比特,核心层编码子带的幅值包络编码比特和扩展层编码子带的幅值包络编码比特需要传送到比特流复用器(MUX)中;
当瞬态判决标识位Flag_transient为0时,对核心层编码子带和扩展层编码子带的幅值包络值进行统一量化;瞬态判决标识位Flag_transient为1时,对核心层编码子带和扩展层编码子带的幅值包络值分别进行单独量化,以及对核心层编码子带的幅值包络量化指数和扩展层编码子带的幅值包络量化指数分别进行重排。
以下对核心层编码子带的幅值包络量化编码的过程进行说明:
采用以下公式(7)对各编码子带幅值包络进行量化,得到各编码子带幅值包络的量化指数,即量化器的输出值:
j=0,…,LC-1 (7)
其中
表示向下取整。Thq(0)为第一个核心层编码子带的幅值包络量化指数,将其范围限制在[-5,34]内,即当Thq(0)<-5时,令Thq(0)=-5;当Thq(0)>34时,令Thq(0)=34。
当瞬态判决标识位Flag_transient为1时,对核心层编码子带的幅值包络量化指数进行重排,以使下述对核心层编码子带的幅值包络量化指数进行差分编码的效率更高。
具体重排示例见表3。
表3核心层幅值包络重排示例
使用6比特对第一个编码子带的幅值包络量化指数Thq(0)进行编码,即消耗6比特。
核心层编码子带幅值包络量化指数间的差分运算值采用如下公式计算:
ΔThq(j)=Thq(j+1)-Thq(j) j=0,…,L_core-2 (8)
可以对幅值包络进行如下修正以保证ΔThq(j)的范围在[-15,16]之内:
如果ΔThq(j)<-15,则令
ΔThq(j)=-15,Thq(j)=Thq(j+1)+15,j=L_core-2,…,0;
如果ΔThq(j)>16,则令ΔThq(j)=16,Thq(j+1)=Thq(j)+16,j=0,...,L_core-2;
对ΔThq(j),j=0,...,L_core-2进行霍夫曼(Huffman)编码,并计算此时所消耗的比特数(称为霍夫曼编码比特,Huffman coded bits)。如果此时霍夫曼编码比特大于或等于固定分配的比特数(在本实施例中大于或等于(L_core-1)×5),则不使用霍夫曼编码方式对ΔThq(j),j=0,...,L_core-2进行编码,并置霍夫曼编码标识位Flag_huff_rms_core=0;否则利用霍夫曼编码对ΔThq(j),j=0,...,L_core-2进行编码,并置霍夫曼编码标识位Flag_huff_rms_core=1。核心层编码子带的幅值包络量化指数的编码比特(即第一个子带的幅值包络和幅值包络差分值的编码比特)和霍夫曼编码标识位需要被传送到MUX中。
以下对扩展层编码子带的幅值包络量化编码的过程进行说明:
当瞬态判决标识位Flag_transient为0时,对幅值包络差分值ΔThq(j),j=L_core-1,...,L-2进行霍夫曼(Huffman)编码,并计算此时所消耗的比特数(称为霍夫曼编码比特,Huffman coded bits)。如果此时霍夫曼编码比特大于或等于固定分配的比特数(在本实施例中大于或等于(L-L_core)×5),则不使用霍夫曼编码方式对ΔThq(j),j=L_core-1,...,L-2进行编码,并置霍夫曼编码标识位Flag_huff_rms_ext=0;否则利用霍夫曼编码对ΔThq(j),j=L_core-1,...,L-2进行编码,并置霍夫曼编码标识位Flag_huff_rms_ext=1。
当瞬态判决标识位Flag_transient为1时,按照以下公式对扩展层编码子带的幅值包络进行量化,得到扩展层编码子带幅值包络的量化指数,即量化器的输出值:
j=L_core,…,L-1 (9)
其中Thq(L_core)为扩展层频域系数所构成的第一个编码子带的幅值包络量化指数,将其范围限制在[-5,34]内。对扩展层编码子带的幅值包络量化指数进行重排,以使下述对扩展层编码子带的幅值包络量化指数进行差分编码的效率更高。具体重排示例见表4。
表4扩展层编码子带幅值包络重排示例
使用6比特对扩展层频域系数所构成的第一个编码子带的幅值包络量化指数Thq(L_core)进行编码,即消耗6比特。扩展层频域系数所构成的扩展层编码子带幅值包络量化指数间的差分运算值采用如下公式计算:
ΔThq(j)=Thq(j+1)-Thq(j) j=L_core,…,L-2 (10)
可以对幅值包络进行如下修正以保证ΔThq(j)的范围在[-15,16]之内:如果ΔThq(j)<-15,则令ΔThq(j)=-15,Thq(j)=Thq(j+1)+15,j=L_core,…,L-2;如果ΔThq(j)>16,则令ΔThq(j)=16,Thq(j+1)=Thq(j)+16,j=L_core,…,L-2。然后,对ΔThq(j),j=L_core,…,L-2进行霍夫曼(Huffman)编码,并计算此时所消耗的比特数(称为霍夫曼编码比特,Huffman coded bits)。如果此时霍夫曼编码比特大于或等于固定分配的比特数(在本实施例中大于或等于(L-L_core-1)×5),则不使用霍夫曼编码方式对ΔThq(j),j=L_core,…,L-2进行编码,并置霍夫曼编码标识位Flag_huff_rms_ext=0;否则利用霍夫曼编码对ΔThq(j),j=L_core,…,L-2进行编码,并置霍夫曼编码标识位Flag_huff_rms_ext。
扩展层频域系数所构成的幅值包络量化指数的编码比特和霍夫曼编码标识位需要被传送到MUX中。
105:根据码率失真理论和核心层编码子带幅值包络信息计算核心层编码子带重要性的初始值,并根据核心层编码子带的重要性进行核心层的比特分配。
本步骤可以采用如下子步骤实现:
105a:计算核心层单个频域系数的比特消耗平均值:
从20ms帧长可提供的总的比特数bits_available中抽出用于核心层编码的比特数bits_available_core,扣除核心层边信息消耗的比特数bit_sides_core和核心层编码子带幅值包络量化指数所消耗掉的比特数bits_Th_core,得到剩余的可用于核心层频域系数编码的比特数bits_left_core,即:
bits_left_core=bits_available_core-bit_sides_core-bits_Th_core(11)
边信息包括霍夫曼编码标识Flag_huff_rms_core、Flag_huff_PLVQ_core和迭代次数count_core的比特。Flag_huff_rms_core用于标识是否对核心层编码子带幅值包络量化指数使用了霍夫曼编码;Flag_huff_PLVQ_core用于标识是否在对核心层频域系数进行矢量编码时使用了霍夫曼编码,而迭代次数count_core用于标识核心层比特分配修正时的迭代次数(详见后续步骤中的描述)。
计算核心层单个频域系数的比特消耗平均值为:
其中,L_core为核心层编码子带的个数。
105b:根据码率失真理论计算在最大量化信噪比增益条件下的最佳比特值:
通过拉格朗日方法优化基于独立高斯分布随机变量的码率失真度,可计算得到该码率失真度界限下各编码子带的最大量化信噪比增益条件下的最佳比特值为:
其中,
以及
105c:计算核心层编码子带在进行比特分配时的重要性初始值:
使用上述最佳比特值,以及符合人耳感知特性的比例因子,可以得到在实际比特分配中用于控制比特分配的核心层编码子带重要性的初始值:
其中α为比例因子,该因子跟编码码率相关,可通过统计分析得到,通常0<α<1,在本实施例中α取值为0.7;rk(j)表示在进行比特分配时第j个编码子带的重要性。
105d:根据核心层编码子带的重要性进行核心层的比特分配。具体描述如下:
首先从各rk(j)中找到最大值所在的核心层编码子带,假设该编码子带的编号为jk,然后增加该核心层编码子带中每个频域系数的比特分配数region_bit(jk),并降低该核心层编码子带的重要性;同时计算该子带编码消耗比特总数bit_band_used(jk);最后计算所有核心层编码子带所消耗比特数的总和sum(bit_band_used(j)),j=0,...,L_core-1;重复上述过程直至消耗比特数的总和满足可提供比特限制条件下的最大值。
本步骤中的比特分配方法可以由如下伪代码表示:
令region_bit(j)=0,j=0,1,…,L_core-1;
对于编码子带0,1,...,Lcore-1:
{
寻找
如果region_bit(jk)<分类阈值
{
如果region_bit(jk)=0
令region_bit(jk)=region_bit(jk)+1;
计算bit_band_used(jk)=region_bit(jk)*BandWidth(jk);
令rk(jk)=rk(jk)-1;
否则如果region_bit(jk)>=1
令region_bit(jk))=region_bit(jk)+0.5;
计算bit_band_used(jk)=region_bit(jk)*BandWidth(jk)*0.5;
令rk(jk)=rk(jk)-0.5;
}
否则如果region_bit(jk)>=分类阈值
{
令region_bit(jk)=region_bit(jk)+1;
令
计算bit_band_used(jk)=region_bit(jk)×BandWidth(jk);
}
计算bit_used_all=sum(bit_band_used(j)) j=0,1,...,L_core-1;
如果bit_used_all<bits_left_core-16,返回并在各编码子带中重新寻找jk,循环计算比特分配数(或称为编码比特数);其中16为核心层编码子带比特数的最大值。
否则,结束循环,计算比特分配数,输出此时的比特分配数。
}
最后,根据子带的重要性,将剩余的不到16个比特按如下原则分配给满足要求的核心层编码子带,在比特分配为1的核心层编码子带中给每个频域系数分配0.5个比特,同时降低该核心层编码子带的重要性0.5,直至bit_left_core-bit_used_all<8,比特分配结束。此时最终剩余的比特记为核心层初次分配剩余比特数remain_bits_core。
上述分类阈值的取值范围为大于等于2且小于等于8,本实施例中可以为5。
其中,MaxBit为核心层编码子带中单个频域系数所能分配到的最大的比特分配数,单位为bit/频域系数。本实施例中采用MaxBit=9。这个值可以根据编解码器的编码码率适当调整。region_bit(j)为第j个核心层编码子带中单个频域系数所分配的比特数,也就是该子带中单个频域系数的比特分配数。
此外,本步骤中也可以将Thq(j)、或将作为核心层编码子带的比特分配重要性初始值进行核心层的比特分配,j=0,...,L_core-1;μ>0。
以下步骤106至步骤107中所说的编码子带均为核心层编码子带。
106:用根据核心层编码子带的幅值包络量化指数重建的量化幅值包络值对核心层编码子带中的频域系数进行归一化计算,然后对归一化的频域系数进行分组,组成若干个矢量;
对于所有j=0,...,L_core-1,使用编码子带j的量化幅值包络对该编码子带中所有频域系数Xj进行归一化处理:
将编码子带中连续的8个系数分组构成1个8维矢量。根据表1对编码子带的划分,编码子带j中的系数正好可以分组构成Lattice_D8(j)个8维矢量。各个归一化后分组的8维待量化矢量可表示为Yjm,其中m表示该8维矢量在编码子带中的位置,其范围在0到Lattice_D8(j)-1之间。
107:对于所有j=0,...,L_core-1,判断编码子带j所分配比特数region_bit(j)的大小,如果所分配比特数region_bit(j)小于分类阈值,则称该编码子带为低比特编码子带,并对该低比特编码子带中待量化矢量采用塔型格型矢量量化方法进行量化和编码;如果所分配比特数region_bit(j)大于或等于该阈值,则称该编码子带为高比特编码子带,并对该高比特编码子带中的待量化矢量采用球型格型矢量量化方法进行量化和编码;本实施例的阈值采用5比特。
以下对塔型格型矢量量化和编码方法进行说明:
对低比特编码子带采用塔型格型矢量量化方法进行量化,此时子带j所分配到的比特数满足:1<=region_bit(j)<5。
本发明采用基于D8格点的8维格型矢量量化,其中D8格点定义如下:
其中Z8表示8维的整数空间。将8维矢量映射到(即量化到)D8格点的基本方法描述如下:
设x为任意实数,f(x)表示取和x相邻的两个整数中相距较近的整数的取整量化,w(x)表示取相邻的两个整数中相距较远的整数的取整量化。对任意矢量X=(x1,x2,...,x8)∈R8,同样可定义f(X)=(f(x1),f(x2),...,f(x8))。在f(X)中选择取整量化误差的绝对值最大的分量中的最小下标,记为k,由此定义g(X)=(f(x1),f(x2),...w(xk),...,f(x8)),则f(X)或g(X)中有一个且只有一个是D8格点的数值,此时量化器输出D8格点的量化值为:
将待量化矢量量化到D8格点的方法及求解D8格点索引的具体步骤如下:
a:待量化矢量的能量规整;
量化之前需要对待量化矢量进行能量规整。根据待量化矢量所在编码子带j所分配的比特数region_bit(j),从表2中查询到该比特数所对应的码本序号index和能量缩放因子scale;然后根据下面的公式对待量化矢量进行能量规整:
其中,Yjm表示编码子带j中第m个归一化后的待量化8维矢量,表示对Yjm进行能量规整后的8维矢量,a=(2-6,2-6,2-6,2-6,2-6,2-6,2-6,2-6)。
表5塔式格型矢量量化比特数与码本序号、能量缩放因子及最大塔面能
量半径的对应关系
b:对规整后的矢量进行格点量化;
将能量规整后的8维矢量量化到D8格点上:
其中,表示将某个8维矢量映射到D8格点的量化算子。
c:根据D8格点的塔面能量对的能量进行截断;
计算D8格点的能量并和编码码本中的最大塔面能量半径LargeK(index)进行比较。如果不大于最大塔面能量半径,则计算该格点在码本中的索引;否则将该编码子带规整后的待量化矢量进行能量截断,直到能量截断后的待量化矢量的量化格点的能量不大于最大塔面能量半径;这时对能量截断后的待量化矢量持续增加其自身的一个小能量,直至其量化到D8格点的能量超过最大塔面能量半径;取最后一个能量不超过最大塔面能量半径的D8格点作为待量化矢量的量化值。具体过程可以用下面伪代码描述:
计算的塔面能量,即求编码子带j中第m个矢量的各分量绝对值之和,
Kbak=temp_K
If temp_K>LargeK(index)
{
While temp_K>LargeK(index)
{
}
Kbak=temp_K
While temp_K<=LargeK(index)
{
Kbak=temp_K
}
}
temp_K=Kbak
这时的是最后一个能量不超过最大塔面能量半径的D8格点,temp_K是该格点的能量。
d:生成D8格点在码本中的量化索引;
根据以下步骤,通过计算得到D8格点在码本中的索引。具体步骤如下:
步骤1:根据塔面能量的大小,分别对各个塔面上的格点进行标号。
对于维数为L的整数格点网格ZL,定义能量半径为K的塔面为:
记N(L,K)为S(L,K)中格点的个数,对于整数格ZL来说,N(L,K)有如下的递推关系:
N(L,0)=1(L≥0),N(0,K)=0(K≥1)
N(L,K)=N(L-1,K)+N(L-1,K-1)+N(L,K-1)(L≥1,K≥1)
对于能量半径为K的塔面上的整数格点Y=(y1,y2,...,yL)∈ZL,用[0,1,...,N(L,K)-1]中的某一个数b来标识,并称b为该格点的标号。求解标号b的步骤如下:
步骤1.1:令b=0,i=1,k=K,l=L,根据上述的递推公式,计算N(m,n),(m<=L,n<=K)。定义:
步骤1.2:如果yi=0,则b=b+0;
果|yi|=1,则
如果|yi|>1,则
步骤1.3:k=k-|yi|,l=l-1,i=i+1,如果此时k=0,则停止搜索,b为Y的标号,否则继续步骤1.2)。
步骤2:对所有塔面上的格点进行统一标号。
根据各个塔面的格点数和每个格点在各自塔面上的标号,计算每个格点在全体塔面中的标号:
其中,kk为偶数。此时的index_b(j,m)即为D8格点在码本中的索引。也就是编码子带j中第m个8维矢量的索引。
e:重复步骤a~d,直到所有编码比特大于0的编码子带的各个8维矢量都完成索引生成;
f:根据塔型格型矢量量化方法得到各个编码子带中每个8维矢量的矢量量化索引index_b(j,k),其中k表示编码子带j的第k个8维矢量,分以下几种情况对量化索引index_b(j,k)进行霍夫曼编码:
1)在单个频域系数所分配到的比特数为大于1小于5但除去2的所有编码子带中,对每个矢量量化索引的自然二进制码中每4位分成一组并对其进行霍夫曼编码。
2)在单个频域系数所分配到的比特数为2的所有编码子带中,对每个8维矢量的塔型格型矢量量化索引使用15个比特进行编码。在15个比特中,对3组4位比特和1组3位比特分别进行霍夫曼编码。因此,在单个频域系数所分配到的比特数为2的所有编码子带中,对每个8维矢量的编码都节省了1个比特。
3)当编码子带的单个频域系数所分配到的比特数为1时,如果量化索引小于127,则对量化索引使用7个比特进行编码,把7个比特分成1组3比特和1组4比特,分别对两组进行霍夫曼编码;如果量化索引等于127,则它的自然二进制码值为”1111 1110”,把前面7个1分成1组3比特和1组4比特,分别对两组进行霍夫曼编码;如果量化索引等于128,则它的自然二进制码值为”1111 1111”,把前面7个1分成1组3比特和1组4比特,分别对两组进行霍夫曼编码。
对量化索引进行霍夫曼编码的方法可用如下伪代码描述:
在所有的region_bit(j)=1.5和2<region_bit(j)<5的编码子带内
{
n在[0,region_bit(j)×8/4-1]的范围内,步长为1递增,做如下循环:
{
将index_b(j,k)右移4*n位,
计算index_b(j,k)低4比特位tmp,也就是tmp=and(index_b(j,k),15)
计算tmp在码本中的码字及其比特消耗数:
plvq_codebook(j,k)=plvq_code(tmp+1);
plvq_count(j,k)=plvq_bit_count(tmp+1);
其中plvq_codebook(j,k),和plvq_count(j,k)分别为j子带第k个8维矢量的霍夫曼编码码本中的码字和比特消耗数;plvq_bit_count和plvq_code根据表6查找。
更新采用霍夫曼编码后的比特消耗总数:
bit_used_huff_all=bit_used_huff_all+plvq_bit_count(tmp+1);
}
}
在region_bit(j)=2的编码子带内
{
n在[0,region_bit(j)×8/4-2]的范围内,步长为1递增,做如下循环:
{
将index_b(j,k)右移4*n位,
计算index_b(j,k)低4比特位tmp,也就是tmp=and(index_b(j,k),15)
计算tmp在码本中的码字及其比特消耗:
plvq_count(j,k)=plvq_bit_count(tmp+1);
plvq_codebook(j,k)=plvq_code(tmp+1);
其中plvq_count(j,k),和plvq_codebook(j,k)分别为j子带第k个8维矢量的霍夫曼比特消耗数和码字;plvq_bit_count和plvq_code根据表6查找。
更新采用霍夫曼编码后的比特消耗总数:
bit_used_huff_all=bit_used_huff_all+plvq_bit_count(tmp+1);
}
{
下面需要处理一个3比特情况:
在index_b(j,k)右移[region_bit(j)×8/4-2]*4位后,
计算index_b(j,k)低3比特位tmp,也就是tmp=and(index_b(j,k),7)
计算tmp在码本中的码字及其比特消耗:
plvq_count(j,k)=plvq_bit_count_r2_3(tmp+1);
plvq_codebook(j,k)=plvq_code_r2_3(tmp+1);
其中plvq_count(j,k),和plvq_codebook(j,k)分别为j子带第k个8维矢量的霍夫曼比特消耗数和码字;plvq_bit_count_r2_3和plvq_code_r2_3根据表7查找。
更新采用霍夫曼编码后的比特消耗总数:
bit_used_huff_all=bit_used_huff_all+plvq_bit_count(tmp+1);
}
}
在region_bit(j)=1的编码子带内
{
如果index_b(j,k)<127
{
{
计算index_b(j,k)低4比特位tmp,也就是tmp=and(index_b(j,k),15)
计算tmp在码本中的码字及其比特消耗:
plvq_count(j,k)=plvq_bit_count_r1_4(tmp+1);
plvq_codebook(j,k)=plvq_code_r1_4(tmp+1);
其中plvq_count(j,k),和plvq_codebook(j,k)分别为j子带第k个8维矢量的霍夫曼比特消耗数和码字;plvq_bit_count_r1_4和plvq_code_r1_4根据表8查找。
更新采用霍夫曼后的比特消耗总数:
bit_used_huff_all=bit_used_huff_all+plvq_bit_count(tmp+1);
}
{
下面需要处理一个3比特情况:
将index_b(j,k)右移4位,
计算index_ b(j,k)低3比特位tmp,也就是tmp=and(index_b(j,k),7)
计算tmp在码本中的码字及其比特消耗:
plvq_count(j,k)=plvq_bit_count_r1_3(tmp+1);
plvq_codebook(j,k)=plvq_code_r1_3(tmp+1);
其中plvq_count(j,k),和plvq_codebook(j,k)分别为j子带第k个8维矢量的霍夫曼比特消耗数和码字;码本plvq_bit_count_r1_3和plvq_code_r1_3根据表9查找。
更新采用霍夫曼后的比特消耗总数:
bit_used_huff_all=bit_used_huff_all+plvq_bit_count(tmp+1);
}
}
如果index_b(j,k)=127
{它的二进制值为”1111 1110”
对于前三个”1”和后四个”1”分别查找表9和表8的霍夫曼码表,
计算方法同前面index_b(j,k)<127下的情况.
更新采用霍夫曼后的比特消耗总数:总共需要8个比特.
}
如果index_b(j,k)=128
{它的二进制值为”1111 1111”
对于前三个”1”和后四个”1”分别查找表7和表6的霍夫曼码表,计算方法同前面index_b(j,k)<127下的情况.
更新采用霍夫曼后的比特消耗总数:总共需要8个比特.
}
}
因此,在单个频域系数所分配到的比特数为1的所有编码子带中,对每个8维矢量的编码,当index_b(j,k)<127时,节省1个比特。
表6塔式矢量量化霍夫曼码表
表7塔式矢量量化霍夫曼码表
表8塔式矢量量化霍夫曼码表
表9塔式矢量量化霍夫曼码表
g:判断霍夫曼编码是否节省比特;
将所有低比特编码子带的集合记为C,计算以上步骤f的2)、3)中所述的对单个频域系数所分配到的比特数为1或2的所有编码子带编码所节省的比特,记为硬节省比特数bit_saved_r1_r2_all_core,计算属于C中所有编码子带的8维矢量的量化矢量索引经过霍夫曼编码后消耗比特的总数bit_used_huff_all;将bit_used_huff_all和自然编码所需消耗比特的总数bit_used_nohuff_all进行比较,如果bit_used_huff_all<bit_used_nohuff_all,则传输霍夫曼编码后的量化矢量索引,同时设置霍夫曼编码标识Flag_huff_PLVQ_core为1;否则,直接对量化矢量索引进行自然编码,并设置霍夫曼编码标识Flag_huff_PLVQ_core为0。
上述bit_used_nohuff_all等于给C中所有编码子带所分配比特数的总数sum(bit_band_used(j),j∈C)减去bit_saved_r1_r2_all的差值。
h:比特分配数的修正;
若霍夫曼编码标识Flag_huff_PLVQ_core为0,则利用初次分配剩余比特数remain_bits_core和硬节省比特数bit_saved_r1_r2_all_core对编码子带的比特分配进行修正。若霍夫曼编码标识Flag_huff_PLVQ_core为1,则利用初次分配剩余比特数remain_bits_core、硬节省比特数bit_saved_r1_r2_all_core和霍夫曼编码节省下来的比特对编码子带的比特分配进行修正。
以下对球型格型矢量量化和编码方法进行说明:
对高比特编码子带采用球型格型矢量量化方法进行量化,此时子带j所分配到的比特数满足:5<=region_bit(j)<=9。
此处同样采用基于D8格的8维格型矢量量化。
a:根据编码子带j中单个频域系数所分配到的比特数region_bit(j)对该编码子带归一化后的第m个待量化矢量Yjm进行如下能量规整:
其中,a=(2-6,2-6,2-6,2-6,2-6,2-6,2-6,2-6),
而scale(region_bit(j))表示编码子带中单个频域系数的比特分配数为region_bit(j)时的能量缩放因子,根据表10可查到它们的对应关系。
表10球型格型矢量量化的比特分配数与能量缩放因子的对应关系
b:生成D8格点的索引矢量
将编码子带j中进行能量缩放后的第m个待量化矢量映射到D8的格点上:
判断是否为零矢量,即它的各个分量是否都为零,如果是则称为零矢量条件满足,否则称为零矢量条件不满足。
如果零矢量条件满足,那么索引矢量可由下面的索引矢量生成公式得到:
输出此时D8格点的索引矢量k,其中G为D8格点的生成矩阵,形式如下:
如果零矢量条件不满足,将矢量的值除以2,直至零矢量条件成立;并备份自身的小倍数值为w,然后对缩减后的矢量加上备份的小倍数值w,再量化到D8格点,判断零矢量条件是否满足;如果零矢量条件不满足,则根据索引矢量计算公式得到最近满足零矢量条件的D8格点的索引矢量k,否则继续对矢量增加备份的小倍数值w,然后再量化到D8格点,直至零矢量不条件满足;最后根据索引矢量计算公式得到最近满足零矢量条件的D8格点的索引矢量k;输出D8格点的索引矢量k。这个过程也可通过下面的伪代码描述:
Dbak=temp_D
While temp_D≠0
{
}
Dbak=temp_D
While temp_D=0
{
Dbak=temp_D
}
c:对高比特编码子带的矢量量化索引进行编码,此时子带j所分配的比特数满足:5<=region_bit(j)<=9。
根据球型格型矢量量化的方法,对比特分配数为5到9的编码子带中的8维矢量进行量化后得到矢量索引k={k1,k2,k3,k4,k5,k6,k7,k8},根据单个频域系数所分配到的比特数对索引矢量k的各个分量进行自然编码,得到该矢量的编码比特。
如图3所示,比特分配修正流程具体包括如下步骤:
301:计算可用于比特分配修正的比特数diff_bit_count_core。若霍夫曼编码标识Flag_huff_PLVQ_core为0,则
diff_bit_count_core=remain_bits_core+bit_saved_r1_r2_all_core
若霍夫曼编码标识Flag_huff_PLVQ_core为1,则
diff_bit_count_core=remain_bits_core+bit_saved_r1_r2_all_core+(bit_used_nohuff_all-bit_used_huff_all)
令count=0:
302:如果diff_bit_count_core大于零,则在各rk(j)(j=0,...,L_core-1)中寻找最大值rk(jk),用公式表示为:
303:判断region_bit(jk)+1是否小于或等于9,如果是则执行下一步,否则将jk对应的编码子带的重要性调整到最低(例如令rk(jk)=-100),表示无需再对该编码子带的比特分配数进行修正,并跳转至步骤302;
304:判断diff_bit_count_core是否大于或等于修正编码子带jk的比特分配数所需要多消耗的比特(若Flag_huff_PLVQ_core为0,则按自然编码计算;若Flag_huff_PLVQ_core为1,则按霍夫曼编码计算),如果是,则执行步骤305,修正编码子带jk的比特分配数region_bit(jk),降低子带重要性rk(jk)的值,,并对编码子带jk重新进行矢量量化和自然编码或霍夫曼编码,最后更新diff_bit_count_core的值;否则比特分配修正流程结束;
305:在比特分配修正过程中,对比特分配数为0的编码子带分配1个比特,比特分配后重要性降低1,对比特分配数大于0且小于5的编码子带分配0.5个比特,比特分配后重要性降低0.5,对比特分配数大于5的编码子带分配1个比特,比特分配后重要性降低1。
306:令count=count+1,判断count是否小于或等于Maxcount,如果是,则跳转至步骤302,否则比特分配修正流程结束。
上述Maxcount为循环迭代次数上限值,该值由编码比特流及其采样率决定,本实施例中,若霍夫曼编码标识Flag_huff_PLVQ为0,则采用Maxcount=7;若霍夫曼编码标识Flag_huff_PLVQ为1,则采用Maxcount=31。
108:对前述核心层中经过矢量量化的频域系数进行反量化,并与原始的经过时频变换后得到的频域系数进行差计算,得到核心层的残差信号,并用核心层残差信号和扩展层频域系数构成扩展层编码信号;
可理解地,构成扩展层编码信号的步骤(步骤108)也可以在完成扩展层编码信号的比特分配(步骤110)之后执行。
109:对核心层的残差信号进行与频域系数相同的子带划分,根据核心层的编码子带幅值包络量化指数和核心层的比特分配数(即各region_bit(j),j=0,...,L_core-1)计算出核心层残差信号编码子带的幅值包络量化指数。
本步骤可以采用如下子步骤实现:
109a:根据核心层编码子带中单个频域系数所分配的比特数region_bit(j),j=0,...,L_core-1查找核心层残差信号幅值包络量化指数的修正值统计表,得到核心层残差信号幅值包络量化指数的修正值diff(region_bit(j)),j=0,...,L_core-1;
其中,region_bit(j)=1,1.5,2,2.5,3,3.5,4,4.5,5,6,7,8,j=0,...,L_core-1,而幅值包络量化指数修正值可通过以下规则进行设置:
diff(region_bit(j))≥0;且
当region_bit(j)>0时,diff(region_bit(j))随着region_bit(j)值的增大而不减。
为了得到更好的编解码效果,可以对各比特分配数(region_bit(j))下计算出的子带幅值包络量化指数和直接从残差信号计算出的子带幅值包络量化指数的差值进行统计,得到概率最高的幅值包络量化指数修正值统计表,如表11所示:
表11幅值包络量化指数修正值统计表
109b:根据核心层中编码子带j的幅值包络量化指数和表8中的量化指数修正值,计算出核心层残差信号第j个子带的幅值包络量化指数:
Th′q(j)=Thq(j)-diff(region_bit(j)),j=0,...,L_core-1
其中,Thq(j)是核心层中编码子带j的幅值包络量化指数。
需要注意的是,当核心层中某个编码子带的比特分配数为0时,则无需对核心层残差信号的编码子带幅值包络进行修正,这时核心层的残差信号子带幅值包络值与核心层的编码子带幅值包络值相同。
此外,当核心层中某个编码子带比特分配数region_bit(j)=9时,置核心层残差信号第j个编码子带的量化幅值包络值为零。
110:在扩展层中对扩展层编码信号的编码子带进行比特分配:
扩展层子带划分由表1或表2决定。子带0,...,L_core-1中的编码信号是核心层残差信号,L_core,...,L-1中的编码信号是扩展层编码子带中的频域系数。子带0至L-1也称为扩展层编码信号的编码子带。
根据计算出的核心层残差信号的幅值包络量化指数、扩展层编码子带的幅值包络量化指数以及扩展层可用比特数,采用与核心层相同的比特分配方案在整个扩展层频带范围内计算扩展层编码信号的编码子带重要性的初始值,并对扩展层编码信号的编码子带进行比特分配。
本实施例中,扩展层频带范围是0~13.6kHz。音频流的总码率为64kbps,核心层的码率为32kbps,则扩展层的最大码率为64kbps。根据核心层码率和扩展层最大码率计算出扩展层中总的可用的比特数,然后进行比特分配,直至比特完全消耗。
111:根据扩展层编码信号编码子带的幅值包络量化指数和相应的比特分配数,对扩展层编码信号进行归一化、矢量量化和编码,得到编码信号的编码比特。其中,扩展层中编码信号的矢量构成、矢量量化方法和编码方法分别与核心层中频域系数的矢量构成、矢量量化方法和编码方法相同。
112:构造可分层编码码流,根据码率的大小构造码率层。
如图4所示,采用如下方式构造可分层编码码流:首先将核心层的边信息按如下顺序写入比特流复用器MUX:Flag_transient,Flag_huff_rms_core、Flag_huff_PLVQ_core和count_core,然后将核心层的编码子带幅值包络编码比特写入MUX,然后将核心层频域系数的编码比特写入MUX;然后将扩展层的边信息按如下顺序写入MUX:扩展层编码子带的幅值包络霍夫曼编码标识位Flag_huff_rms_ext、频域系数霍夫曼编码标识位Flag_huff_PLVQ_ext和比特分配修正迭代次数count_ext,然后将扩展层编码子带(L_core,...,L-1)的幅值包络编码比特写入MUX,然后将扩展层编码信号的编码比特写入MUX;最后将按上述顺序写成的可分层码流传送到解码端;
其中,扩展层编码信号编码比特的写入顺序按照扩展层编码信号的编码子带重要性的初始值排序。即重要性初始值大的扩展层编码信号的编码子带的编码比特优先写入码流,对于具有相同重要性的编码子带,低频编码子带优先。
由于扩展层中的残差信号的幅值包络是由核心层编码子带的幅值包络和比特分配数计算出来的,因此不用传送到解码端。这样既可以增加核心层带宽的编码精度又不必附加比特用以传送残差信号的幅值包络值。
根据所要求传送的码率,把比特流复用器后部不必要的比特舍去后,将满足码率要求的比特数传送到解码端。即按照编码子带重要性从小到大的顺序舍去不必要的比特。
在本实施例中,编码频带范围为0~13.6kHz,最大码率为64kbps,按码率分层的方法如下:
将编码频带范围0~7kHz内的频域系数划分成核心层,核心层所对应的最大码率是32kbps,记为L0层;扩展层的编码频带范围为0~13.6kHz,其最大码率为64kbps,记为L1_5层;
在送到解码端之前,根据舍去比特数的多少可以将码率划分为L1_1层,对应36kbps,L1_2层,对应40kbps,L1_3层,对应48kbps,L1_4层,对应56kbps及L1_5层,对应64kbps。
图5表示了根据频带范围分层和根据码率分层的关系。
图6是本发明可分层音频编码系统的结构示意图,如图6所示,该系统包含:瞬态判决单元、频域系数生成单元、幅值包络计算单元、幅值包络量化和编码单元、核心层比特分配单元、核心层频域系数矢量量化和编码单元、扩展层编码信号生成单元、残差信号幅值包络生成单元、扩展层比特分配单元、扩展层编码信号矢量量化和编码单元、比特流复用器;其中:
所述瞬态判决单元,用于对当前帧的音频信号进行瞬态判决;
所述频域系数生成单元,与所述瞬态判决单元连接,瞬态判决为稳态信号时,用于对加窗后的音频信号直接进行时频变换得到的总的频域系数;瞬态判决为瞬态信号时,用于将音频信号分成M个子帧,对每个子帧进行时频变换,变换得到的M组频域系数构成当前帧总的频域系数,对总的频域系数按照编码子带从低频到高频的顺序进行重排,其中,所述总的频域系数包括核心层频域系数和扩展层频域系数,所述编码子带包括核心层编码子带和扩展层编码子带,核心层频域系数构成若干个核心层编码子带,扩展层频域系数构成若干个扩展层编码子带;
所述幅值包络计算单元,与所述频域系数生成单元连接,用于计算核心层编码子带和扩展层编码子带的幅值包络值;
所述幅值包络量化和编码单元,与所述幅值包络计算单元以及瞬态判决单元连接,用于对核心层编码子带和扩展层编码子带的幅值包络值进行量化和编码,得到核心层编码子带的和扩展层编码子带的幅值包络量化指数及其编码比特;其中,若为稳态信号,则对核心层编码子带和扩展层编码子带的幅值包络值进行统一量化;若为瞬态信号,则对核心层编码子带和扩展层编码子带的幅值包络值分别进行单独量化,以及对核心层编码子带的幅值包络量化指数和扩展层编码子带的幅值包络量化指数分别进行重排;
所述核心层比特分配单元,与所述幅值包络量化和编码单元连接,用于根据核心层编码子带的幅值包络量化指数对核心层编码子带进行比特分配,得到核心层编码子带的比特分配数;
所述核心层频域系数矢量量化和编码单元,与所述频域系数生成单元、幅值包络量化和编码单元及核心层比特分配单元连接,用于使用根据核心层编码子带的幅值包络量化指数重建的核心层编码子带的量化幅值包络值和比特分配数对核心层编码子带的频域系数进行归一化、矢量量化和编码,得到核心层频域系数的编码比特;
所述扩展层编码信号生成单元,与所述频域系数生成单元及核心层频域系数矢量量化和编码单元连接,用于生成残差信号,得到由残差信号和扩展层频域系数构成的扩展层编码信号;
所述残差信号幅值包络生成单元,与所述幅值包络量化和编码单元以及核心层比特分配单元连接,用于根据核心层编码子带的幅值包络量化指数与对应编码子带的比特分配数,得到核心层残差信号的幅值包络量化指数;
所述扩展层比特分配单元,与所述残差信号幅值包络生成单元及幅值包络量化和编码单元连接,用于根据核心层残差信号幅值包络量化指数和扩展层编码子带的幅值包络量化指数对扩展层编码子带进行比特分配,得到扩展层编码子带的比特分配数;
所述扩展层编码信号矢量量化和编码单元,与所述幅值包络量化和编码单元、扩展层比特分配单元、残差信号幅值包络生成单元及扩展层编码信号生成单元连接,用于使用根据扩展层编码信号编码子带的幅值包络量化指数重建的扩展层编码信号编码子带的量化幅值包络值和比特分配数对扩展层编码信号进行归一化、矢量量化和编码,得到扩展层编码信号的编码比特;
所述比特流复用器与所述幅值包络量化和编码单元、核心层频域系数矢量量化和编码单元、扩展层编码信号矢量量化和编码单元连接,用于将核心层边信息比特、核心层编码子带的幅值包络的编码比特、核心层频域系数的编码比特、扩展层边信息比特,扩展层编码子带的幅值包络的编码比特和扩展层编码信号的编码比特进行打包。
进一步地,所述频域系数生成单元获取当前帧总的频域系数时,用于将当前帧的N点时域采样信号x(n)与上一帧的N点时域采样信号xold(n)组成2N点时域采样信号,然后对实施加窗和时域抗混叠处理得到N点时域采样信号以及对时域信号做对称变换,接着在信号两端各添加一段零序列,将加长后的信号分成M个互相交迭的子帧,然后对每个子帧的时域信号实施加窗、时域抗混叠处理和时频变换,得到M组频域系数,构成当前帧总的频域系数。
进一步地,所述频域系数生成单元对频域系数进行重排时,在核心层和扩展层范围内按照编码子带从低频到高频的顺序分别进行频域系数的重排。
进一步地,所述幅值包络量化和编码单元对幅值包络量化指数进行重排具体指:将同一子帧内的编码子带的幅值包络量化指数按照频率递增或递减的顺序重新排列在一起,在子帧连接处采用分属于两个子帧的代表对等频率的两个编码子带来连接。
进一步地,所述比特流复用器按照如下码流格式进行复用打包:
首先将核心层的边信息比特写入码流的帧头后面,将核心层编码子带的幅值包络编码比特写入比特流复用器MUX,然后将核心层频域系数的编码比特写入MUX;
然后将扩展层的边信息比特写入MUX,然后将扩展层频域系数编码子带的幅值包络编码比特写入MUX,然后将扩展层编码信号的编码比特写入MUX;
根据所要求的码率,将满足码率要求的比特数传送到解码端。
进一步地,核心层的边信息包括瞬态判决标识位比特、核心层编码子带的幅值包络的霍夫曼编码标志位比特、核心层频域系数的霍夫曼编码标志位比特和核心层比特分配修正迭代次数比特;
扩展层的边信息包括扩展层编码子带的幅值包络的霍夫曼编码标识位比特、扩展层编码信号的霍夫曼编码标识位比特和扩展层比特分配修正迭代次数比特。
进一步地,所述扩展层编码信号生成单元还包括残差信号生成模块和扩展层编码信号合成模块;
所述残差信号生成模块用于对核心层频域系数的量化值进行反量化,并与核心层频域系数进行差计算,得到核心层残差信号;
所述扩展层编码信号合成模块用于将核心层残差信号和扩展层的频域系数按频带的顺序合成,得到扩展层的编码信号。
进一步地,所述残差信号幅值包络生成单元还包括量化指数修正值获取模块和残差信号幅值包络量化指数计算模块;
所述量化指数修正值获取模块用于根据核心层编码子带比特分配数,查找核心层残差信号幅值包络量化指数的修正值统计表,得到残差信号编码子带的量化指数修正值,各编码子带的量化指数修正值大于等于0,且当核心层对应编码子带的比特分配数增加时不减,如果核心层的编码子带的比特分配数为0,则核心层残差信号在该编码子带的量化指数修正值为0,如果子带的比特分配数为所限定的最大比特分配数,则残差信号在该子带的幅值包络值为零;
所述残差信号幅值包络量化指数计算模块用于将核心层编码子带的幅值包络量化指数与对应编码子带的量化指数修正值进行差计算,得到核心层残差信号编码子带的幅值包络量化指数。
进一步地,所述比特流复用器将扩展层编码信号编码比特按照各扩展层编码信号的编码子带重要性的初始值从大到小的顺序写入码流,对于具有相同重要性的编码子带,低频编码子带的编码比特优先写入码流。
图6中的各单元(模块)的具体功能详见对图2所示流程的描述。
解码方法和系统
基于本发明思想,本发明可分层音频解码方法,如图7所示,该解码方法包括以下步骤:
步骤701:对编码端传送过来的比特流进行解复用,对核心层编码子带和扩展层编码子带的幅值包络编码比特解码,得到核心层编码子带和扩展层编码子带的幅值包络量化指数;若瞬态判决信息表明为瞬态信号,还对核心层编码子带和扩展层编码子带的幅值包络量化指数按照频率从小到大的顺序分别进行重排;
步骤702:根据核心层编码子带的幅值包络量化指数,对核心层编码子带进行比特分配,并由此推算核心层残差信号的幅值包络量化指数,根据核心层残差信号的幅值包络量化指数和扩展层编码子带的幅值包络量化指数对扩展层编码信号编码子带进行比特分配;
计算残差信号的幅值包络量化指数的方法为:根据核心层比特分配数,查找核心层残差信号幅值包络量化指数的修正值统计表,得到核心层残差信号幅值包络量化指数的修正值;对核心层编码子带的幅值包络量化指数和对应编码子带的核心层残差信号幅值包络量化指数的修正值进行差计算,得到核心层残差信号幅值包络量化指数;
各编码子带的核心层残差信号幅值包络量化指数修正值大于等于0,且对应核心层编码子带的比特分配数增加时不减小;
当某个核心层编码子带的比特分配数为0时,核心层残差信号幅值包络量化指数修正值为0,当某个核心层编码子带的比特分配数为所限定的最大比特分配数时,对应的核心层残差信号的幅值包络值为零。
步骤703:根据核心层和扩展层的比特分配数,分别对核心层频域系数编码比特和扩展层编码信号的编码比特解码,得到核心层频域系数和扩展层编码信号,将扩展层编码信号按照子带顺序重新排列,并和核心层频域系数相加,得到全体带宽的频域系数;
步骤704:若所述瞬态判决信息表明为稳态信号,则对全体带宽的频域系数直接进行时频逆变换,得到输出的音频信号;若所述瞬态判断信息表明为瞬态信号,则将全体带宽的频域系数进行重排,然后分成M组频域系数,对每一组频域系数进行时频逆变换,根据变换得到的M组时域信号计算得到最终的音频信号。
采用如下顺序对扩展层编码信号的编码比特进行解码:
在扩展层中,扩展层编码信号编码比特的解码顺序是根据对应的扩展层编码信号的编码子带重要性的初始值决定的,重要性大的扩展层编码信号的编码子带优先解码,如果有两个扩展层编码信号编码子带具有相同的重要性,则低频编码子带优先解码,解码过程中计算已解码的比特数,当已解码的比特数满足总比特数要求时停止解码。
图8是本发明可分层音频解码方法实施例的流程图。如图8所示,该方法包括:
801:从编码端传送过来的可分层码流中(即从比特流解复用器DeMUX,Demultiplexer中)提取一帧的编码比特;
提取出编码比特后,首先对边信息进行解码,然后根据Flag_huff_rms_core的值对该帧中核心层的各幅值包络编码比特进行霍夫曼解码或直接解码,得到核心层编码子带的幅值包络量化指数Thq(j),j=0,...,L_core-1。
802:根据核心层编码子带的幅值包络量化指数计算出核心层编码子带重要性初始值,并利用子带重要性对核心层编码子带进行比特分配,得到核心层的比特分配数;解码端的比特分配方法和编码端的比特分配方法完全相同。在比特分配过程中,比特分配步长及比特分配后编码子带重要性降低的步长是变化的。
在完成上述比特分配过程后,根据编码端核心层的比特分配修正次数count_core值和核心层编码子带的重要性,对核心层编码子带再进行count_core次比特分配,然后比特分配全过程结束。
在比特分配过程中,对比特分配数为0的编码子带分配比特的步长是1个比特,比特分配后重要性降低的步长为1,对比特分配数大于0且小于某个阈值的编码子带追加分配比特时的比特分配步长为0.5个比特,比特分配后重要性降低的步长也为0.5,对比特分配数大于等于该阈值的编码子带追加分配比特时的比特分配步长为1,比特分配后重要性降低的步长也为1;
803:利用核心层编码子带的比特分配数和核心层编码子带的量化幅值包络值,并根据Flag_huff_PLVQ_core对核心层频域系数的编码比特进行解码、反量化及反归一化处理,得到核心层频域系数。
804:在对核心层频域系数的编码比特进行解码、反量化时,根据核心层编码子带比特分配数将核心层编码子带划分成低比特编码子带和高比特编码子带,对低比特编码子带和高比特编码子带分别使用塔型格型矢量量化反量化方法和球型格型矢量量化反量化方法进行反量化;
根据核心层边信息,对低比特编码子带进行霍夫曼解码或者直接进行自然解码得到低比特编码子带的塔型格型矢量量化的索引,对所有塔型格型矢量量化的索引进行反量化及反归一化,得到该编码子带的频域系数。以下对塔型格型矢量量化反量化过程进行说明:
a:对于所有j=0,...,L_core-1,如果Flag_huff_PLVQ_core=0,直接解码得到低比特编码子带j的第m个矢量量化的索引index_b(j,m),如果Flag_huff_PLVQ_core=1,那么根据编码子带单个频域系数的比特分配数所对应的霍夫曼编码码表,得到低比特编码子带j的第m个矢量量化的索引index_b(j,m);
当编码子带的单个频域系数所分配到的比特数为1时,如果量化索引的自然二进制码值小于”1111 111”,则按照自然二进制码值计算量化索引;如果量化索引的自然二进制码值等于”1111 111”,则继续读入下一位比特,如果下一位比特是0,则量化索引值为127,如果下一位比特是1,则量化索引值为128。
b:对该量化索引的塔式格型矢量反量化的过程实际上是矢量量化过程108的逆过程,反量化过程如下:
1)确定矢量量化索引所在的能量塔面及在该能量塔面上的标号:
在塔面能量从2到LargeK(region_bit(j))中寻找kk,使得下面的不等式满足:
N(8,kk)<=index_b(j,m)<N(8,kk+2),
如果找到这样的kk,则K=kk为量化索引index_b(j,m)所对应D8格点所在塔面的能量,b=index_b(j,m)-N(8,kk)为该D8格点在所在塔面上的索引标号;
如果找不到这样的kk,则量化索引index_b(j,m)所对应D8格点的塔面能量K=0及索引标号b=0;
2)求解塔面能量为K和索引标号为b的D8格点矢量Y=(y1,y2 y3,y4,y5,y6,y7,y8,)的具体步骤如下:
步骤1:令Y=(0,0,0,0,0,0,0,0),xb=0,i=1,k=K,l=8;
步骤2:如果b=xb那么yi=0;跳转至步骤6;
步骤3:如果b<xb+N(l-1,k),则yi=0,跳转至步骤5;
否则,xb=xb+N(l-1,k);令j=1;
步骤4:如果b<xb+2*N(l-1,k-j),则
如果xb<=b<xb+N(l-1,k-j),则yi=j;
如果b>=xb+N(l-1,k-j),则yi=-j,xb=xb+N(l-1,k-j);
否则xb=xb+2*N(l-1,k-j),j=j+1;继续本步骤;
步骤5:更新k=k-|yi|,l=l-1,i=i+1,如果k>0,则跳转到步骤2;
步骤6:如果k>0,则y8=k-|yi|,Y=(y1,y2,…,y8)为所求格点。
3)对所求D8格点进行能量反规整,得到
其中,a=(2-6,2-6,2-6,2-6,2-6,2-6,2-6,2-6),scale(index)是缩放因子,可从表5查找到。
4)对进行反归一化处理,得到解码端恢复出的编码子带j的第m个矢量的频域系数:
其中,Thq(j)为第j个编码子带的幅值包络量化指数。
对高比特编码子带的编码比特直接进行自然解码得到高比特编码子带j的第m个索引矢量k,对该索引矢量进行球型格型矢量量化的反量化过程实际上是量化过程的逆过程,具体步骤如下:
a:计算x=k*G,并计算ytemp=x/(2^(region_bit(j));其中,k为矢量量化的索引矢量,region_bit(j)表示编码子带j中单个频域系数的比特分配数;G为D8格点的生成矩阵,形式如下:
b:计算y=x-fD8(ytemp)*(2^(region_bit(j));
c:对所求D8格点进行能量反规整,得到
其中,a=(2-6,2-6,2-6,2-6,2-6,2-6,2-6,2-6),scale(region_bit(j))是缩放因子,可从表10查找到。
d:对进行反归一化处理,得到解码端恢复出的编码子带j的第m个矢量的频域系数:
其中,Thq(j)为第j个编码子带的幅值包络量化指数。
805:利用核心层编码子带的幅值包络量化指数和核心层编码子带的比特分配数计算核心层残差信号的子带幅值包络量化指数;解码端的计算方法与编码端的计算方法完全相同;
根据Flag_huff_rms_ext的值对扩展层编码子带的幅值包络编码比特进行霍夫曼解码或直接解码,得到扩展层编码子带的幅值包络量化指数Thq(j),j=,L_core,...,L-1。
806:扩展层编码信号是由核心层残差信号和扩展层频域系数构成,根据扩展层编码信号编码子带的幅值包络量化指数计算扩展层编码信号编码子带重要性的初始值,并使用扩展层编码信号编码子带的重要性初始值对扩展层编码信号编码子带进行比特分配,得到扩展层编码信号编码子带的比特分配数;
解码端的编码子带重要性初始值的计算和比特分配方法与编码端的编码子带重要性初始值的计算方法和比特分配方法相同。
807:计算扩展层编码信号:
利用扩展层编码信号的比特分配数对编码信号的编码比特进行解码和反量化,并利用扩展层编码信号编码子带的量化幅值包络值对反量化后的数据进行反归一化,得到扩展层编码信号。
扩展层的解码及反量化的方法和核心层的解码及反量化的方法相同。
本步骤中,扩展层编码信号的编码子带解码的顺序是根据扩展层编码信号的编码子带重要性的初始值决定的。如果有两个扩展层编码信号的编码子带具有相同的重要性,则低频编码子带优先解码,同时计算已解码的比特数,当已解码的比特数满足总比特数要求时停止解码。
例如,从编码端送往解码端的码率为64kbps,但是由于网络原因,解码端只能得到码流前面48kbps的信息,或解码端只支持48kbps的解码,所以当解码端解码到48kbps时就停止解码。
808:将扩展层解码得到的编码信号按频率大小重新排列,并将相同频率下的核心层频域系数和扩展层编码信号相加得到频域系数输出值。
809:对编码过程中未分配编码比特的子带或传输过程中丢失了的子带进行噪声填充。
810:当瞬态判决标识位Flag_transient为1时,对频域系数进行重排,即将表2中的L个子带所对应的所有频域系数按照原始频域系数索引序号对应的位置重新排列,表2中没有提及的频域系数索引对应的频域系数均置为0。
811:对频域系数进行时频逆变换,得到最终的音频输出信号。具体步骤如下:
当瞬态判决标识位Flag_transient为0时,对N点频域系数进行长度为N的逆DCTIV变换,得到n=0,...,N-1。
当瞬态判决标识位Flag_transient为1时,首先将N点频域系数分成等长的4组,对每一组频域系数进行长度为N/4的逆DCTIV变换和逆时域抗混叠处理,接着对这4组得到的信号进行加窗处理(窗结构同编码端),然后对这4组加窗后信号进行交迭相加,得到n=0,...,N-1。
对n=0,...,N-1进行逆时域抗混叠处理和加窗处理(窗结构同编码端)。对相邻两帧进行交迭相加,得到最终的音频输出信号。
图9是本发明可分层音频解码系统的结构示意图,如图9所示,该系统包含:比特流解复用器(DeMUX)、核心层编码子带的幅值包络解码单元、核心层比特分配单元、核心层解码和反量化单元、残差信号幅值包络生成单元、扩展层比特分配单元、扩展层编码信号解码和反量化单元、全体带宽频域系数恢复单元、噪声填充单元、音频信号恢复单元;其中:
所述幅值包络解码单元,与所述比特流解复用器连接,用于对所述比特流解复用器输出的核心层和扩展层编码子带的幅值包络编码比特进行解码,得到核心层编码子带和扩展层编码子带的幅值包络量化指数;若瞬态判决信息表明为瞬态信号,还对核心层编码子带和扩展层编码子带的幅值包络量化指数按照频率从小到大的顺序分别进行重排;
所述核心层比特分配单元,与所述幅值包络解码单元连接,用于根据核心层编码子带的幅值包络量化指数,对核心层编码子带进行比特分配,得到核心层编码子带的比特分配数;
所述核心层解码和反量化单元,与所述比特流解复用器、幅值包络解码单元及核心层比特分配单元连接,用于根据核心层编码子带的幅值包络量化指数计算得到核心层编码子带的量化幅值包络值,使用核心层编码子带的比特分配数和量化幅值包络值对所述比特流解复用器输出的核心层频域系数编码比特进行解码、反量化及反归一化处理,得到核心层的频域系数;
所述残差信号幅值包络生成单元,与所述幅值包络解码单元及核心层比特分配单元连接,用于根据核心层编码子带的幅值包络量化指数与对应编码子带的比特分配数,查找核心层残差信号幅值包络量化指数的修正值统计表,得到核心层残差信号幅值包络量化指数;
所述扩展层比特分配单元,与所述残差信号幅值包络生成单元及幅值包络解码单元连接,用于根据核心层残差信号幅值包络量化指数和扩展层编码子带的幅值包络量化指数进行扩展层编码信号编码子带的比特分配,得到扩展层编码信号编码子带的比特分配数;
所述扩展层编码信号解码和反量化单元,与比特流解复用器、所述幅值包络解码单元、扩展层比特分配单元及残差信号幅值包络生成单元连接,用于使用扩展层编码信号编码子带的幅值包络量化指数计算得到扩展层编码信号编码子带的量化幅值包络值,使用扩展层编码信号编码子带的比特分配数和量化幅值包络值对所述比特流解复用器输出的扩展层编码信号的编码比特进行解码、反量化及反归一化处理,得到扩展层编码信号;
所述全体带宽频域系数恢复单元,与所述核心层解码和反量化单元以及扩展层编码信号解码和反量化单元连接,用于根据编码子带顺序对所述扩展层编码信号解码和反量化单元输出的扩展层的编码信号进行重新排序,然后与所述核心层解码和反量化单元输出的核心层频域系数做和计算,得到全体带宽频域系数;
所述噪声填充单元,与所述全体带宽频域系数恢复单元及幅值包络解码单元连接,用于对编码过程中未分配编码比特的子带进行噪声填充;
音频信号恢复单元,与所述噪声填充单元连接,若所述瞬态判决信息表明为稳态信号,用于对全体带宽的频域系数直接进行时频逆变换,得到输出的音频信号;若所述瞬态判断信息表明为瞬态信号,用于将全体带宽的频域系数进行重排,然后分成M组频域系数,对每一组频域系数进行时频逆变换,根据变换得到的M组时域信号计算得到最终的音频信号。
进一步地,
所述残差信号幅值包络生成单元还包括量化指数修正值获取模块和残差信号幅值包络量化指数计算模块;
所述量化指数修正值获取模块用于根据核心层编码子带比特分配数查找核心层残差信号幅值包络量化指数的修正值统计表,得到残差信号编码子带的量化指数修正值,各编码子带的量化指数修正值大于等于0,且当核心层对应编码子带的比特分配数增加时不减小,如果核心层的某个编码子带的比特分配数为0,则核心层残差信号在该编码子带的量化指数修正值为0,如果某个核心层编码子带的比特分配数为所限定的最大比特分配数,则残差信号在该编码子带的幅值包络值为零;
所述残差信号幅值包络量化指数计算模块用于将核心层编码子带的幅值包络量化指数与对应编码子带的量化指数修正值进行差计算,得到核心层残差信号编码子带的幅值包络量化指数。
进一步地,
所述扩展层编码信号解码和反量化单元对扩展层编码信号的编码子带解码的顺序是根据扩展层编码信号的编码子带重要性的初始值决定的,重要性大的扩展层编码信号的编码子带优先解码,如果有两个扩展层编码信号的编码子带具有相同的重要性,则低频编码子带优先解码,解码过程中计算已解码的比特数,当已解码的比特数满足总比特数要求时停止解码。
所述扩展层编码信号解码和反量化单元对扩展层编码信号编码子带解码的顺序是根据扩展层编码信号的编码子带重要性的初始值决定的,重要性大的扩展层编码信号的编码子带优先解码,如果有两个扩展层编码信号的编码子带具有相同的重要性,则低频编码子带优先解码,解码过程中计算已解码的比特数,当已解码的比特数满足总比特数要求时停止解码。
进一步地,所述音频信号恢复单元对全体带宽的频域系数进行重排具体指将属于同一子帧的频域系数按照编码子带从低频到高频的顺序排列,得到M组频域系数后,再将M组频域系数按照子帧的顺序排列。
进一步地,若瞬态判决信息表明为瞬态信号,所述音频信号恢复单元根据变换得到的M组时域信号计算得到最终的音频信号的过程具体包括:对每一组进行逆时域抗混叠处理,接着对这M组得到的信号进行加窗处理,然后对这M组加窗后信号进行交迭相加,得到N点时域采样信号对时域信号进行逆时域抗混叠处理和加窗处理,对相邻两帧进行交迭相加,得到最终的音频输出信号。
本发明还提供以下针对瞬态信号的可分层编码及解码方法:
本发明瞬态信号的可分层音频编码方法,包括:
A1、将音频信号分成M个子帧,对每个子帧进行时频变换,变换得到的M组频域系数构成当前帧总的频域系数,对总的频域系数按照编码子带从低频到高频的顺序进行重排,其中,所述总的频域系数包括核心层频域系数和扩展层频域系数,所述编码子带包括核心层编码子带和扩展层编码子带,核心层频域系数构成若干个核心层编码子带,扩展层频域系数构成若干个扩展层编码子带;
B1、对核心层编码子带和扩展层编码子带的幅值包络值进行量化和编码,得到核心层编码子带和扩展层编码子带的幅值包络量化指数及其编码比特,其中对核心层编码子带和扩展层编码子带的幅值包络值分别进行单独量化,以及对核心层编码子带的幅值包络量化指数和扩展层编码子带的幅值包络量化指数分别进行重排;
C1、根据核心层编码子带的幅值包络量化指数对核心层编码子带进行比特分配,然后对核心层频域系数进行量化和编码得到核心层频域系数的编码比特;
D1、对前述核心层中经过矢量量化的频域系数进行反量化,并与原始的经过时频变换后得到的频域系数进行差计算,得到核心层残差信号;
E1、根据核心层编码子带的幅值包络量化指数和比特分配数计算核心层残差信号编码子带的幅值包络量化指数;
F1、根据核心层残差信号的幅值包络量化指数和扩展层编码子带的幅值包络量化指数对扩展层编码信号的编码子带进行比特分配,然后对扩展层编码信号进行量化和编码得到扩展层编码信号的编码比特,其中,所述扩展层编码信号由核心层残差信号和扩展层频域系数构成;
F1、将核心层和扩展层编码子带的幅值包络编码比特、核心层频域系数的编码比特和扩展层编码信号的编码比特复用打包后,传送给解码端。
步骤A1中,当前帧总的频域系数的获取方法为:
将当前帧的N点时域采样信号x(n)与上一帧的N点时域采样信号xold(n)组成2N点时域采样信号,然后对实施加窗和时域抗混叠处理得到N点时域采样信号
对时域信号做对称变换,接着在信号两端各添加一段零序列,将加长后的信号分成M个互相交迭的子帧,然后对每个子帧的时域信号实施加窗、时域抗混叠处理和时频变换,得到M组频域系数,构成当前帧总的频域系数。
步骤A1中,对频域系数进行重排时,在核心层和扩展层范围内按照编码子带从低频到高频的顺序分别进行频域系数的重排。
步骤B1中,所述对幅值包络量化指数进行重排具体包括:
将同一子帧内的编码子带的幅值包络量化指数按照频率递增或递减的顺序重新排列在一起,在子帧连接处采用分属于两个子帧的代表对等频率的两个编码子带来连接。
步骤F1中,按照如下码流格式进行复用打包:
首先将核心层的边信息比特写入码流的帧头后面,将核心层编码子带的幅值包络编码比特写入比特流复用器MUX,然后将核心层频域系数的编码比特写入MUX;
然后将扩展层的边信息比特写入MUX,然后将扩展层频域系数编码子带的幅值包络编码比特写入MUX,然后将扩展层编码信号的编码比特写入MUX;
根据所要求的码率,将满足码率要求的比特数传送到解码端。
核心层的边信息包括瞬态判决标识位比特、核心层编码子带的幅值包络的霍夫曼编码标志位比特、核心层频域系数的霍夫曼编码标志位比特和核心层比特分配修正迭代次数比特;
扩展层的边信息包括扩展层编码子带的幅值包络的霍夫曼编码标识位比特、扩展层编码信号的霍夫曼编码标识位比特和扩展层比特分配修正迭代次数比特。
本发明瞬态信号可分层解码方法,包括:
步骤A2、对编码端传送过来的比特流进行解复用,对核心层编码子带和扩展层编码子带的幅值包络编码比特解码,得到核心层编码子带和扩展层编码子带的幅值包络量化指数,对核心层编码子带和扩展层编码子带的幅值包络量化指数按照频率从小到大的顺序分别进行重排;
步骤B2、根据重排后的核心层编码子带的幅值包络量化指数,对核心层编码子带进行比特分配,并由此计算核心层残差信号的幅值包络量化指数;
步骤C2、根据核心层残差信号的幅值包络量化指数和重排后的扩展层编码子带的幅值包络量化指数对扩展层编码信号的编码子带进行比特分配;
步骤D2、根据核心层和扩展层的比特分配数,分别对核心层频域系数编码比特和扩展层编码信号的编码比特解码,得到核心层频域系数和扩展层编码信号,将扩展层编码信号按照子带顺序重新排列,并和核心层频域系数相加,得到全体带宽的频域系数;
步骤E2、将全体带宽的频域系数进行重排,然后分成M组,对每一组频域系数进行时频逆变换,根据变换得到的M组时域信号计算得到最终的音频信号。
步骤E2中,将全体带宽的频域系数进行重排具体指将属于同一子帧的频域系数按照编码子带从低频到高频的顺序排列,得到M组频域系数后,再将M组频域系数按照子帧的顺序排列。
步骤E2中,根据变换得到的M组时域信号计算得到最终的音频信号的过程包括:对每一组进行逆时域抗混叠处理,接着对这M组得到的信号进行加窗处理,然后对这M组加窗后信号进行交迭相加,得到N点时域采样信号
对时域信号进行逆时域抗混叠处理和加窗处理,对相邻两帧进行交迭相加,得到最终的音频输出信号。
机译: 分层场景分解编解码器系统和方法
机译: 分层场景分解编解码器系统和方法
机译: 分层场景分解编解码器系统和方法