尊重原创,请勿转载! 作者:图林根的烤肠
文章来源: http://www.mahong.me/archives/55
理论上来说,所有的传递函数都可以写成如下的形式:
H(z) = H(z)min · H(z)ap
其中H(z) 为我们需要的滤波器,H(z)ap 为全通滤波器(ap为All Pass缩写),H(z)min就是我们需要计算求出的最小相位滤波器。
为了得到最小的相位滤波器函数,具体的做法就是把H(z)min 这个滤波器的零点(英语为Zero,德语Nullstelle)放到单位圆(Unit Circle)里面。前面提到的零点通俗简单点说就是让H(z)min分数表达式分子等于零的解的位置。
下面来举个简单的例子:
上面的H1和H2就是两个滤波器函数
我们可以很容易的计算出H1的零点为-1/2(让2+1/z=0,求出z为-0.5),同理H2的零点为-2。
具体形象些我们使用matlab画出unit circle,并标出零点和极点,具体matlab命令请自行查阅,这里只给出代码,没有matlab的同学直接看下面的结果图示即可。
代码如下:
zplane([2,1],[2]) % H1
zplane([1,2],[2]) % H2
结果如下所示:左图为H1,右图为H2
我们可以清楚的看到,零点(图中空心圆圈)的位置H1(-0.5)位于圈内,H2(-2)位于圈外.
为了获得最小的相位变化,我们的做法是:把位于圈外的点镜像折叠到圈内,其做法是求Z模的倒数,这里的例子是,H2=-2在圈外我们求其模的倒数便是-0.5 (1/abs(2))具体说是是否正确,我们来看频响,使用matlab命令列出2个滤波器函数的频响图。
freqz([2,1],2); %Frequenzresponse for H1
freqz([1,2],2) %Frequenzresponse for H2
我们只看phase这个纵轴,H1(左图)的相位变化范围(0到-30度)明显要小于右图H2的相位变化范围(0到-200),所以说在保持频响(每一个图示的上图)相等的情况下,我们通过镜像变化零点得到了相位变化相对较小的滤波函数
总结:
最小相位滤波器的主要算法就是通过镜像变化滤波函数的零点来得到的,然后再卷积一个全通滤波器就是我们最后想要的滤波器。我们可以通过保持频响不变的情况来获得相位变化相对较小的滤波函数,它有一个显著的点:滤波器的延迟最小,如果你打算设计一个延迟很低的滤波器,那么最小相位滤波器是首选。
参考资料:
Minimum Phase Filters
Severin Ioan
Ilmenau University of Technology
P. O. Box 100565, D-98684 Ilmenau, Germany
Email: ioan.severin(at)tu-ilmenau.de