當然,有許多其他平滑演算法,可以用於訊號處理和資料平滑。高斯濾波(Gaussian Filter)是其中一種非常流行的方法,此外還有中值濾波(Median Filter)等。下面是一些相關演算法的介紹和示例程式碼。
1. 高斯濾波(Gaussian Filter)
高斯濾波是一種線性平滑濾波器,使用高斯分佈的權重進行加權平均。它能夠有效地平滑資料,同時保留邊緣資訊。
import numpy as np
from scipy.ndimage import gaussian_filter1d
# 示例資料,假設從硬體裝置採集的資料
data = np.array([10, 12, 15, 14, 13, 16, 18, 20, 21, 19, 17, 15])
# 應用高斯濾波
sigma = 1 # 高斯分佈的標準差
smoothed_data = gaussian_filter1d(data, sigma)
print("原始資料: ", data)
print("平滑後資料: ", smoothed_data)
2. 中值濾波(Median Filter)
中值濾波是一種非線性濾波器,使用視窗內的中值代替中心值。它對去除脈衝噪聲非常有效。
import numpy as np
from scipy.ndimage import median_filter
# 示例資料,假設從硬體裝置採集的資料
data = np.array([10, 12, 15, 14, 13, 16, 18, 20, 21, 19, 17, 15])
# 應用中值濾波
size = 3 # 濾波視窗的大小
smoothed_data = median_filter(data, size)
print("原始資料: ", data)
print("平滑後資料: ", smoothed_data)
3. Savitzky-Golay 濾波器(Savitzky-Golay Filter)
Savitzky-Golay 濾波器透過多項式擬合進行平滑,適用於保留訊號的高階導數資訊。
import numpy as np
from scipy.signal import savgol_filter
# 示例資料,假設從硬體裝置採集的資料
data = np.array([10, 12, 15, 14, 13, 16, 18, 20, 21, 19, 17, 15])
# 應用 Savitzky-Golay 濾波器
window_size = 5 # 滑動視窗大小
poly_order = 2 # 多項式階數
smoothed_data = savgol_filter(data, window_size, poly_order)
print("原始資料: ", data)
print("平滑後資料: ", smoothed_data)
4. 洛倫茲濾波(Lowess Filter)
洛倫茲濾波是一種區域性加權迴歸方法,適用於平滑資料並保留區域性趨勢。
import numpy as np
import statsmodels.api as sm
# 示例資料,假設從硬體裝置採集的資料
data = np.array([10, 12, 15, 14, 13, 16, 18, 20, 21, 19, 17, 15])
# 應用 Lowess 濾波
fraction = 0.3 # 使用的資料點比例
smoothed_data = sm.nonparametric.lowess(data, np.arange(len(data)), frac=fraction)[:, 1]
print("原始資料: ", data)
print("平滑後資料: ", smoothed_data)
比較這些演算法
- 高斯濾波:適用於平滑噪聲,同時保留邊緣資訊,適合於多種訊號處理任務。
- 中值濾波:特別適合於去除脈衝噪聲,對訊號中的孤立異常值非常有效。
- Savitzky-Golay 濾波器:適用於需要保留訊號高階導數資訊的場景,能夠更好地保留資料的細節。
- 洛倫茲濾波:適用於保留資料的區域性趨勢,尤其是非線性資料的平滑。
這些演算法各有優缺點,可以根據具體的應用場景選擇合適的平滑方法。