发明名称 一种语音/音乐双模编解码无缝切换方法
摘要 一种语音/音乐双模编解码无缝切换方法。当双模编解码器从基于CELP的语音模式切换到基于MDCT的音乐模式时,对切换前的最后一个CELP帧时域音频信号的尾部采用加窗和折叠处理,切换的连续性由MDCT变换的重叠相加性质保证;当双模编解码器从基于MDCT的音乐模式切换到基于CELP的语音模式时,切换前最后一个MDCT帧采用一种新的窗型使其与切换后第一个CELP帧无时域重叠,切换的连续性由预编码技术保证。该方法对采用CELP模式的音频时域信号进行特定的降采样处理,以适应两种编解码模式对输入音频信号采样率的不同要求以及音频信号动态的时频域特性。
申请公布号 CN101025918B 申请公布日期 2011.06.29
申请号 CN200710062862.7 申请日期 2007.01.19
申请人 清华大学 发明人 张树华;窦维蓓;杨华中;张斌
分类号 G10L19/14(2006.01)I;G10L19/12(2006.01)I 主分类号 G10L19/14(2006.01)I
代理机构 代理人
主权项 1.一种语音/音乐双模编码无缝切换方法,其特征在于依次含有以下步骤:步骤(1),在数字集成电路中构成一个编码器,在该编码器至少有四个子模块:语音/音乐分类子模块,区分语音帧和音乐帧;语音/音乐切换模块,对语音帧和音乐帧作无缝切换;修正余弦变换的音乐编码子模块,采用先进音频编码AAC对音乐编码;语音编码子模块,采用码激励线性预测CELP对语音编码;步骤(2),该语音/音乐分类子模块把输入的音频信号划分为语音帧和音乐帧;步骤(3),把步骤(2)所得到的结果送入语音/音乐切换模块,判断是否为语音帧;步骤(4),在步骤(3)中,若判断为语音帧,则执行步骤(5),若判断为音乐帧,则执行步骤(6);步骤(5),判断步骤(4)得到的语音帧的上一帧是否为语音帧:若其上一帧是音乐帧,则执行步骤(5.1);若其上一帧是语音帧,则执行步骤(5.2);步骤(5.1),若步骤(5)判断的结果,所选语音帧的上一帧是音乐帧,则进行预编码:首先从上一帧经过编码量化后的整数修正余弦变换MDCT频谱数据中恢复第L帧的前N/2个样点,L是当前帧的帧序号,N是一帧的采样点数,为偶数,各帧相同;再从这N/2个点中截取最后的P个样点,P为一个CELP编码帧的样点数,降采样后作为语音编码器CELP的输入;编码该帧前CELP的内部状态清0,该帧的编码数据不写入最终的编码码流;然后,CELP保持其内部状态进入步骤(5.2);步骤(5.2),判断步骤(4)得到的语音帧的下一帧是否为语音帧:若其下一帧是语音帧,则执行步骤(5.3);若其下一帧不是语音帧,执行步骤(5.4);步骤(5.3),若步骤(5.2)判断的结果,所选语音帧的下一帧是音乐帧,则进行加窗折叠:取当前语音帧的最后M/2个样点和与当前语音帧相邻的下M/2个时域样点,M为偶数,组成时间上连续的M个样点,即加窗折叠区,做如下的加窗折叠处理:y<sub>L</sub>(N+i)=x<sub>L</sub>(N+i)*h<sub>2</sub>(M/2-1-i)+x<sub>L</sub>(N-1-i)*h<sub>2</sub>(M/2+i) i=-M/2,...,-1,N是一帧的采样点数,为偶数,x<sub>L</sub>(N+i),i=-M/2,...,-1是当前帧输入的最后M/2个时域信号,x<sub>L</sub>(N-1-i),i=-M/2,...,-1是紧邻当前帧之后的M/2个时域信号,h<sub>2</sub>(M/2-1-i),i=-M/2,...,-1是窗函数h<sub>2</sub>的后M/2个样点,h<sub>2</sub>(M/2+i),i=-M/2,...,-1是窗函数h<sub>2</sub>的前M/2个样点,h<sub>2</sub>是满足MDCT完全重建条件的单调递增函数:h<sub>2</sub>(i)<sup>2</sup>+h<sub>2</sub>(M-1-i)<sup>2</sup>=1,i=0,...,M-1,得到y<sub>L</sub>(N-M/2),...,y<sub>L</sub>(N-1)共M/2个样点,与当前帧的前N-M/2个样点x<sub>L</sub>(0),...,x<sub>L</sub>(N-M/2+1)组成新的N样点序列:x<sub>L</sub>(0),...,x<sub>L</sub>(N-M/2+1),y<sub>L</sub>(N-M/2),...,y<sub>L</sub>(N-1),以这N个样点作为输入,进入步骤(5.4);步骤(5.4),将来自步骤(5.2)原N点时域信号或(5.3)经处理的N点时域信号进行k倍降采样处理,得到<img file="FSB00000466837700021.GIF" wi="146" he="64" />个样点,<img file="FSB00000466837700022.GIF" wi="148" he="63" />表示不超过k*N最大整数,k=f<sub>s</sub>/f<sub>a</sub>为CELP的采样率f<sub>s</sub>与输入音频的采样率f<sub>a</sub>的比值,以这<img file="FSB00000466837700023.GIF" wi="147" he="63" />个样点为输入,进入步骤(5.5);步骤(5.5),对步骤(5.4)得到的<img file="FSB00000466837700024.GIF" wi="147" he="64" />点序列进行CELP编码,得到CELP码流;步骤(6),判断步骤(4)得到的音乐帧的上一帧是否为音乐帧,若上一帧是语音帧则执行步骤(6.1);若上一帧是音乐帧则执行步骤(6.2);步骤(6.1),对由作为上一帧的语音帧向音乐帧切换的第一个MDCT变换的作用区域第I帧和第(I+1)帧,I是当前帧的帧序号,做如下的加窗处理:<maths num="0001"><![CDATA[<math><mfenced open='{' close=''><mtable><mtr><mtd><msub><mi>y</mi><mi>I</mi></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>=</mo><msub><mi>x</mi><mi>I</mi></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>*</mo><msub><mi>w</mi><mn>2</mn></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>,</mo></mtd><mtd><mi>i</mi><mo>=</mo><mn>0,1</mn><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mi>N</mi><mo>-</mo><mn>1</mn></mtd></mtr><mtr><mtd><msub><mi>y</mi><mrow><mo>(</mo><mi>I</mi><mo>+</mo><mn>1</mn><mo>)</mo></mrow></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>=</mo><msub><mi>x</mi><mrow><mo>(</mo><mi>I</mi><mo>+</mo><mn>1</mn><mo>)</mo></mrow></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>*</mo><msub><mi>w</mi><mn>2</mn></msub><mrow><mo>(</mo><mi>i</mi><mo>+</mo><mi>N</mi><mo>)</mo></mrow><mo>,</mo></mtd><mtd><mi>i</mi><mo>=</mo><mn>0,1</mn><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mi>N</mi><mo>-</mo><mn>1</mn></mtd></mtr></mtable></mfenced></math>]]></maths>x<sub>I</sub>(i),i=0,1,...,N-1为第I帧的N点时域信号,x<sub>(I+1)</sub>(i),i=0,1,...,N-1为第(I+1)帧的N点时域信号,w<sub>2</sub>为窗函数,由下式决定:<maths num="0002"><![CDATA[<math><mrow><msub><mi>w</mi><mn>2</mn></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>=</mo><mfenced open='{' close=''><mtable><mtr><mtd><mn>0</mn><mo>,</mo></mtd><mtd><mn>0</mn><mo>&le;</mo><mi>i</mi><mo>&lt;</mo><mrow><mo>(</mo><mi>N</mi><mo>-</mo><mi>M</mi><mo>)</mo></mrow><mo>/</mo><mn>2</mn></mtd></mtr><mtr><mtd><msub><mi>h</mi><mn>2</mn></msub><mrow><mo>(</mo><mi>i</mi><mo>-</mo><mrow><mo>(</mo><mi>N</mi><mo>-</mo><mi>M</mi><mo>)</mo></mrow><mo>/</mo><mn>2</mn><mo>)</mo></mrow></mtd><mtd><mrow><mo>(</mo><mi>N</mi><mo>-</mo><mi>M</mi><mo>)</mo></mrow><mo>/</mo><mn>2</mn><mo>&le;</mo><mi>i</mi><mo>&lt;</mo><mrow><mo>(</mo><mi>N</mi><mo>+</mo><mi>M</mi><mo>)</mo></mrow><mo>/</mo><mn>2</mn></mtd></mtr><mtr><mtd><mn>1</mn><mo>,</mo></mtd><mtd><mrow><mo>(</mo><mi>N</mi><mo>+</mo><mi>M</mi><mo>)</mo></mrow><mo>/</mo><mn>2</mn><mo>&le;</mo><mi>i</mi><mo>&lt;</mo><mi>N</mi></mtd></mtr><mtr><mtd><msub><mi>h</mi><mn>1</mn></msub><mrow><mo>(</mo><mn>2</mn><mi>N</mi><mo>-</mo><mn>1</mn><mo>-</mo><mi>i</mi><mo>)</mo></mrow></mtd><mtd><mi>N</mi><mo>&le;</mo><mi>i</mi><mo>&lt;</mo><mn>2</mn><mi>N</mi></mtd></mtr></mtable></mfenced></mrow></math>]]></maths>其中h<sub>2</sub>与步骤(5.3)中的h<sub>2</sub>一致,h<sub>1</sub>为满足MDCT完全重建条件的窗函数:h<sub>1</sub>(j)<sup>2</sup>+h<sub>1</sub>(M-1-j)<sup>2</sup>=1,j=0,...,M-1,得到的时域上连续的2N点加窗信号y<sub>I</sub>(0),...,y<sub>I</sub>(N-1),y<sub>(I+1)</sub>(0),...,y<sub>(I+1)</sub>(N-1),作为输入,进入步骤(6.3);步骤(6.2),若上一帧是音乐帧,则判断当前帧的下一帧是否为音乐帧;若下一帧不是音乐帧,执行步骤(6.2.1);若下一帧是音乐帧,执行步骤(6.2.2);步骤(6.2.1),当前帧的下一帧是语音帧,对当前帧和下一帧进行如下的加窗处理:<maths num="0003"><![CDATA[<math><mfenced open='{' close=''><mtable><mtr><mtd><msub><mi>y</mi><mi>I</mi></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>=</mo><msub><mi>x</mi><mi>I</mi></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>*</mo><msub><mi>w</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>,</mo></mtd><mtd><mi>i</mi><mo>=</mo><mn>0,1</mn><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mi>N</mi><mo>-</mo><mn>1</mn></mtd></mtr><mtr><mtd><msub><mi>y</mi><mrow><mo>(</mo><mi>I</mi><mo>+</mo><mn>1</mn><mo>)</mo></mrow></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>=</mo><msub><mi>x</mi><mrow><mo>(</mo><mi>I</mi><mo>+</mo><mn>1</mn><mo>)</mo></mrow></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>*</mo><msub><mi>w</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>i</mi><mo>+</mo><mi>N</mi><mo>)</mo></mrow><mo>,</mo></mtd><mtd><mi>i</mi><mo>=</mo><mn>0,1</mn><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mi>N</mi><mo>-</mo><mn>1</mn></mtd></mtr></mtable></mfenced></math>]]></maths>I是当前帧的帧序号,(I+1)是下一帧的帧序号,x<sub>I</sub>(i),i=0,1,...,N-1为第I帧的N点时域信号,x<sub>(I+1)</sub>(i),i=0,1,...,N-1为第(I+1)帧的N点时域信号,w<sub>1</sub>为窗函数,由下式决定:<maths num="0004"><![CDATA[<math><mrow><msub><mi>w</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>=</mo><mfenced open='{' close=''><mtable><mtr><mtd><msub><mi>h</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>,</mo></mtd><mtd><mn>0</mn><mo>&le;</mo><mi>i</mi><mo>&lt;</mo><mi>N</mi></mtd></mtr><mtr><mtd><mn>1</mn><mo>,</mo></mtd><mtd><mi>N</mi><mo>&le;</mo><mi>i</mi><mo>&lt;</mo><mn>3</mn><mi>N</mi><mo>/</mo><mn>2</mn></mtd></mtr><mtr><mtd><mn>0</mn><mo>,</mo></mtd><mtd><mn>3</mn><mi>N</mi><mo>/</mo><mn>2</mn><mo>&le;</mo><mi>i</mi><mo>&lt;</mo><mn>2</mn><mi>N</mi></mtd></mtr></mtable></mfenced></mrow></math>]]></maths>其中h<sub>1</sub>与步骤(6.1)中的h<sub>1</sub>一致,得到的时域上连续的2N点加窗信号y<sub>I</sub>(0),...,y<sub>I</sub>(N-1),y<sub>(I+1)</sub>(0),...,y<sub>(I+1)</sub>(N-1),作为输入,进入步骤(6.3);步骤(6.2.2),当前帧的下一帧是语音帧,对当前帧和下一帧进行如下的加窗处理:<maths num="0005"><![CDATA[<math><mfenced open='{' close=''><mtable><mtr><mtd><msub><mi>y</mi><mi>I</mi></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>=</mo><msub><mi>x</mi><mi>I</mi></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>*</mo><msub><mi>w</mi><mn>0</mn></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>,</mo></mtd><mtd><mi>i</mi><mo>=</mo><mn>0,1</mn><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mi>N</mi><mo>-</mo><mn>1</mn></mtd></mtr><mtr><mtd><msub><mi>y</mi><mrow><mo>(</mo><mi>I</mi><mo>+</mo><mn>1</mn><mo>)</mo></mrow></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>=</mo><msub><mi>x</mi><mrow><mo>(</mo><mi>I</mi><mo>+</mo><mn>1</mn><mo>)</mo></mrow></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>*</mo><msub><mi>w</mi><mn>0</mn></msub><mrow><mo>(</mo><mi>i</mi><mo>+</mo><mi>N</mi><mo>)</mo></mrow><mo>,</mo></mtd><mtd><mi>i</mi><mo>=</mo><mn>0,1</mn><mo>,</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>.</mo><mo>,</mo><mi>N</mi><mo>-</mo><mn>1</mn></mtd></mtr></mtable></mfenced></math>]]></maths>I是当前帧的帧序号,(I+1)是下一帧的帧序号,x<sub>I</sub>(i),i=0,1,...,N-1为第I帧的N点时域信号,x<sub>(I+1)</sub>(i),i=0,1,...,N-1为第(I+1)帧的N点时域信号,w<sub>0</sub>为窗函数,由下式决定:<maths num="0006"><![CDATA[<math><mrow><msub><mi>w</mi><mn>0</mn></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>=</mo><mfenced open='{' close=''><mtable><mtr><mtd><msub><mi>h</mi><mn>1</mn></msub><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow><mo>,</mo></mtd><mtd><mn>0</mn><mo>&le;</mo><mi>i</mi><mo>&lt;</mo><mi>N</mi></mtd></mtr><mtr><mtd><msub><mi>h</mi><mn>1</mn></msub><mrow><mo>(</mo><mn>2</mn><mi>N</mi><mo>-</mo><mn>1</mn><mo>-</mo><mi>i</mi><mo>)</mo></mrow><mo>,</mo></mtd><mtd><mi>N</mi><mo>&le;</mo><mi>i</mi><mo>&lt;</mo><mn>2</mn><mi>N</mi></mtd></mtr></mtable></mfenced></mrow></math>]]></maths>其中h<sub>1</sub>与步骤(6.1)中的h<sub>1</sub>一致,得到的时域上连续的2N点加窗信号y<sub>I</sub>(0),...,y<sub>I</sub>(N-1),y<sub>(I+1)</sub>(0),...,y<sub>(I+1)</sub>(N-1),作为输入,进入步骤(6.3);步骤(6.3),对步骤(6.1)或者(6.2.1)或者(6.2.2)得到的点序列进行AAC编码,得到AAC码流。
地址 100084 北京市100084信箱82分箱清华大学专利办公室