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

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

不信邪的继续找,也许真有实时零相位滤波的方法呢。。。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,据说找到什么关系,把当前点的相移给估计出来,然后又怎么给补回去了。但是被打击之后,为啥感觉不靠谱捏。。你不能糊弄自然母亲,这句话一定对。

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


  • 23
    点赞
  • 52
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
MATLAB中的相位滤波可以使用filtfilt函数来实现。该函数的原理是先对信号进行前向滤波,然后将滤波后的序列逆序,再次使用相同的滤波器进行反向滤波,最后再次逆序得到最终结果。这样可以实现相移的滤波效果。然而,filtfilt函数只适用于离线滤波,无法在实时信号中实现相移滤波。 如果想在实时信号中实现相移滤波,可以采用其他方法。例如,可以设计一个全通滤波器,其group delay与待滤波信号的group delay完全相反,然后将两个滤波器级联。这样,两者的group delay将相互抵消,从而实现了相移滤波效果。这种方法可以通过参考一篇CSDN博客文章中的内容进行实现,链接为:http://blog.csdn.net/shenziheng1/article/details/53415642。 另外,如果使用MATLAB进行相位滤波,可以使用filtfilt函数,该函数可以在一次运行中实现前向和反向滤波,并得到相位滤波的结果。代码示例可以参考引用中的MATLAB代码。 总结来说,MATLAB中的相位滤波可以使用filtfilt函数实现,也可以通过设计全通滤波器进行级联来实现。具体选择哪种方法取决于应用的需求和实际情况。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [实时相位滤波神话(1)](https://blog.csdn.net/csdn_kike/article/details/69056066)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [MATLAB函数:filtfilt——相位数字滤波](https://blog.csdn.net/WandZ123/article/details/125915042)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [实时相位滤波神话(2)](https://blog.csdn.net/csdn_kike/article/details/69061673)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值