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

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

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

Savitzky-Golayフィルターについて

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■102944 / inTopicNo.1)  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



引用返信 編集キー/
■102947 / inTopicNo.2)  Re[1]: Savitzky-Golayフィルターについて
□投稿者/ WebSurfer (2887回)-(2024/02/08(Thu) 09:20:47)
No102944 (みか さん) に返信

> もう一度「Savitzky-Golayフィルター」と思われるのを作ってみました。

どうしても自力でコードを書いて作りたいということでなければ、ライブラリを探して
使ってみるという選択肢はありませんか?
引用返信 編集キー/
■102948 / inTopicNo.3)  Re[1]: Savitzky-Golayフィルターについて
□投稿者/ kiku (413回)-(2024/02/08(Thu) 09:31:07)
No102944 (みか さん) に返信
> 懲りずにすみません。
> もう一度「Savitzky-Golayフィルター」と思われるのを作ってみました。
> 実際のデータで試しもしたのですが、それらしい結果となっていました。
> でも最初の2つと最後の2つだけは異常な数値となってしまいます。
下記が疑問に思いました。(回答する必要はないです)
・どのように検証したのでしょうか?
・なんとなく数値を眺めておかしいなと思ったということでしょうか?
・だとすると、異常な数値と思っていても計算結果としては正しいということもあるのでは?

> If index >= 0 AndAlso index < data.Length Then
上記の部分ですが、
0以上、data.Length以下であり、
イコールが抜けているのではないでしょうか?

それ以外の部分は、計算式が提示されれば、
計算式=プログラムとなっていることを
検証することは可能と思います。

引用返信 編集キー/
■102955 / inTopicNo.4)  Re[2]: Savitzky-Golayフィルターについて
□投稿者/ みか (14回)-(2024/02/08(Thu) 19:02:56)
No102947 (WebSurfer さん) に返信

> どうしても自力でコードを書いて作りたいということでなければ、ライブラリを探して
> 使ってみるという選択肢はありませんか?

VBにもあるのでしょうか?
Pythonにはあるようです。

引用返信 編集キー/
■102957 / inTopicNo.5)  Re[3]: Savitzky-Golayフィルターについて
□投稿者/ WebSurfer (2888回)-(2024/02/09(Fri) 09:44:33)
No102955 (みか さん) に返信

> VBにもあるのでしょうか?

出来合いの .NET のライブラリがあれば、その開発言語が VB.NET である必要はありません。

「Savitzky Golay .net library」をキーワードにググって調べただけですが、いろいろヒット
します。NuGet でも提供されているようです。ご自分で調べて目的に合いそうなものを探して
みてはいかがでしょう?
引用返信 編集キー/
■102958 / inTopicNo.6)  Re[2]: Savitzky-Golayフィルターについて
□投稿者/ みか (15回)-(2024/02/10(Sat) 13:32:30)
No102948 (kiku さん) に返信

> 0以上、data.Length以下であり、
> イコールが抜けているのではないでしょうか?

> それ以外の部分は、計算式が提示されれば、
> 計算式=プログラムとなっていることを
> 検証することは可能と思います。
それも試したのですがエラーが出てしまいますし、計算式も今は曖昧にもなってしまっています。
これ以上はご迷惑はお掛けできませんので解決済みとさせていただきます。
すみませんでした。
解決済み
引用返信 編集キー/
■102959 / inTopicNo.7)  Re[4]: Savitzky-Golayフィルターについて
□投稿者/ みか (16回)-(2024/02/10(Sat) 13:37:13)
No102957 (WebSurfer さん) に返信

> 出来合いの .NET のライブラリがあれば、その開発言語が VB.NET である必要はありません。
>
> 「Savitzky Golay .net library」をキーワードにググって調べただけですが、いろいろヒット
> します。NuGet でも提供されているようです。ご自分で調べて目的に合いそうなものを探して
> みてはいかがでしょう?

見てはいるのですが難し過ぎです。
でも、これ以上はご迷惑はお掛けできませんので解決済みとさせていただきます。
すみませんでした。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ