在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 IfEnd 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 FunctionPrivate 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>

浙公网安备 33010602011771号