4章:高速フーリエ変換プログラムのVBAソース

  1. 高速フーリエ変換プログラムのVBAソース
     高速フーリエ変換プログラムのVBAソースを以下に示します。
     なお、データ入力とデータ出力の部分も含まれています。

    'グローバル変数の定義
    Dim L As Integer 'n=2^L
    Dim n As Integer 'データ数
    Dim X(4100) As Double 'データ(実数部)
    Dim Y(4100) As Double 'データ(虚数部)

    Sub Main()
     Dim i, j, ns, L1, arg, arg2, i0, i1, m(4100), n1 As Integer
     Dim s, c, sc, X1, Y1, t, PI As Double

     PI = 3.14159265358979 '円周率を設定
      'データ入力
     L = Sheets("Sheet1").Cells(5, 2).Value
     f = Sheets("Sheet1").Cells(6, 2).Value
     n = 2 ^ L
     For i = 0 To n - 1 Step 1
      X(i) = Sheets("Sheet1").Cells(8 + i, 2).Value
      Y(i) = Sheets("Sheet1").Cells(8 + i, 3).Value
      m(i) = 0
     Next i
     'メインルーチン
     n1 = n / 2 'データ数の1/2
     ns = n / 2 '2進数の最上位の値
     sc = 2 * PI / n
     While ns >= 1 ' 2進数の最上位の値が1になるまで繰り返し
      For L1 = 0 To n - 1 Step 2 * ns 'L1の値を0からnまで、2×最上位の値のstepで繰り返し
       arg = m(L1) / 2 '回転子=前の回転子の値/2
       arg2 = arg + n1 '回転子2=回転子+データ数の1/2
       c = Cos(sc * arg)
       s = Sin(f * sc * arg)
       For i0 = L1 To (L1 + ns - 1) Step 1 'i0の値をL1の値からL1+2進数の最上位の値まで繰り返し
        i1 = i0 + ns 'i1=i0+2進数の最上位の値
        X1 = X(i1) * c - Y(i1) * s
        Y1 = Y(i1) * c + X(i1) * s
        X(i1) = X(i0) - X1
        Y(i1) = Y(i0) - Y1
        X(i0) = X(i0) + X1
        Y(i0) = Y(i0) + Y1
        m(i0) = arg 'm[i0]に回転子を保存
        m(i1) = arg2 'm[i1]に回転子2を保存
       Next i0
      Next L1
      ns = ns / 2 '2進数の最上位の値を繰り下げ
     Wend
     '正規化処理
     If f < 0 Then
      For i = 0 To n - 1 Step 1
       X(i) = X(i) / n
       Y(i) = Y(i) / n
      Next i
     End If
     'ビット反転処理
     For i = 0 To n - 1 Step 1
      If i < m(i) Then
       j = m(i)
        t = X(i): X(i) = X(j): X(j) = t
       t = Y(i): Y(i) = Y(j): Y(j) = t
      End If
     Next i
     'データ出力
     Sheets("Sheet1").Cells(5, 2).Value = L
     Sheets("Sheet1").Cells(6, 2).Value = -f
     For i = 0 To n - 1 Step 1
      Sheets("Sheet1").Cells(8 + i, 2).Value = X(i)
      Sheets("Sheet1").Cells(8 + i, 3).Value = Y(i)
     Next i
    End Sub


     メインの計算部分に関しては、C言語とVBAはかなり類似しています。
     しかし、VBAは入出力部分の記載が大幅に簡略化できます。



5章:高速フーリエ変換のVBAフリープログラムに行く。

トップページに戻る。