Public Shared Sub FFT2(ByRef ReX() As Single, ByRef ImX() As Single, ByVal Length As Int32)
Dim nm1 As Int32 = Length - 1
Dim nd2 As Int32 = Length / 2
Dim m As Int32 = Math.Log(Length) / Math.Log(2)
Dim j As Int32 = nd2
Dim tr, ti As Single
Dim k As Int32
For I As Int32 = 1 To Length - 2
If I < j Then
tr = ReX(j)
ti = ImX(j)
ReX(j) = ReX(I)
ImX(j) = ImX(I)
ReX(I) = tr
ImX(I) = ti
End If
k = nd2
Do While k <= j
j -= k
k /= 2
Loop
j += k
Next
Dim le, jm1 As Single
Dim le2, ip As Single
Dim ur, ui As Single
Dim sr, si As Single
For l As Int32 = 1 To m
le = 2 ^ l
le2 = le / 2
ur = 1
ui = 0
sr = Math.Cos(Math.PI / le2)
si = -Math.Sin(Math.PI / le2)
For j = 1 To le2
jm1 = j - 1
For i As Int32 = jm1 To nm1 Step le
ip = i + le2
tr = ReX(ip) * ur - ImX(ip) * ui
ti = ReX(ip) * ui - ImX(ip) * ur
ReX(ip) = ReX(i) - tr
ImX(ip) = ImX(i) - ti
ReX(i) += tr
ImX(i) += ti
Next
tr = ur
ur = tr * sr - ui * si
ui = tr * si - ui * sr
Next
Next
End Sub