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

わんくま同盟

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

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

■91924 / 9階層)  C++からVBへの変換
□投稿者/ えんえん (10回)-(2019/08/10(Sat) 07:13:12)
ありがとうございます。


void fft(int n, double theta, double ar[], double ai[], 
        double tmpr[], double tmpi[])
{
    int radix, n_radix, j, m, r;
    double xr, xi, wr, wi;

    if (n <= 1) return;
    /* ---- factorization ---- */
    for (radix = 2; radix * radix <= n; radix++) {
        if (n % radix == 0) break;
    }
    if (n % radix != 0) radix = n;
    n_radix = n / radix;
    /* ---- butterflies ---- */
    for (j = 0; j < n_radix; j++) {
        for (m = 0; m < radix; m++) {
            xr = ar[j];
            xi = ai[j];
            for (r = n_radix; r < n; r += n_radix) {
                wr = cos(theta * m * r);
                wi = sin(theta * m * r);
                xr += wr * ar[r + j] - wi * ai[r + j];
                xi += wr * ai[r + j] + wi * ar[r + j];
            }
            wr = cos(theta * m * j);
            wi = sin(theta * m * j);
            tmpr[m * n_radix + j] = xr * wr - xi * wi;
            tmpi[m * n_radix + j] = xi * wr + xr * wi;
        }
    }
    for (r = 0; r < n; r += n_radix) {
        fft(n_radix, theta * radix, &tmpr[r], &tmpi[r], ar, ai);
    }
    for (j = 0; j < n_radix; j++) {
        for (m = 0; m < radix; m++) {
            ar[radix * j + m] = tmpr[n_radix * m + j];
            ai[radix * j + m] = tmpi[n_radix * m + j];
        }
    }
}


これを以下のように翻訳してみました。


    Public Sub one_D_FFT(ByRef xr#(), ByRef xi#())


        Dim n As Integer = xr.GetLength(0) - 1

        Dim theta = 2 * Math.PI / n

        Dim tmpr(n) As Double, tmpi(n) As Double

        Call fft(n, theta, xr, xi, tmpr, tmpi, 0)


    End Sub

    Private Sub fft(ByVal n%, ByVal theta#, ByRef ar#(), ByRef ai#(), ByRef tmpr#(), ByRef tmpi#(), ByVal r_st%)

        If n <= 1 Then Exit Sub

        Dim radix As Integer = 2
        Do While radix * radix <= n
            If n Mod radix = 0 Then Exit Do
            radix += 1
        Loop

        If n Mod radix <> 0 Then radix = n

        Dim n_radix As Integer = n \ radix

        For j As Integer = 0 To n_radix - 1

            For m As Integer = 0 To radix - 1

                Dim xr As Double = ar(r_st + j)
                Dim xi As Double = ai(r_st + j)

                For r As Integer = n_radix To n - 1 Step n_radix

                    Dim wr0 As Double = Math.Cos(theta * m * r)
                    Dim wi0 As Double = Math.Sin(theta * m * r)
                    xr += (wr0 * ar(r_st + r + j) - wi0 * ai(r_st + r + j))
                    xi += (wr0 * ai(r_st + r + j) + wi0 * ar(r_st + r + j))

                Next r


                Dim wr As Double = Math.Cos(theta * m * j)
                Dim wi As Double = Math.Sin(theta * m * j)
                tmpr(m * n_radix + j) = xr * wr - xi * wi
                tmpi(m * n_radix + j) = xi * wr + xr * wi

            Next m

        Next j

        For r As Integer = 0 To n - 1 Step n_radix

            fft(n_radix, theta * radix, tmpr, tmpi, ar, ai, r)

        Next r



        For j As Integer = 0 To n_radix - 1

            For m As Integer = 0 To radix - 1

                ar(r_st + radix * j + m) = tmpr(n_radix * m + j)
                ai(r_st + radix * j + m) = tmpi(n_radix * m + j)

            Next m

        Next j


    End Sub



しかし、むちゃくちゃな結果しか得られないのですが・・・・。
どこが間違っていますでしょうか?


編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[8]: C++からVBへの変換 /魔界の仮面弁士 →Re[10]: C++からVBへの変換 /魔界の仮面弁士
 
上記関連ツリー

C++からVBへの変換 / えんえん (19/08/08(Thu) 22:51) #91899
Re[1]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/08(Thu) 23:48) #91900
  └ Re[2]: C++からVBへの変換 / えんえん (19/08/09(Fri) 10:36) #91905
    └ Re[3]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/09(Fri) 12:18) #91906
      └ Re[4]: C++からVBへの変換 / えんえん (19/08/09(Fri) 12:28) #91907
        └ Re[5]: C++からVBへの変換 / Hongliang (19/08/09(Fri) 12:46) #91908
          └ Re[6]: C++からVBへの変換 / ぶなっぷ (19/08/09(Fri) 13:05) #91909
            └ Re[7]: C++からVBへの変換 / えんえん (19/08/09(Fri) 13:12) #91910
              ├ Re[8]: C++からVBへの変換 / Hongliang (19/08/09(Fri) 13:18) #91911
              │└ Re[9]: C++からVBへの変換 / えんえん (19/08/09(Fri) 13:23) #91912
              │  └ Re[10]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/09(Fri) 17:42) #91917
              └ Re[8]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/09(Fri) 13:54) #91913
                └ C++からVBへの変換 / えんえん (19/08/10(Sat) 07:13) #91924 ←Now
                  └ Re[10]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/10(Sat) 09:41) #91925
                    └ Re[11]: C++からVBへの変換 / えんえん (19/08/10(Sat) 10:16) #91927
                      └ Re[12]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/10(Sat) 14:19) #91930
                        └ Re[13]: C++からVBへの変換 / 774RR (19/08/10(Sat) 15:02) #91932
                          ├ Re[14]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/10(Sat) 16:23) #91933
                          │└ Re[15]: C++からVBへの変換 / えんえん (19/08/11(Sun) 21:42) #91934
                          │  └ Re[16]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/12(Mon) 12:05) #91938
                          │    ├ Re[17]: C++からVBへの変換 / えんえん (19/08/12(Mon) 14:12) #91939
                          │    │├ Re[18]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/12(Mon) 16:25) #91940
                          │    │├ Re[18]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/12(Mon) 17:33) #91942
                          │    │└ Re[18]: C++からVBへの変換 / 774RR (19/08/12(Mon) 16:56) #91941
                          │    └ Re[17]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/13(Tue) 01:00) #91946
                          └ Re[14]: C++からVBへの変換 / 魔界の仮面弁士 (19/08/12(Mon) 22:51) #91944
                            └ Re[15]: C++からVBへの変換 / えんえん (19/08/13(Tue) 11:01) #91947

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