窗体上放一个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​