📄 fft.bas
字号:
Attribute VB_Name = "Module1"
Option Explicit
'一维快速傅氏正、逆变换
'定义全程变量
Public xr() As Single '用于FFT或IFFT输入或输出的复数实部数据
Public xi() As Single '用于FFT或IFFT输入或输出的复数虚部数据
Public Sub FFT(ByVal n As Integer, ByVal v As Boolean)
'傅氏变换子程序
'n-采样点数
'v-变换形式:v=True为正变换,v=False值为逆变换
'xr()、xi()-输入数据
'xr()、xi()-输出数据
Dim i As Integer, j As Integer, k As Integer, l As Integer, l1 As Integer, l2 As Integer
Dim wr As Single, wi As Single, a1 As Single, a2 As Single
Dim p1 As Integer, p2 As Integer, t1 As Single, t2 As Single
l1 = n
a2 = 8 * Atn(1#) / n
'蝶形计算
For l = 0 To Log(n + 1) / Log(2) - 1
l2 = l1
l1 = l1 / 2
a1 = 0
For j = 0 To l1 - 1
wr = Cos(a1)
If v Then wi = -Sin(a1) Else wi = Sin(a1)
a1 = a1 + a2
For i = l2 To n Step l2
p1 = i - l2 + j
p2 = p1 + l1
t1 = xr(p1) - xr(p2)
t2 = xi(p1) - xi(p2)
xr(p1) = xr(p1) + xr(p2)
xi(p1) = xi(p1) + xi(p2)
xr(p2) = wr * t1 + wi * t2
xi(p2) = wr * t2 - wi * t1
Next i
Next j
a2 = a2 + a2
Next l
'码位到置
j = 0
l = n / 2
For i = 0 To n - 2
If i < j Then
a1 = xr(j)
a2 = xi(j)
xr(j) = xr(i)
xi(j) = xi(i)
xr(i) = a1
xi(i) = a2
End If
k = l
Do While (k <= j)
j = j - k
k = k / 2
Loop
j = j + k
Next i
'系数
a2 = 1 / Sqr(n)
For i = 0 To n - 1
xr(i) = a2 * xr(i)
xi(i) = a2 * xi(i)
Next i
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -