这段时间需要重新开发ac3的算法。公司原来的算法结构太烂了,维护太麻烦,
boss痛下决心将一些算法重新开发一遍(原来的算法是买来的)。
了解了一下ac3的开发文档,搞清了ac3的基本架构,目前的版本先支持
bsid=7,8,9,10的情况。eac3在ac3定点化完成后继续开发。
目前总算将ac3的定点化完成了,特此总结一下。
ac3的解码流程如下:
bitstream parsing -> 指数与尾数解码->和差解码(仅支持acomd==2) ->dynamic range -> IMDCT ->windowing->overlap processing ->down mixing ->output pcm
ac3的一帧包含有6个blocks,以及一个header。header中包含ac3的类型,采样率信息,帧长,输入通道数等。
每个block中输入通道的数目是都是相同的。
1)ac3的频域的系数采用的是指数尾数编码方式,不同于dra等的采用huffman编码的方式。每个通道的第一个指数
是基础指数,后续的尾数都是加上前一个指数来组成当前的真实指数。这样可以提高编码的效率。指数表示的该频域
系数最高位的零的个数,解码就是将尾数根据指数右移特定的尾数来获取。被coupling的高频部分以及lfe通道都是
独立的来计算指数的,不与正常通道进行指数累加。
2)ac3采用了对于高频部分进行coupling的方式来提高编码效率,将某个block中的n个通道中高频部分只根据一个
通道进行编码。被coupling的通道的高频部分就不需要进行再解码了。
3)dynamic range 是ac3提供的用来控制输出音频信号的幅度的作用,以适应不同场合的使用满足不同听众的需求。
4)ac3采用了256点IMDCT与512点IMDCT相结合的方式,对于需要更精确的频谱处理的时候就采用256点,反之
采用512点的。两者的切换在码流中都有特定bit来规定。
5)down mixing就是根据需要将多声道的合并成特定的声道进行输出。目前我们暂时只支持6->2, 2->2的方式。
定点化比较的简单,audio的算法的定点相对于speech来说一向比较的简单。我规定的Q格式一直不变就可以满足
公司对于conformance的需求了。
由于快速算法中, 根据文档,它的IMDCT的核心部分是IFFT的处理, 因为我们公司有通用的FFT模块,为了方便就采用
FFT来实现IFFT的方式来替换, 这样也便于以后模块的通用和优化. 在fft之前将虚数部分取反, fft处理后,将出来的数据
虚数部分再取反就与IFFT的处理等价了.