Option Explicit
Const fftIn = 128
Const Pi = 3.1415926
Public Function FFT0(AR() As Double , AI() As Double , N As Long , ni As Long )
Dim i As Long , j As Long , k As Long , L As Long , M As Long
Dim IP As Long , LE As Long
Dim L1 As Long , N1 As Long , N2 As Long
Dim SN As Double , TR As Double , TI As Double , WR As Double , WI As Double
Dim UR As Double , UI As Double , US As Double
M = NTOM(N)
N2 = N / 2
N1 = N - 1
SN = ni
j = 1
For i = 1 To N1
If i < j Then
TR = AR(j - 1)
AR(j - 1) = AR(i - 1)
AR(i - 1) = TR
TI = AI(j - 1)
AI(j - 1) = AI(i - 1)
AI(i - 1) = TI
End If
k = N2
While (k < j)
j = j - k
k = k / 2
Wend
j = j + k
Next i
For L = 1 To M
LE = 2 ^ L
L1 = LE / 2
UR = 1#
UI = 0#
WR = Cos(Pi / L1)
WI = SN * Sin(Pi / L1)
For j = 1 To L1
For i = j To N Step LE
IP = i + L1
TR = AR(IP - 1) * UR - AI(IP - 1) * UI
TI = AI(IP - 1) * UR + AR(IP - 1) * UI
AR(IP - 1) = AR(i - 1) - TR
AI(IP - 1) = AI(i - 1) - TI
AR(i - 1) = AR(i - 1) + TR
AI(i - 1) = AI(i - 1) + TI
Next i
US = UR
UR = US * WR - UI * WI
UI = UI * WR + US * WI
Next j
Next L
If SN <> -1 Then
For i = 1 To N
AR(i - 1) = AR(i - 1) / N
AI(i - 1) = AI(i - 1) / N
Next i
End If
End Function
Private Function NTOM(N As Long ) As Long
Dim ND As Single
ND = N
NTOM = 0
While (ND > 1)
ND = ND / 2
NTOM = NTOM + 1
Wend
End Function
Private Sub Form_Load()
Dim i As Integer
Dim xr(128) As Double
Dim xi(128) As Double
Dim IaIn(128) As Double
For i = 0 To 128
IaIn(i) = Sin(i) + 0.5 * Sin(10 * i)
xr(i) = 100 * IaIn(i)
xi(i) = 0
Next
Call FFT0(xr(), xi(), 128, 1)
picI_FFT.Scale (0, 100)-(fftIn - 1, -10)
picI_FFT.DrawWidth = 2
For i = 0 To fftIn - 1
picI_FFT.Line (i, Abs(xr(i)))-(i + 1, Abs(xr(i + 1))), vbRed
Next i
End Sub
|