喜欢vb ,可惜人已经老,眼也化,精力差了,只能搞个小件玩玩而已。
想用vb ,采集电脑的喇叭波形,经ttf 转换成频谱,取出指定频段的强度。'论坛的FFT变换4 ***    成功案例。20180522,tjw
'Dim xr(128) As Double
'Dim xi(128) As Double
Private Sub Command1_Click()
  Timer1.Enabled = True
End Sub
Private Sub Command2_Click()
  Timer1.Enabled = False
End Sub
Private Sub Command3_Click()
  End
End Sub
Private Sub Form_Load()
 ' Timer1.Enabled = True     '原来的
 'Timer1.Interval = 10
' Picture1.AutoRedraw = True
Timer2.Enabled = True   '作为练习,画sin 函数的,共3行
 Timer2.Interval = 10
 Picture1.AutoRedraw = True
End Sub
Private Sub Timer1_Timer()    ' 原来抄,用随机数。没用,供参考
Dim value As Integer, i As Integer
  Dim pr() As Double
  Dim pi() As Double
  Dim fr() As Double
  Dim fi() As Double
   Randomize
  value = Int(200 * Rnd + (-100))
  List1.AddItem value
  If List1.ListCount > 0 And (List1.ListCount Mod 128 = 0) Then
    Picture1.Cls
    For i = List1.ListCount - 128 To List1.ListCount - 1
      xr(128 - (List1.ListCount - i)) = Val(List1.List(i))
      xi(128 - (List1.ListCount 

解决方案 »

  1.   

    模块代码Option Explicit
    '*模块********************************************************
    'FFT0 数组下标以0开始 FFT1 数组下标以1开始
    'AR() 数据实部         AI() 数据虚部
    'N 数据点数,为2的整数次幂
    'NI 变换方向 1为正变换,-1为反变换
    '*************************************************************
    Public Const Pi = 3.1415926Public Function FFT0(AR() As Double, AI() As Double, N As Integer, ni As Integer)
        Dim i As Integer, j As Integer, k As Integer, L As Integer, M As Integer
        Dim IP As Integer, LE As Integer
        Dim L1 As Integer, N1 As Integer, N2 As Integer
        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)
     
      

  2.   

    三贴之内没法贴完代码了,发个效果截图解馋吧。红色是数据,蓝色是计算出来的频域。
    下面是测试数据的生成代码。
        For i = 0 To 128
        xr(i) = 50 * (Sin(i) + 2 * Sin(2 * i) + 1.2 * Sin(0.2 * i)) '生成几个不同频率的叠加数据
        xi(i) = 0
        Next
    另,到站务区吐了个槽
    https://bbs.csdn.net/topics/392404374
      

  3.   

    长代码只能分几贴上了,不过ffft都是用公开的,就不贴了。
    楼上的效果满意。
    有空在电脑继续
    谢谢