在對數(shù)字序列進行濾波的過程中踊沸,我們發(fā)現(xiàn)對某些序列濾波后扔役,在首端和尾端出現(xiàn)異常值(主要為異常大值)。具體的原因我還不是很清楚卫病,期待得到數(shù)學(xué)解釋油啤。
消除上述問題的一個途徑是在濾波之前給序列加窗函數(shù)。窗函數(shù)當(dāng)然有很多了蟀苛,Hanning窗益咬,Hamming窗,Dolph-Chebyshev窗帜平,Gaussing窗等幽告,各個窗函數(shù)的優(yōu)點與缺點需要根據(jù)實際處理需求才便于評價。下面就Hanning窗為例裆甩,對序列加窗函數(shù)及濾波進行說明冗锁。
- 根據(jù)序列長度(采樣點數(shù)),計算得到窗函數(shù)序列嗤栓。假設(shè)我們有一個序列
data
冻河,長度為N
,那么我們需要生成一個長度為N*leng_rate
的窗函數(shù)茉帅。為什么不生成長度為N的窗函數(shù)呢芋绸?因為使用一個完整的窗函數(shù)來乘以原始序列會改變原始序列的全部振幅,實際上我們的目的是在序列(或信號)的兩端各加一個衰減的窗担敌。
from scipy import signal
import numpy as np
# === PARA ====
length_rate = 0.1;
dt = 0.01;# sample rate
# ==============
mywin = np.ones((N,));
lenwinhalf = int(N*length_rate);
lenwin = int(lenwinhalf*2);
han_window = signal.hanning(lenwin);
mywin[0:lenwinhalf] = han_window[0:lenwinhalf];
mywin[N-lenwinhalf:N] = han_window[lenwinhalf:lenwin];
- 對原始序列加窗函數(shù)摔敛。
data = np.multiply(han_window,data);
- 制作Butter帶通濾波器,濾波頻帶為拐角頻率下界(
freq_lowcut
)全封,拐角頻率上界(freq_highcut
)
nyquest = 0.5*(1/dt);
digilow = freq_lowcut/nyquest;
digihigh = freq_highcut/nyquest;
[b, a] = signal.butter(4, (digilow,digihigh), btype='bandpass');
- 對原始序列進行帶通濾波
data_filt = signal.filtfilt(b,a,data,axis=0);