4章:高速フーリエ変換プログラムのVBAソース
- 高速フーリエ変換プログラムの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フリープログラムに行く。
トップページに戻る。