C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■102944 / 親階層)  Savitzky-Golayフィルターについて
□投稿者/ みか (13回)-(2024/02/07(Wed) 23:32:12)

分類:[VB.NET/VB2005 以降] 

懲りずにすみません。
もう一度「Savitzky-Golayフィルター」と思われるのを作ってみました。
実際のデータで試しもしたのですが、それらしい結果となっていました。
でも最初の2つと最後の2つだけは異常な数値となってしまいます。

結果
result(0) は -1.397782
result(1) は -0.4681684 
result(2) は 2
  < 中略>
result(98) は 98
result(99) は 100.46817 
result(100)は 101.397781
------------------------------------------------------
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'データの作成
        Dim da(0 To 100) As Single
        For i = 0 To 100
            da(i) = i
        Next i

        '
        Dim N As Integer = 5  '窓幅を5
        Dim M As Integer = 3  '次数を3
        Dim result() As Single
        result = SGFilter(da, N, M)
        Stop
    End Sub

    'Savitzky-Golayフィルター  
    Private Function SGFilter(ByVal data() As Single, ByVal windowSize As Integer, ByVal polyOrder As Integer) As Single()
        Dim filteredData(data.Length - 1) As Single
        Dim halfWindowSize As Integer = windowSize \ 2
        For i As Integer = 0 To data.Length - 1
            Dim sum As Double = 0
            Dim weightSum As Double = 0
            For j As Integer = -halfWindowSize To halfWindowSize
                Dim index As Integer = i + j
                If index >= 0 AndAlso index < data.Length Then
                    Dim weight As Double = GetSGWeight(j, windowSize, polyOrder)
                    sum += data(index) * weight
                    weightSum += weight
                End If
            Next
            filteredData(i) = CSng(sum / weightSum)
        Next
        Return filteredData
    End Function

    Private Function GetSGWeight(ByVal x As Integer, ByVal windowSize As Integer, ByVal polyOrder As Integer) As Double
        Dim k As Integer = Math.Abs(x)
        Dim numerator As Double = 0
        Dim denominator As Double = 0
        For m As Integer = 0 To polyOrder
            numerator += (2 * m + 1) * Math.Pow(-1, m) * Binomial(polyOrder, m) * Binomial(polyOrder + m, m) * Math.Pow(k, m)
            denominator += Binomial(windowSize - 1, m) * Binomial(2 * polyOrder + 1, m) * Math.Pow(k, m)
        Next
        Return numerator / denominator
    End Function

    Private Function Binomial(ByVal n As Integer, ByVal k As Integer) As Double
        If k = 0 Then
            Return 1
        End If
        Dim result As Double = 1
        For i As Integer = 1 To k
            result *= (n - i + 1) / i
        Next
        Return result
    End Function



編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
親記事 →Re[1]: Savitzky-Golayフィルターについて /WebSurfer
→Re[1]: Savitzky-Golayフィルターについて /kiku
 
上記関連ツリー

Savitzky-Golayフィルターについて / みか (24/02/07(Wed) 23:32) #102944 ←Now
Re[1]: Savitzky-Golayフィルターについて / WebSurfer (24/02/08(Thu) 09:20) #102947
│└ Re[2]: Savitzky-Golayフィルターについて / みか (24/02/08(Thu) 19:02) #102955
│  └ Re[3]: Savitzky-Golayフィルターについて / WebSurfer (24/02/09(Fri) 09:44) #102957
│    └ Re[4]: Savitzky-Golayフィルターについて / みか (24/02/10(Sat) 13:37) #102959 解決済み
Re[1]: Savitzky-Golayフィルターについて / kiku (24/02/08(Thu) 09:31) #102948
  └ Re[2]: Savitzky-Golayフィルターについて / みか (24/02/10(Sat) 13:32) #102958 解決済み

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信