昨天晚上在调试一个斯坦福的audio coder代码时,发现里面使用了ADT——自适应变换。并且最近在看一些正弦模型编码的时候也会在里面提到瞬态模型,瞬态检测的意义等等。
晚上因为家事睡不着觉,就一直思考这些问题,终于有所领悟,今天分享出来。
1.先说什么是pre-echo:
这是hydrogenaudio给的定义
http://wiki.hydrogenaudio.org/index.php?title=Pre_echo
我找不到我之前的总结了,我先留个坑。
我先贴一个瞬态信号的图
这种信号在经过变换编码由于变换编码的Ringing artifacts[1],会产生下面的噪声。
[1]Henrique S. Malvar <Biorthogonal and Nonuniform Lapped Transforms for Transform Coding with Reduced Blocking and Ringing Artifacts>
本质上是因为阶跃信号变换后量化的导致的。
2.那么AAC是怎么处理的呢?
AAC是通过TNS在频域滤波达到平滑时域谱的目的,这里有个问题,
在频域处理怎么能使平滑时域谱呢。TNS的原则是利用之前信号处理的知识。
频域和时域是对偶关系。预测和变换是对偶关系。
变换后再预测等同于时域处理。【2】
[2]
简而言之,TNS就是在小范围上对信号进行平滑以达到减小在变换编码中由于量化导致的Ringing效应。
那么我们看看AAC TNS的参数有什么,怎么计算。
部分意义
n-filt是tns滤波在每个帧内的个数,对短帧,是1个,对长帧是2个。
length表示tns滤波过滤的频域系数的个数。
order是tns滤波器阶数
coef_compress是判断tns滤波系数是否要压缩。
coef就是tns滤波系数了。
这里我着重讲一下方向:
direction的意思,因为瞬态信号(类阶跃信号)是双向的,所以tns滤波也有个方向问题。这个要清楚。
3. AAC的tns的应用模块原理
编码端:tns有3个模块
需求检测,系数计算,执行滤波
需求检测:TNS使用了LevinsonDurbin的方法计算预测增益,通过预测增益和预测误差的比和阈值比较。决定是否启用TNS。
系数计算:TNS还是使用LevinsonDurbin计算预测系数。
解码器端:
解码参数,系数计算,执行逆滤波
这里补充一个基本问题吧
LevinsonDurbin的方法计算预测增益的方法和意义是什么?
4. 结论,可以说,AAC tns的方法是一个一般方法,我认为他占用了部分码流,而pre-echo的处理完全可通过不占码流的方式解决,当然这也涉及AAC本身固定帧长的问题。
并且AAC Tns的是没有瞬态检测的,只是增益计算,它是通过判断tns启动后对码流节省是否合算判断是否启动tns(有待进一步研究)。tns的预测系数计算也是相对简单的。