如何使用python对其海洋、气象数据进行带通滤波处理,得到我们想要的信号呢?
这里以scipy.signal.butter
滤波器为例,如何对于气象海洋数据做带通滤波处理进行简单讲解,库的官方说明文档链接如下:
主要实现过程如下所示:
b,a=scipy.signal.butter(N, Wn, btype='band', analog=False, output='ba', fs=None)
filter_result=signal.filtfilt(b, a, data)
里面主要需要关注的为:
- N:滤波器阶数
- Wn:频率 (这里我理解的就是你要滤出的时间天数)
- btype:滤波器类型,
lowpass, highpass, bandpass, bandstop
分别为高通,低通,带通、带阻,默认为低通
构造滤波器并传入相应参数后,一般会返回两个变量:a(分母系数)、b(分子系数)
,之后通过函数signal.filtfilt()
,传入相应变量、数据,就可以得到滤波后的数据了。
对于阶数N
来说,我的理解是一般不用设置太高,太高的话可能会滤掉过多的信号,我这里一般使用阶数:3、4
以上就是关于滤波的实现原理,下面主要讲解一下关于带通滤波的频率的理解,因为发现大部分的教程示例不适用于海洋、气象数据滤波的处理,没那么通俗易懂。
举个带通滤波的例子
假如想要通过滤波得到天气尺度3-10天
的信号,这儿肯定需要做带通滤波了,那么如何计算Wn
呢?
首先,先明白Wn
的计算公式,通过官网说明可以得到:
Wn=2*截止频率/采样频率
频率是什么呢,其实很简单,频率=1/周期
,可以理解为就是我们数据周期的倒数。
因为天气尺度的范围为3-10天,我们默认周期的单位为:1天
,以下基于周期为1天的前提进行计算:
相对于周期为一天来说,
- 假如你的数据是
daily
的,一天就一个,那么你的数据周期就是1,采样频率就等于1/1=1,还是1 - 假如你的数据是
一天四个时次
的,那么一个数据的周期就是0.25,那么采样频率就是1/0.25=4
截止频率是什么呢?与上面采样频率道理类似,还是以相对于周期为一天来说:
3天的截止频率就是1/3
,10天的截止频率就是1/10
所以对于3-10天的带通滤波,如果数据基于周期为一天的话,Wn=[2/10,2/3]
如果是30-60天的带通滤波,Wn=[2/60,2/30]
注意:对于数字滤波器,如果没有指定 fs,则将 Wn 单位标准化为0到1
,所以检验我们算的Wn
有没有错误,可以看他的范围是否符合要求。
这样下面的处理就比较简单了,传入需要滤波的数据即可了:
b, a = signal.butter(3, [2/10,2/3], 'bandpass',axis=time那一维)
filter_data = signal.filtfilt(b, a, origin_data)
低通和高通滤波比较简单这里就不再阐述了
以上是对于python对于海洋、气象数据进行带通滤波处理时的一些简单理解,水平有限,欢迎交流!
一个努力学习python的海气人
水平有限,欢迎指正!!!
欢迎评论、收藏、点赞、转发、关注。
关注我不后悔,记录学习进步的过程~~