【转帖】关于差值滤波器的理论基础
2010-09-29 15:18
1546 查看
昨晚上在群里和别人探讨了一下H.264里的插值滤波器的原理。在这里做一点总结。(写完以后回头看,发现写的十分罗嗦。懂信号理论的人可以速速浏览。)
图表 1:上采样过程频域分析
<A>假设是原始信号的频谱图。注意数字信号的频谱是以2π为周期的,所以该信号的基本频率特性是低频(0附近)丰富,高频逐渐减小,直至±π处为0。此外这里还隐含了一个问题,就是该信号的原始采样频率恰好就是奈奎斯特频率(所以周期性的频谱恰好首尾相接),原始采样频率再低一点就要发生混叠了,这个将是第3节要着重考察的问题。
<A>-<D>描述的是2倍上采样的过程。事实上我们都知道,插值无非就是用一个N-tap的计算式得出一个值罢了(正如H.264的1/2像素插值)。但是在频率域分析的时候为了清楚起见,通常会将这个过程分成两个步骤:1.增加采样率(压缩频谱横轴);2.低通滤波。需要说明的是这样的两个步骤只是为了分析需要,它与直接一个N-tap插值是等价的!
<B>就是<A>增加采样率后的结果,从数学推导上这个过程对应的结果就是压缩横轴,可以想象把<A>的频谱从左右两个方向向中间挤压就得到了<B>。但是在<B>中高频部分其实是次生的频率(mirror frequency),因此我们需要一个低通滤波器把它滤掉,<C>就是这样一个理想的低通。最终得到了<D>,上采样结束。
对比<A>和<D>,其实不难理解。<A>是用奈奎斯特频率(假设是f)采得的信号,那么如果我用2f去采,理所当然频谱的间隔会大。
首先要明白,这里的两种滤波器实质上对应的都是图表 1的<C>,也就是低通滤波器,只不过性能有区别而已。<C>的低通是理想的,即边缘完全是切下来的,过渡带宽度为0。而在实际中不可能做到理想,实际滤波器都会有一个过渡带。一般情况下,滤波器实现阶数越高越复杂,对理想性能的逼近越好。下图为一个概念性的示意图(现实情况远比此复杂):
图表 2:低通滤波器示意图
6-tap要比bilinear复杂,因此低通性能要好。也许有人会说那为什么不采用阶数更高的FIR而获取更好的低通滤波器呢?原因就是这样会给实现带来巨大的复杂性。JVT专家经过权衡计算,得出现有的6-tap滤波器低通性能是所有6-tap中最好的,并且6-tap的计算相对简单。
那么为什么1/4像素精度插值的时候,可以使用性能较差的bilinear滤波器就可以了呢?原因也很简单,如下图
图表 3:插值信号的频率示意
<A>-<B>的过程中,由于<A>的频谱基本上占据了整个频段,所以滤波的时候必须要理想低通,否则在高频处就会失真。因此要采用较好的低通滤波器。
而<B>-<C>的过程中,<B>并没有占据全部频段,高频部分都是空的,所以这里的低通就不用那么严格要求了。
总而言之,低通滤波器的选择要兼顾性能与复杂度。此外,第一步插值对低通性能的要求最高,之后的插值要求就大为降低了。
在图表 1中提过,<A>的采样频率恰好是奈奎斯特频率,因此没有任何混叠(aliasing)失真。但是视频图像在有些高频区域(比如头发,密线条等)很容易就违背奈奎斯特采样而出现混叠失真。下面来一个混叠失真的实例:
图表 4:混叠失真
图表 5:混叠频域示意
当视频中出现这样的区域时,插值将受到很大的破坏。进而严重影响ME的效果,最终导致压缩性能的下降。前面说明了6-tap FIR是个低通性能相对较好的滤波器,但是低通性能好并不能抵抗混叠失真。这就是现有H.264中插值滤波器的最大问题。
至于如何解决混叠问题,一种思路就是用其他性能更好的滤波器替换6-tap FIR,比如Wiener滤波器等等。这里就不继续展开了。
1 插值与上采样
插值的过程从信号处理的角度其实就是一个上采样(提升空间采样频率)的过程。因此我们首先从信号处理的角度回顾一下上采样问题。下图为某一维信号上采样的例子:图表 1:上采样过程频域分析
<A>假设是原始信号的频谱图。注意数字信号的频谱是以2π为周期的,所以该信号的基本频率特性是低频(0附近)丰富,高频逐渐减小,直至±π处为0。此外这里还隐含了一个问题,就是该信号的原始采样频率恰好就是奈奎斯特频率(所以周期性的频谱恰好首尾相接),原始采样频率再低一点就要发生混叠了,这个将是第3节要着重考察的问题。
<A>-<D>描述的是2倍上采样的过程。事实上我们都知道,插值无非就是用一个N-tap的计算式得出一个值罢了(正如H.264的1/2像素插值)。但是在频率域分析的时候为了清楚起见,通常会将这个过程分成两个步骤:1.增加采样率(压缩频谱横轴);2.低通滤波。需要说明的是这样的两个步骤只是为了分析需要,它与直接一个N-tap插值是等价的!
<B>就是<A>增加采样率后的结果,从数学推导上这个过程对应的结果就是压缩横轴,可以想象把<A>的频谱从左右两个方向向中间挤压就得到了<B>。但是在<B>中高频部分其实是次生的频率(mirror frequency),因此我们需要一个低通滤波器把它滤掉,<C>就是这样一个理想的低通。最终得到了<D>,上采样结束。
对比<A>和<D>,其实不难理解。<A>是用奈奎斯特频率(假设是f)采得的信号,那么如果我用2f去采,理所当然频谱的间隔会大。
2 H.264的插值滤波器
我们知道H.264使用了两种插值滤波器:1/2像素精度插值时用6-tap FIR;1/4像素精度插值时用bilinear。本节讲为什么要采用这两种滤波器。首先要明白,这里的两种滤波器实质上对应的都是图表 1的<C>,也就是低通滤波器,只不过性能有区别而已。<C>的低通是理想的,即边缘完全是切下来的,过渡带宽度为0。而在实际中不可能做到理想,实际滤波器都会有一个过渡带。一般情况下,滤波器实现阶数越高越复杂,对理想性能的逼近越好。下图为一个概念性的示意图(现实情况远比此复杂):
图表 2:低通滤波器示意图
6-tap要比bilinear复杂,因此低通性能要好。也许有人会说那为什么不采用阶数更高的FIR而获取更好的低通滤波器呢?原因就是这样会给实现带来巨大的复杂性。JVT专家经过权衡计算,得出现有的6-tap滤波器低通性能是所有6-tap中最好的,并且6-tap的计算相对简单。
那么为什么1/4像素精度插值的时候,可以使用性能较差的bilinear滤波器就可以了呢?原因也很简单,如下图
图表 3:插值信号的频率示意
<A>-<B>的过程中,由于<A>的频谱基本上占据了整个频段,所以滤波的时候必须要理想低通,否则在高频处就会失真。因此要采用较好的低通滤波器。
而<B>-<C>的过程中,<B>并没有占据全部频段,高频部分都是空的,所以这里的低通就不用那么严格要求了。
总而言之,低通滤波器的选择要兼顾性能与复杂度。此外,第一步插值对低通性能的要求最高,之后的插值要求就大为降低了。
3 6-tap FIR的问题
至此,H.264的插值滤波器基本上说明清楚了。下面说一点高级的话题,关于6-tap滤波器存在的问题。留给有兴趣的人吧。在图表 1中提过,<A>的采样频率恰好是奈奎斯特频率,因此没有任何混叠(aliasing)失真。但是视频图像在有些高频区域(比如头发,密线条等)很容易就违背奈奎斯特采样而出现混叠失真。下面来一个混叠失真的实例:
图表 4:混叠失真
图表 5:混叠频域示意
当视频中出现这样的区域时,插值将受到很大的破坏。进而严重影响ME的效果,最终导致压缩性能的下降。前面说明了6-tap FIR是个低通性能相对较好的滤波器,但是低通性能好并不能抵抗混叠失真。这就是现有H.264中插值滤波器的最大问题。
至于如何解决混叠问题,一种思路就是用其他性能更好的滤波器替换6-tap FIR,比如Wiener滤波器等等。这里就不继续展开了。
相关文章推荐
- 关于在坐标系中旋转平移物体的理论基础解析
- 关于node 的学习(基础入门 - 理论知识点总汇)
- 关于古典密码的编制理论基础
- ABAP--关于SAP Control Framework(入门GUI编程的不错的基础介绍)
- camera理论基础和工作原理
- 关于java基础--StringBuffer的测试讲解
- 软件测试理论-基础2
- Java 权限框架 Shiro 实战一:理论基础
- 关于Linu型的一些基础常见操作命令(一)
- [原创] HTML 基础及应用 转帖 From http://guaren.blog.163.com/blog/static/53987788200861104652497/
- C语言基础:C语言指针(4) - 补充一点关于指针的小知识
- 关于一些基础的Java问题的解答(二)
- 关于模板匹配的基础知识
- 机器学习之基础理论相关了解
- 示波器基础系列之三:关于示波器的触发功能(上篇)
- 关于一些基础的Java问题的解答(三)
- 关于Android Fragment基础点(转)
- C#关于委托(基础)
- 关于java基础--管道流和压缩