实时零相位滤波的神话(2)

    xiaoxiao2021-03-25  157

    第二次寻找零相位滤波的历程。这里记录下来更多是为 了学习。

    不信邪的继续找,也许真有实时零相位滤波的方法呢。。。google搜索n久,发现了一篇光芒万丈的文章:来自IEEE的成员 SR powell &Paul M.Chau的《A Technique for Realizing Linear Phase IIR Filters》,我发现有好多文章都引用了这个文章。文章提出:a noncausal filter with zero phase can be realized using a combination of multipass filtering and time reversal。说的多好,通过多通道滤波和时间逆序操作,就可以实现非因果0相位滤波器。这篇文章有太多值得我学习了:

    (1)因果,非因果和反因果的概念。反因果(anti-causal)的概念是,滤波输出完全依靠未来的信号;非因果(non causal)滤波器的输出依靠过去,现在,和未来的信号;因果滤波器就很熟悉了,输出依靠过去和当前信号。

    (2)一个iir结构滤波器可以做成线性相位的条件:a,冲击响应为有限长度或b,寻找一种策略,将iir的无限长度冲击响应序列截断,形成有限长度。iir滤波器的冲击响应显然不是有限长度。于是文章采用的策略就是,直接截断iir的冲击响应序列,满足了可以形成线性相位的条件。整个非因果滤波器的结构如下:

    这个结构让我费了很大的力气去研究,到后来终于明白了,和某个论坛上的一个大牛说的一样:这只不过是把信号分成固定长度的block,然后每块独立进行matlab函数filtfilt的操作而已。两次time reverse对应于两次序列逆转,anti-causal的滤波就是对逆序的序列进行backward滤波,最后的causal部分,这是对序列进行forward滤波。滤波效果嘛,稍后再说。

           (3)著名的overlap-add和overlap-save方法。当初学信号的卷积时大概不用心,竟然对此一点印象都没有。。看了蛮多资料,终于明白了实现方式以及其作用,简单来说对于较短的序列,没必要做这个,因为卷积时间不长;但是对于长的序列,就有必要了,卷积可以首先做fft,然后再逆变换回来,总之,序列越长,这个方法运算效率越高。

    很多地方,都让我大为诧异:原来可以这么干!!iir序列截断,整成fir??还有非因果滤波器还可以实时实现?。。。都是对以往概念的大颠覆啊,以前总觉得被各种条条框框限的死死的,可是我忘了,信号处理是数学,就可以---------逼近。于是,各种怪物般的玩意都来了,然后是各种黑魔法一般的神奇效果。比如,绝对不是线性相位的iir随时可以做成线性相位。

    惊异完了,佩服完了,学习完了,然后来看看,神奇的非因果零相位滤波器的效果如何了。那还用说,IEEE的绝顶大牛都说可以实现零相位滤波,按照思路来还不立马搞定,滤波完成我一看-------------呸!!!还tm是线性相位,就是输出信号还是比输入延迟n个samples!!!!!!!!!!!!!!!!!我去。。。

    又是一番昏天暗地的搜索查证,最后,万念俱灰的承认:我没理解错,系统的实现是对的,效果是对的,确实有延迟。但是,这些大牛的意思是,我实现的non-causal滤波器是零相移,只是因为timereverse 过程中需要的block操作需要延迟,这叫‘calculation delay’,不是‘phase delay’。你说你玩这些概念有毛意思,让我赌上全部的信心。。终于相信了早就搜索到的某个论坛上几个老外说的话了:

    要想实现零相位,需要两个步骤:(1)move to another universe;(2)enjoy!!

    零相位意味着你可以预见未来,如果可以,你就能在股市搞到一屋子的钱了,而不是在这里苦逼地折腾狗屎的dsp----这是另一个老外说的。

    第三个老外说:你不可能去糊弄自然母亲。

    呵呵。。。

    同时找到的有某些文章,有一个说用fir来实现零相位的,看看,原来是过采样数据,然后线性相位fir滤波,再将滤波结果降采样输出。总之,滤波器还是要知道未来的信号。有一篇文章比较niubi,据说找到什么关系,把当前点的相移给估计出来,然后又怎么给补回去了。但是被打击之后,为啥感觉不靠谱捏。。你不能糊弄自然母亲,这句话一定对。

    虽然是失败的经历,但必须承认,很多东西是我没接触过但值得深入研究的,有时间我会继续下去。

    转载请注明原文地址: https://ju.6miu.com/read-1852.html

    最新回复(0)