- 积分
- 1223
- 贡献
-
- 精华
- 在线时间
- 小时
- 注册时间
- 2018-6-17
- 最后登录
- 1970-1-1
|
登录后查看更多精彩内容~
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
本帖最后由 小懒C 于 2020-11-14 20:46 编辑
最近被滤波纠缠,因为发现ncl自带的butterworth滤波最后结果会趋向于0,汇报的时候被老师问这个数据最后怎么会没波呢??于是就搞了一下butterworth滤波,因为butterworth滤波官方解释是不丢失数据的,但趋向于0这个完全就是表示后面数据可能不可用。程序在最后
我用到的资料:1.http://bbs.06climate.com/forum.php?mod=viewthread&tid=58216&highlight=butter的文献以及《气候变率诊断与预测方法》
2.李建平教授的Fortran文件(程序基于上面所提到的文献) 其他reference:http://www.seismosoc.org/Publications/BSSA_html/bssa_96-2/05055-esupp/(ncl基于此)
以下以《气候变率诊断与预测方法》p208的例子进行讨论:
对于ncl滤波尾部数据趋于0,ncl-talk有人给出了解决方法:I talked with one of the professors in my department who knows quite a bit about numerical methods, and he suggested padding the end of the series with 1.5*(order of filter/fca) zeros. https://mailman.ucar.edu/pipermail/ncl-talk/2015-June/003008.html 按照这个我试了一下,尽管尾部数据有改善,但产生了大相位偏差(图1最左侧,应该0的时候振幅最大),同时末端也存在相位误差(最末端按照书上应该看得见一个波谷)
于是我试了试,在数据最左侧增加1.5*(order of filter/fca) 个最开始的数据,后方加上1.5*(order of filter/fca) 个最末端数据,使用2阶的BW程序,于此同时我也将李建平的程序翻译成了ncl语言,结果如图2,两个数据之间存在较小的振幅与相位差,需要注意的是李建平老师的程序是没有数据丢失的,而ncl画图时没要padding进去的数据,如果采用ncl的其他阶数的bw程序,和李建平老师的进行对比可以发现2阶差距最小。
从理论来看,不好意思,我看不懂,找不到理论联系,但我还是在文献最后找到了一句话:This procedure results in zero phase shift for all frequency。也就是从理论上来讲李建平教授程序那一套方法是没有位相误差的。如果把书上p208的结果当做滤波后的真实情况的话,李老师的程序与ncl自带程序padding后取2阶BW是最接近该波形的。
附:matlab的butter函数与这个ncl子函数对比(本来目的是对数据大小进行检验,就那样吧,懒得动它了)
总结:1.ncl的滤波个人觉得是丢失数据的,在此建议假如你要夏季数据的话,扔进滤波器的数据你得取5-9月或全年滤波
2.李老师的程序在理论上是没有相位误差的,个人觉得是非常适合资料较短的数据的
3.ncl与李老师Fortran版之间的结果是存在0.01数量级的误差的,个人站Fortran精度更好,但从结果来看,滤波后数据数量级在1,影响应该较小
最后给程序,各位可以看看改进
;================== 更新 =========================
这个函数放在do循环里时要注意,必须在do循环里面对fca、fcb进行赋值
试了一下发现,ncl子函数可能和Fortran的子函数一致,函数虚参的改变会返回至相应变量(就是说子函数里fca数据变化,返回来fca也变了)
来自群组: 南气院校友总会 |
-
图1 padding with 0
-
图2
-
图3 1阶
-
图4 6阶
-
matlab butter函数与ncl的对比
-
-
butterworth.ncl
963 Bytes, 下载次数: 94, 下载积分: 金钱 -5
butterworth子函数
-
-
Butexp.ncl
2.32 KB, 下载次数: 51, 下载积分: 金钱 -5
测试
|