close

最小二乘一階導數處理過的資料和原資料差距很大,主要是要將原本波峰波谷不明顯幾乎重疊的資料,處理成波峰波谷明顯分開的資料,方便後續的分析計算

 

為了方便應用在其他程式,把計算公式寫成SubVI,而SubVI程式的基本要求是可選擇每次要擬合計算的資料筆數

 

 

計算要用到的係數直接取用已計算好的資料(如下圖)


其中Ck,j值以中央的0為中心,上下係數相同但正負號相反,在程式內Ck,j值資料只要做單邊即可

20100624-01  

 

 

整個最小二乘一階導數公式改寫如下:


(Y(i+1)*R(1)+...+Y(i+n)*R(n)+Y(i-1)*-R(1)+...+Y(i-n)*-R(n))/Nk


Y是來源資料,R是計算係數中的Ck,j值,Nk是計算係數中的Nk值,n是擬合的點數除2去尾曲整數


公式要這樣改寫是方便LabVIEW程式書寫

 

 

 

SubVI程式的面板配置如下:

20090131-05  

 

2個輸入端:1個是要擬合的資料輸入陣列,另1個是Menu Ring元件作成的擬合點數選單


1個輸出端:使用Waveform Graph元件顯示擬合處理後的資料圖形

 

 

 

再來是程式書寫部份:


首先是把計算係數中的Ck,j值資料作成2D陣列(如下圖):

20100624-02  

 

再來是把計算係數中的Nk值資料作成1D陣列(如下圖):

20100624-03  

 

接著是把擬合點數(5,9,11,...,15,17)數值做成1D陣列(如下圖):

20100624-04  

 

 

寫好的程式如下:

20100624-05  

 

程式分為兩個部份:左半邊是擬合計算所用到的數值,右半邊則是實際擬合計算的部份

 

 

左半邊程式部份:

20100624-06  

 

1.先用Menu Ring元件輸出的數值從擬合點數列表的1D陣列中取出擬合點數的數值,同樣以Menu Ring元件輸出的數值從Ck,j值資料的2D陣列中取出對應的1D數值陣列,和從Nk值資料的1D陣列中取出對應的Nk值


2.把數值來源的資料輸入陣列用Array Size元件求得所有資料數量,再減去擬合點數的數值,若小於0則右半邊程式切換到錯誤訊息程式,並顯示資料不足無法處理的對話方塊。若大於0則右半邊程式執行資料擬合計算

 

 

右半邊程式部份:

20100624-07  

 

1.最外圍用Case Structure元件來判定資料輸入數量是否正確,錯誤則切換到錯誤訊息程式,並顯示資料不足無法處理的對話方塊。正確則執行資料擬合計算

 

2.資料擬合計算使用窗口移位法,每次只從資料輸入陣列中取出擬合點數的數值同樣多的資料進行計算

 

3.使用2個For Loop迴圈,外迴圈執行次數設定為資料輸入陣列減去擬合點數的數值,也就是全部資料的有效計算範圍。內迴圈執行次數設定為n值,也就是擬合計算有重複的部份

 

4.內外迴圈分別把來源資料乘上對應的Ck,j值,再把乘好的數值全部相加除以Nk值。擬合計算後的資料會減少擬合點數數值減1的數量

 

 

 

以下為寫好的SubVI程式執行結果:

 

 

來源資料

20100624-08  

 

 

5點擬合計算

20100624-09  

 

 

9點擬合計算

20100624-10  

 

 

17點擬合計算

20100624-11  

 

 

要兼顧程式執行的結果和效率,擬合的點數建議設定在5~11之間

arrow
arrow
    創作者介紹
    創作者 未出師的小工程師 的頭像
    未出師的小工程師

    LabVIEW & PLC還未出師的小工程師部落格

    未出師的小工程師 發表在 痞客邦 留言(0) 人氣()