📄 module1.bas
字号:
Attribute VB_Name = "fft"
Type COMPLEX
Real As Single
Cmpx As Single
End Type
Function BitReverse(Index As Integer, BitNo As Integer) As Integer
Dim Temp() As Integer
Dim i As Integer, LL As Integer
ReDim Temp(o To BitNo - 1)
For i = 0 To BitNo - 1
If (Index And 2 ^ i) <> 0 Then
Temp(BitNo - 1 - i) = 1
Else
Temp(BitNo - 1 - i) = 0
End If
Next i
LL = 0
For i = 0 To BitNo - 1
LL = LL + Temp(i) * 2 ^ i
Next i
BitReverse = LL
End Function
Public Function FFT2R(RS() As Single, X() As COMPLEX, ByVal m As Integer)
' Dim RS() As Single
' Dim X() As COMPLEX
Dim W() As COMPLEX
Dim n%
Dim U As COMPLEX, Temp As COMPLEX, Tm As COMPLEX
Dim i%, j%, k%, LL%, Le%, WIndex%
Dim arg#, w_Real, w_Cmpx#, wrecur_Real#, wrecur_Cmpx#, wtemp_Real#
For i = 0 To UBound(RS)
X(i).Real = RS(i)
Next i
n = 2 ^ m
Le = n / 2
ReDim W(0 To Le - 1)
arg = 4# * Atn(1#) / Le
w_Real = Cos(arg): wrecur_Real = w_Real
w_Cmpx = -Sin(arg): wrecur_Cmpx = w_Cmpx
W(0).Real = 1: W(0).Cmpx = 0
For j = 1 To Le - 1
W(j).Real = wrecur_Real
W(j).Cmpx = wrecur_Cmpx
wtemp_Real = wrecur_Real * w_Real - wrecur_Cmpx * w_Cmpx
wrecur_Cmpx = wrecur_Real * w_Cmpx + wrecur_Cmpx * w_Real
wrecur_Real = wtemp_Real
Next j
Le = n
WIndex = 1
For LL = 0 To m - 1
Le = Le / 2
For j = 0 To Le - 1
U = W(j * WIndex)
For i = j To n - 1 Step 2 * Le
Temp.Real = X(i).Real + X(i + Le).Real
Temp.Cmpx = X(i).Cmpx + X(i + Le).Cmpx
Tm.Real = X(i).Real - X(i + Le).Real
Tm.Cmpx = X(i).Cmpx - X(i + Le).Cmpx
X(i + Le).Real = Tm.Real * U.Real - Tm.Cmpx * U.Cmpx
X(i + Le).Cmpx = Tm.Real * U.Cmpx + Tm.Cmpx * U.Real
X(i) = Temp
Next i
Next j
WIndex = 2 * WIndex
Next LL
ReDim fRe(0 To 2 ^ m - 1)
For i = 0 To 2 ^ m - 1: fRe(i) = False: Next i
For i = 1 To n - 2
If Not fRe(i) Then
j = BitReverse(i, m)
fRe(j) = True
Temp = X(j)
X(j) = X(i)
X(i) = Temp
End If
Next i
End Function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -