在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 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 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 LongAs 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 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>

posted @ 2013-04-17 01:12  MMLoveMeMM  阅读(488)  评论(0)    收藏  举报