1 基于Numpy.convolve實現(xiàn)滑動平均濾波
1.1 滑動平均概念
滑動平均濾波法 (又稱:遞推平均濾波法),它把連續(xù)取N個采樣值看成一個隊列 ,隊列的長度固定為N ,每次采樣到一個新數(shù)據(jù)放入隊尾,并扔掉原來隊首的一次數(shù)據(jù)(先進先出原則) 。把隊列中的N個數(shù)據(jù)進行算術(shù)平均運算,就可獲得新的濾波結(jié)果。
N值的選?。毫髁浚琋=12;壓力:N=4;液面,N=4 ~ 12;溫度,N=1~4
滑動平均的優(yōu)缺點:
優(yōu)點: 對周期性干擾有良好的抑制作用,平滑度高,適用于高頻振蕩的系統(tǒng)。
缺點: 靈敏度低,對偶然出現(xiàn)的脈沖性干擾的抑制作用較差,不易消除由于脈沖干擾所引起的采樣值偏差,不適用于脈沖干擾比較嚴重的場合,比較浪費RAM 。
1.2 滑動平均的數(shù)學原理
滑動平均濾波法計算類似一維卷積的工作原理,滑動平均的N就對應一維卷積核大小(長度)。 區(qū)別在于:
(1)步長會有些區(qū)別,滑動平均濾波法滑動步長為1,而一維卷積步長可以自定義;
(2)一維卷積的核參數(shù)是需要更新迭代的,而滑動平均濾波法核參數(shù)都是1。
我們應該怎么利用這個相似性呢?其實也很簡單,只需要把一維卷積核大小(長度)和N相等,步長設置為1,核參數(shù)都初始為1就可以了。由于一維卷積計算速度快,因此我們可以使用一維卷積來快速高效地實現(xiàn)這個功能。
滑動平均值是卷積數(shù)學運算的一個例子。對于滑動平均值,沿著輸入滑動窗口并計算窗口內(nèi)容的平均值。對于離散的1D信號,卷積是相同的,除了代替計算任意線性組合的平均值,即將每個元素乘以相應的系數(shù)并將結(jié)果相加。那些系數(shù),一個用于窗口中的每個位置,有時稱為卷積核?,F(xiàn)在,N值的算術(shù)平均值是( x1 + x2 + . . . + xN ) / N ,所以相應的內(nèi)核是( 1/N , 1/N , . . . , 1 / N ) ,這正是我們通過使用得到的np.ones((N,))/N。
1.3 語法
通過Numpy庫中的convolve()函數(shù)可以實現(xiàn)這些功能。
def np_move_avg(a,n,mode="same"):
return(np.convolve(a, np.ones((n,))/n, mode=mode))
Numpy.convolve函數(shù):(numpy.convolve函數(shù)官方文檔)
參數(shù)說明:
- a:(N,)輸入的第一個一維數(shù)組
- v:(M,)輸入的第二個一維數(shù)組
- mode:{‘full’, ‘valid’, ‘same’}參數(shù)可選,該參數(shù)指定np.convolve函數(shù)如何處理邊緣。
mode可能的三種取值情況:
full’ 默認值,返回每一個卷積值,長度是N+M-1,在卷積的邊緣處,信號不重疊,存在邊際效應。
‘same’ 返回的數(shù)組長度為max(M, N),邊際效應依舊存在。
‘valid’ 返回的數(shù)組長度為max(M,N)-min(M,N)+1,此時返回的是完全重疊的點。邊緣的點無效。
和一維卷積參數(shù)類似,a就是被卷積數(shù)據(jù),v是卷積核大小。
1.4 滑動平均濾波示例
np.convolve函數(shù)中通過mode參數(shù)指定如何處理邊緣。
下面是一個說明模式不同取值之間差異的圖:
import numpy as np
import matplotlib.pyplot as plt
def np_move_avg(a,n,mode="same"):
return(np.convolve(a, np.ones((n,))/n, mode=mode))
modes = ['full', 'same', 'valid']
for m in modes:
plt.plot(np_move_avg(np.ones((200,)), 50, mode=m))
plt.axis([-10, 251, -.1, 1.1])
plt.legend(modes, loc='lower center')
plt.show()
參考鏈接:
[開發(fā)技巧]·Python極簡實現(xiàn)滑動平均濾波(基于Numpy.convolve)
numpy中的convolve的理解
典型范例:
# 實現(xiàn)數(shù)據(jù)可視化中的數(shù)據(jù)平滑
import numpy as np
import matplotlib.pylab as plt
'''
其它的一些知識點:
raise:當程序發(fā)生錯誤,python將自動引發(fā)異常,也可以通過raise顯示的引發(fā)異常
一旦執(zhí)行了raise語句,raise語句后面的語句將不能執(zhí)行
'''
def moving_average(interval, windowsize):
window = np.ones(int(windowsize)) / float(windowsize)
re = np.convolve(interval, window, 'same')
return re
def LabberRing():
t = np.linspace(-4, 4, 100) # np.linspace 等差數(shù)列,從-4到4生成100個數(shù)
print('t=', t)
# np.random.randn 標準正態(tài)分布的隨機數(shù),np.random.rand 隨機樣本數(shù)值
y = np.sin(t) + np.random.randn(len(t)) * 0.1 # 標準正態(tài)分布中返回1個,或者多個樣本值
print('y=', y)
plt.plot(t, y, 'k') # plot(橫坐標,縱坐標, 顏色)
y_av = moving_average(y, 10)
plt.plot(t, y_av, 'b')
plt.xlabel('Time')
plt.ylabel('Value')
# plt.grid()網(wǎng)格線設置
plt.grid(True)
plt.show()
return
LabberRing() # 調(diào)用函數(shù)
2 曲線平滑處理——Savitzky-Golay 濾波器——詳解
曲線平滑處理——Savitzky-Golay 濾波器——詳解
3 基于Numpy.convolve實現(xiàn)滑動平均濾波——詳解
插值法對折線平滑處理——詳解文章來源:http://www.zghlxwxcb.cn/news/detail-493807.html
基于Numpy.convolve實現(xiàn)滑動平均濾波——詳解文章來源地址http://www.zghlxwxcb.cn/news/detail-493807.html
到了這里,關(guān)于python 數(shù)據(jù)、曲線平滑處理——基于Numpy.convolve實現(xiàn)滑動平均濾波——詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!