Savitzky-Golay 濾波器


python 數據、曲線平滑處理——Savitzky-Golay 濾波器

Savitzky-Golay 濾波器
關於Savitzky-Golay 濾波器,可以在scipy里看到關於這個函數的定義:
https://docs.scipy.org/doc/scipy/reference/generated/scipy.signal.savgol_filter.html

Savitzky-Golay平滑濾波是光譜預處理中常用濾波方法,它的核心思想是對一定長度窗口內的數據點進行k階多項式擬合,從而得到擬合后的結果。對它進行離散化處理后后,S-G 濾波其實是一種移動窗口的加權平均算法,但是其加權系數不是簡單的常數窗口,而是通過在滑動窗口內對給定高階多項式的最小二乘擬合得出。

Savitzky-Golay平滑濾波被廣泛地運用於數據流平滑除噪,是一種在時域內基於局域多項式最小二乘法擬合的濾波方法。這種濾波器最大的特點在於在濾除噪聲的同時可以確保信號的形狀、寬度不變。

使用平滑濾波器對信號濾波時,實際上是擬合了信號中的低頻成分,而將高頻成分平滑出去了。如果噪聲在高頻端,那么濾波的結果就是去除了噪聲,反之,若噪聲在低頻段,那么濾波的結果就是留下了噪聲。

總之,平滑濾波是光譜分析中常用的預處理方法之一。用Savitzky-Golay方法進行平滑濾波,可以提高光譜的平滑性,並降低噪音的干擾。S-G平滑濾波的效果,隨着選取窗寬不同而不同,可以滿足多種不同場合的需求。

代碼實現
1.python中Savitzky-Golay濾波器調用如下:

tmp_smooth = scipy.signal.savgol_filter(tmp,53,3)

2.python中Savitzky-Golay濾波器調用如下:

y_smooth = scipy.signal.savgol_filter(y,53,3)  
# 亦或
y_smooth2 = savgol_filter(y, 99, 1, mode= 'nearest')

# 備注:
y:代表曲線點坐標(x,y)中的y值數組
window_length:窗口長度,該值需為正奇整數。例如:此處取值53
k值:polyorder為對窗口內的數據點進行k階多項式擬合,k的值需要小於window_length。例如:此處取值3
mode:確定了要應用濾波器的填充信號的擴展類型。(This determines the type of extension to use for the padded signal to which t

調參規律:

現在看一下window_length和k這兩個值對曲線的影響。

(1)window_length對曲線的平滑作用: window_length的值越小,曲線越貼近真實曲線;window_length值越大,平滑效果越厲害(備注:該值必須為正奇整數)。

(2)k值對曲線的平滑作用: k值越大,曲線越貼近真實曲線;k值越小,曲線平滑越厲害。另外,當k值較大時,受窗口長度限制,擬合會出現問題,高頻曲線會變成直線。
典型范例:

# 用於生成問題描述中示例曲線的代碼如下:
import numpy as np

Size = 100
x = np.linspace(1, Size,Size)

data = np.random.randint(1, Size, Size)
print(data)

array([33, 19,  2, 56, 11, 38,  3, 45,  4, 20, 59,  3, 71, 94, 85, 23, 93,
       65, 23, 99, 38, 43, 41, 96, 46, 56, 79,  1, 38, 90, 97, 88,  2, 72,
       25, 51, 70, 42,  4, 86, 26, 44, 40, 49,  5, 37, 10, 99, 40, 88, 34,
       99, 26,  6, 20, 37, 22, 88, 13, 68, 54, 95, 15,  4, 58, 20, 51, 89,
       81,  1, 41, 21, 17, 52, 84, 46, 76, 44, 90, 72, 96, 32, 12, 50, 81,
       64, 67, 99, 42, 35, 70, 79, 21, 51, 56, 10, 23, 21, 25, 64])

# 可視化圖線
plt.plot(x, data)

# 使用Savitzky-Golay 濾波器后得到平滑圖線
from scipy.signal import savgol_filter

y = savgol_filter(data, 5, 3, mode= 'nearest')
# 可視化圖線
plt.plot(x, y, 'b', label = 'savgol')


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM