在VB中运用FFT
窗体上放一个picturebox,名称改为picI_FFT。
在窗体中输入以下代码
Option Explicit '*模块******************************************************** 'FFT0 数组下标以0开始 'AR() 数据实部 AI() 数据虚部 'N 数据点数,为2的整数次幂 'NI 变换方向 1为正变换,-1为反变换 '*************************************************************** 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 '赋值,IaIn(i)是采得的数据。 For i = 0 To 128 IaIn(i) = Sin(i) + 0.5 * Sin(10 * i) xr(i) = 100 * IaIn(i) xi(i) = 0 Next 'FFT变换 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 ' picI_FFT.Line (i, Abs(xi(i)))-(i + 1, Abs(xi(i + 1))), vbBlue ' picI_FFT.Line (i, (xr(i) * xr(i) + xi(i) * xi(i)) \ 128)-(i + 1, (xr(i + 1) * xr(i + 1) + xi(i + 1) * xi(i + 1)) \ 128), vbBlack Next i End Sub |
<Linker : http://bbs.csdn.net/topics/390241865>