home *** CD-ROM | disk | FTP | other *** search
/ Planet Source Code Jumbo …e CD Visual Basic 1 to 7 / 3_2004-2005.ISO / Data / Zips / Matt_Playe176515722004.psc / FFT / mixer / FFT.bas next >
BASIC Source File  |  2004-07-02  |  2KB  |  76 lines

  1. Attribute VB_Name = "Module3"
  2. 'This module contains the heart of the visualization processing
  3. 'The FFT algorithms are here
  4. 'Special thanks to Murphy McCauley
  5.  
  6. Option Explicit
  7.  
  8. Public Const AngleNumerator# = 6.283185307179
  9. Public Const NumSamples& = 1024
  10. Public Const NumBits& = 10
  11.  
  12. Private ReversedBits&(0 To NumSamples - 1)
  13.  
  14. Sub FFTAudio(RealIn() As Stereo, RealOut() As FFTStereo)
  15. Static ImagOut(0 To NumSamples - 1) As FFTStereo, iScale!(511)
  16. Static i&, j&, k&, n&, BlockSize&, BlockEnd&, Fl&
  17. Static TR!, TI!, AR!, AI!, DeltaAngle#, DeltaAr#, Alpha#, Beta#
  18.   
  19.   If Fl = 0 Then 'Precalc ReversedBits
  20.     Fl = 1: Dim ii&, iii&, jj As Byte, Rev&
  21.     For ii = LBound(ReversedBits) To UBound(ReversedBits)
  22.       iii = ii: Rev = 0
  23.       For jj = 0 To NumBits - 1
  24.         Rev = (Rev * 2) Or (iii And 1): iii = iii \ 2
  25.       Next jj
  26.       ReversedBits(ii) = Rev
  27.     Next ii
  28.     For i = 0 To 511: iScale(i) = (1 + (i ^ 1.2) / 80): Next
  29.   End If
  30.   
  31.   For i = 0 To (NumSamples - 1)
  32.     j = ReversedBits(i)
  33.     RealOut(j).L = RealIn(i).L
  34.     RealOut(j).R = RealIn(i).R
  35.   Next i
  36.   Erase ImagOut: BlockEnd = 1: BlockSize = 2
  37.     
  38.   Do While BlockSize <= NumSamples
  39.     DeltaAngle = AngleNumerator / BlockSize
  40.     Alpha = Sin(0.5 * DeltaAngle)
  41.     Alpha = 2# * Alpha * Alpha
  42.     Beta = Sin(DeltaAngle)
  43.     
  44.     For i = 0 To NumSamples - 1 Step BlockSize
  45.       AR = 1!: AI = 0!
  46.       For j = i To i + BlockEnd - 1
  47.         k = j + BlockEnd
  48.         'Left
  49.         TR = AR * RealOut(k).L - AI * ImagOut(k).L
  50.         TI = AI * RealOut(k).L + AR * ImagOut(k).L
  51.         RealOut(k).L = RealOut(j).L - TR: RealOut(j).L = RealOut(j).L + TR
  52.         ImagOut(k).L = ImagOut(j).L - TI: ImagOut(j).L = ImagOut(j).L + TI
  53.         'Right
  54.         TR = AR * RealOut(k).R - AI * ImagOut(k).R
  55.         TI = AI * RealOut(k).R + AR * ImagOut(k).R
  56.         RealOut(k).R = RealOut(j).R - TR: RealOut(j).R = RealOut(j).R + TR
  57.         ImagOut(k).R = ImagOut(j).R - TI: ImagOut(j).R = ImagOut(j).R + TI
  58.         
  59.         DeltaAr = Alpha * AR + Beta * AI
  60.         AI = AI - (Alpha * AI - Beta * AR)
  61.         AR = AR - DeltaAr
  62.       Next j
  63.     Next i
  64.     
  65.     BlockEnd = BlockSize
  66.     BlockSize = BlockSize * 2
  67.   Loop
  68.   For i = 0 To 354
  69.     With RealOut(i)
  70.       .L = iScale(i) * (.L * .L + RealOut(1023 - i).L * RealOut(1023 - i).L)
  71.       .R = iScale(i) * (.R * .R + RealOut(1023 - i).R * RealOut(1023 - i).R)
  72.     End With
  73.   Next i
  74. End Sub
  75.  
  76.