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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值